2010-02-10 5 views
3

en utilisant C# Visual Studio 2008.C# trouver même gamme de « jours nommés » de 1 an il y a

Quelqu'un peut-il aider à un algorithme pour le faire s'il vous plaît

si j'ai une gamme de jours sélectionnés pour cette semaine (par exemple du lundi au vendredi) je peux trouver les dates pour ceux-ci en utilisant les fonctions datetime disponibles. Ce que je veux faire est comparé aux données stockées pour la même plage de jours il ya 1 an.

Donc, fondamentalement, j'ai besoin de revenir en arrière 1 an et trouver les dates pour le plus proche lundi à vendredi plage de 1 an auparavant. Je suppose que j'ai aussi besoin de prendre en compte les années bissextiles.

Quelqu'un peut-il aider avec un algorithme approprié sur la façon d'y parvenir. Bien sûr, le jour pour la date d'aujourd'hui l'année dernière ne sera pas le même jour.

merci à l'avance

+0

Est-ce ce devoir? Si non nous montrer ce que vous avez déjà essayé – TFD

Répondre

1

Voici un code qui pourrait faire ce que vous voulez - mais les cas de test montrent qu'il ya des cas d'angle à considérer:

using System; 

public class Test 
{ 
    static void Main() 
    { 
     Console.WriteLine(SameDayLastYear(DateTime.Today)); 
     Console.WriteLine(SameDayLastYear(new DateTime(2010, 12, 31))); 
    } 

    static DateTime SameDayLastYear(DateTime original) 
    { 
     DateTime sameDate = original.AddYears(-1); 
     int daysDiff = original.DayOfWeek - sameDate.DayOfWeek; 
     return sameDate.AddDays(daysDiff); 
    } 
} 

Que voulez-vous que le résultat du deuxième appel soit? Ce code revient le 1er janvier 2010, car il s'agit de la date la plus proche de "il y a un an le même jour".

Je suggère fortement que tout ce que vous allez avec, vous avez des tests unitaires de contrôle des années bissextiles, début et la fin de l'année, etc.

0

Disons que vous sélectionnez Mercredi 10-02-2010 - Vendredi 12-02-2010 cette année. L'année dernière qui aurait été mardi 10-02-2009 - jeudi 12-02-2009.

Ainsi, vous pouvez effectuer les opérations suivantes: Retournez une année en effectuant simplement DateTime.AddYears (-1). Assurez-vous de corriger pour les années bissextiles ici.

Ensuite, vous utilisez .AddDays (1) jusqu'à ce que vous vous retrouviez du mercredi au vendredi. De cette façon, il vous suffit de prendre en compte les années bissextiles à un moment donné et cela devrait produire le résultat dont vous avez besoin.

0

Je viens de soustraire un an puis de revenir en arrière jusqu'à ce que je trouve un lundi. Lastyear finira par être le premier lundi avant cette date l'année dernière

DateTime LastYear = DateTime.Now.AddYears(-1) 
DayOfWeek Check = LastYear.DayOfWeek; 
while (Check != DayOfWeek.Monday) 
{ 
    LastYear = LastYear.addDays(-1); 
    Check = LastYear.DayOfWeek; 
} 
Console.WriteLine("{0}",LastYear); 
0
DateTime now = DateTime.Now; 
    DateTime lastyear = now.AddYears(-1); 

    string dayOfWeek = lastyear.DayOfWeek.ToString(); 

    if (dayOfWeek.Equals("Saturday")) { dayOfWeek = "Friday"; } 
    else if (dayOfWeek.Equals("Sunday")) { dayOfWeek = "Monday"; } 

    Console.WriteLine(dayOfWeek); 
    Console.ReadKey(); 

Obtenez un objet datetime pour l'année dernière, puis utilisez la propriété DayOfWeek.

0

C'était très amusant.

 // today's info 
     DateTime today = DateTime.Now; 
     DayOfWeek today_name = today.DayOfWeek; 
     // this day one year ago 
     DateTime year_ago = today - new TimeSpan(((today.Year - 1) % 4) ? 365 : 366, 0, 0, 0); 
     // find the closest day to today's info's name 
     DayOfWeek today_name_a_year_ago = year_ago.DayOfWeek; 
     DateTime current_range_a_year_ago = year_ago - new TimeSpan(year_ago.DayOfWeek - today_name, 0, 0, 0); 
     Console.WriteLine("Today is {0}, {1}", today_name, today); 
     Console.WriteLine("One year from today was {0}, {1}", today_name_a_year_ago, year_ago); 
     Console.WriteLine("New date range is {0}", current_range_a_year_ago); 

Je vous recommande fortement d'utiliser les fonctions de test intégrées à VS2008 pour vous assurer que vous tenez compte des cas d'angle.

+0

Cela suppose que l'année dernière n'était pas une année bissextile. – Russell

+0

vrai! Je ne sais pas vraiment pourquoi j'ai dit que TimeSpan représenterait l'année bissextile, puisque je soustrais des jours et non des années. Je vais essayer de modifier le code correctement. – Dave

Questions connexes