2016-05-16 3 views
0

Je reçois un DateTime du client: DateTime CurrentTimeOnClient
J'ai un DateTimeOffset que je reçois de la db: DateTimeOffset DateTimeOffsetFromDbComparaison des dates seulement sur DateTime/DateTimeOffset Objets

je dois comparer les deux dates, Indifférence le temps et fuseau horaire. En d'autres termes, je veux juste la date brute des deux objets. J'ai essayé d'utiliser FooDateTimeOffset.DateTime.Date mais il semble au facteur encore dans le temps, donc ce que j'ai maintenant est la suivante:

DateTimeOffset clientDateTimeOffSet = DateTime.SpecifyKind(CurrentTimeOnClient, DateTimeKind.Utc); 
clientDateTimeOffSet = await RemoveTimeComponentFromDateTimeOffset(clientDateTimeOffSet); 
clientDateTimeOffSet = await SetTimeZoneOffsetToZero(clientDateTimeOffSet); 

Et les méthodes helper:

public async Task<DateTimeOffset> SetTimeZoneOffsetToZero(DateTimeOffset dateTimeOffSetObj) 
{ 
    TimeSpan zeroOffsetTimeSpan = new TimeSpan(0, 0, 0, 0, 0); 
    return dateTimeOffSetObj.ToOffset(zeroOffsetTimeSpan); 
} 

public async Task<DateTimeOffset> RemoveTimeComponentFromDateTimeOffset(DateTimeOffset dateTimeOffSetObj) 
{ 
    DateTime dateWithZeroedTime = new DateTime(dateTimeOffSetObj.Year, dateTimeOffSetObj.Month, dateTimeOffSetObj.Day, 0, 0, 0); 
    return dateWithZeroedTime; 
} 

Puis-je nettoyer le DateTimeOffset obj de la db de la même manière (mais évidemment sans avoir besoin de les convertir) et les comparer.

bool foo = dateFromDb > dateFromClient; 

P.S. Je suis conscient que ces questions ont été répondues séparément, mais je voudrais voir si j'ai fait des erreurs flagrantes ou si j'en exagère. (mais encore une fois, la solution suggérée .Date ne semble pas fonctionner).

Edit: @ James

//TESTING 
    var testDateAndTime = new DateTimeOffset(2008, 5, 1, 8, 6, 32,new TimeSpan(1, 0, 0)); 
    //This is just some db object that has a date field that I had on hand 
    var anncmnt = db.Announcements.First(a => a.Id == 13); 

    //CLEAN TIME AND DATE 
    testDateAndTime = testDateAndTime.DateTime.Date; 

    anncmnt.EndDate = testDateAndTime; 
    await db.SaveChangesAsync(); 
    //TESTING 

Db Résultat: 2008-05-01 00:00:00.0000000 -04:00

+1

Pourquoi ces méthodes 'async'? Sans les instructions 'await' qui vont simplement s'exécuter de manière synchrone. – juharr

+0

Notre API est asynchrone, donc nous faisons des asynchrones au cas où nous aurions besoin de les utiliser avec des endpoints asynchrones. Ceux-ci s'exécutent de manière synchrone (par défaut si l'attente n'est pas utilisée) autant que je sache. – VSO

+1

Mais il ne sert à rien de faire quelque chose d'asynchrone si ce n'est pas le cas. Cela donnera à n'importe qui utilisant votre API l'impression que c'est le cas. – juharr

Répondre

1

Oublié UTC. Essayez d'utiliser la méthode SpecifyKind. Il semble donner ce dont vous avez besoin et passe mon test unitaire rapide ci-dessous:

 //TESTING 
     for (var hr = 0; hr < 24; hr++) 
     { 
      var testDateAndTime = new DateTimeOffset(2008, 5, 1, hr, 6, 32, new TimeSpan(1, 0, 0)); 
      var noOffsetDate = DateTime.SpecifyKind(testDateAndTime.Date, DateTimeKind.Utc); 
      Console.WriteLine(noOffsetDate); 
     } 
+0

Fondamentalement, votre réponse efface l'heure, mais pas le décalage horaire. Donc, quand je l'obtiens de DB, il ajuste le temps pour le décalage de fuseau horaire, qui peut jeter la date. – VSO

+0

James, ça a l'air de marcher, merci.Je pensais que cela changerait la date ou l'heure (plutôt que de simplement régler l'offset, ça CONVERTERait en UTC, si vous voyez ce que je veux dire). On dirait que je me trompe bien. Je vais tester plus en profondeur et définitivement revenir à accepter la réponse. – VSO

+0

Super. Je considérerais ceci comme une sorte de réponse «acheteur-méfiez-vous». Vous perdez des informations avec cette conversion, car le champ Date n'était précis que lorsqu'il était examiné avec le contexte d'heure/de décalage d'origine. Dans ce cas, je suppose que vous avez des raisons de savoir à l'avance que les informations de temps/décalage de la base de données sont invalides ou non pertinentes et peuvent être tronquées en toute sécurité. Tester les cas de votre base de données avec DateTimes proche de minuit (dans la plage de décalage) aiderait à en extirper la vérité. –

1

C'est bizarre que le .Date() ne fonctionne pas. C'est quelque chose que j'ai fait dans le passé quand j'ai été confronté à un problème comme celui-ci. J'analyse la chaîne de date datetime puis compare. Donc je fais le code ci-dessous.

dateFromDb = DateTime.Parse(dateFromDb.ToShortDateString()); 
dateFromClient= DateTime.Parse(dateFromClient.ToShortDateString()); 

Ensuite, essayez de le comparer et de voir si cela fonctionne?

+0

Cela semble être une option viable en dernier recours. – VSO