2008-10-27 5 views
2

J'ai un problème d'arrondi de date étrange que j'espère que quelqu'un peut résoudre. Mon client utilise une semaine de travail qui va du lundi au dimanche. La date du dimanche est considérée comme la fin de la semaine et sert à identifier tous les enregistrements saisis dans une semaine donnée (donc tout élément entré la semaine dernière aura une valeur WEEKDATE de '10/26/2008 ', qui est la date du dimanche). Un petit rebondissement est que les utilisateurs saisissent des enregistrements pour la semaine précédente jusqu'à 11 heures le lundi de la semaine en cours.Comment faire un arrondi de fin de semaine sur un champ de date en C# (sans utiliser LINQ)?

J'ai donc besoin d'une fonction qui commence par DateTime.Now et renvoie la date de fin de semaine (pas de partie horaire) selon les règles ci-dessus. Merci de votre aide. J'ai une solution qui fonctionne, mais je suis trop embarassé pour l'afficher.

Oh, et je ne peux pas utiliser LINQ.

Répondre

4
public DateTime WeekNum(DateTime now) 
{ 
    DateTime NewNow = now.AddHours(-11).AddDays(6); 

    return (NewNow.AddDays(- (int) NewNow.DayOfWeek).Date); 
} 

public void Code(params string[] args) 
{ 

    Console.WriteLine(WeekNum(DateTime.Now)); 
    Console.WriteLine(WeekNum(new DateTime(2008,10,27, 10, 00, 00))); 
    Console.WriteLine(WeekNum(new DateTime(2008,10,27, 12, 00, 00))); 
    Console.WriteLine(WeekNum(new DateTime(2008,10,28))); 
    Console.WriteLine(WeekNum(new DateTime(2008,10,25))); 


} 

Vous pouvez coder en dur DateTime.Now au lieu de transmettre un objet DateTime. Cela rend les tests plus faciles de cette façon.

+0

DayOfWeek est dimanche = 0, lundi = 1, etc.? – MusiGenesis

+0

Cela ne fonctionne pas. Je l'ai juste couru et ça m'a donné hier. – Joel

+0

@Joel: Désolé, posté trop rapidement. La version révisée devrait fonctionner. –

4

Cela passe pour moi aussi:

[Test] 
public void Test() 
{ 
    DateTime sunday = DateTime.Parse("10/26/2008"); 
    DateTime nextSunday = DateTime.Parse("11/2/2008"); 

    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/21/2008"))); 
    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/22/2008"))); 
    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/23/2008"))); 
    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/24/2008"))); 
    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/25/2008"))); 
    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/26/2008"))); 
    Assert.AreEqual(sunday, GetSunday(DateTime.Parse("10/27/2008 10:59 AM"))); 
    Assert.AreEqual(nextSunday, GetSunday(DateTime.Parse("10/27/2008 11:00 AM"))); 
} 

private DateTime GetSunday(DateTime date) 
{ 
    if (date.DayOfWeek == DayOfWeek.Monday && date.Hour < 11) 
     return date.Date.AddDays(-1); 

    while (date.DayOfWeek != DayOfWeek.Sunday) 
     date = date.AddDays(1); 

    return date.Date; 
} 
1
DateTime GetMidnightFollowingSunday() 
{ 
    DateTime now = DateTime.Now; 
    return now.AddDays(7 - (int)now.DayOfWeek).Date; 
} 

Si vous devez commencer la nouvelle semaine après 11 heures Lundi matin, il suffit de soustraire 11 heures à partir de maintenant, mais il est probablement logique de nommer la méthode quelque chose d'autre.

DateTime GetRecordDate() 
{ 
    DateTime nowMinusOffset = DateTime.Now.AddHours(-11); 
    return nowMinusOffset.AddDays(7-(int)nowMinusOffset.DayOfWeek).Date; 
} 
+0

Fermer, mais vous étiez en train de transformer le dimanche actuel en dimanche suivant. – MusiGenesis

Questions connexes