2016-03-17 6 views
0

J'ai deux objets DateTimeOffset, qui reviennent comme alors quand les enregistrer:Comparer deux DateTimeOffsets?

TIME 1 (db):  3/17/2016 2:25:37 PM +00:00 
TIME 2 (client): 3/17/2016 2:09:19 PM -04:00 
TIME 2 < TIME 1? False 

Je ne veux pas encombrer ce avec le code, mais la comparaison est faite comme celui-ci (selon MSDN):

bool didUserLoginBeforeSysUpdate = clientLoginTime < lastSystemUpdateTimeFromDb; 

Je pense que mon principal malentendu provient de la prise en compte ou non de l'ajustement du fuseau horaire (+00:00/-04:00) dans la comparaison. Ma compréhension est que cela ne fait pas et compare les heures brutes selon ce SO post.

Cependant, la partie fuseau horaire est ignorée lors des comparaisons. En d'autres termes, chaque heure est convertie en heure GMT/UTC et ceux-ci sont comparés.

Alors, en bref, qu'est-ce que je fais de mal? Pourquoi TIME 2 n'apparaît-il pas plus tôt que TIME 1?

EDIT:

bool didUserLoginBeforeSysUpdate = clientLoginTime.ToUniversalTime() < lastSystemUpdateTimeFromDb.ToUniversalTime(); 

    var didUserLoginBeforeSysUpdateComparison = clientLoginTime.CompareTo(lastSystemUpdateTimeFromDb); 

brkptTIME 1 (db):  3/17/2016 2:25:37 PM +00:00 
TIME 2 (client): 3/17/2016 2:09:19 PM -04:00 
TIME 1 AFTER UTC CONVERSION(db):  3/17/2016 2:25:37 PM +00:00 
TIME 2 AFTER UTC CONVERSION(client): 3/17/2016 6:09:19 PM +00:00 
TIME 2(UTC) < TIME 1(UTC) ? False 
COMPARISON RESULT - is TIME 2 earlier than TIME 1?: 1 Key: Earlier = -1, Same = 0, Later = 1 

On dirait que je suis mal compris comment gagner UTC. Je pensais que 3/17/2016 2:09:19 PM -04:00 signifiait que "l'heure universelle est 14:09:19 pm, et l'heure locale où il a été stocké est 4 heures plus tôt.Par ailleurs, j'ai besoin de poser une question différente, merci pour l'aide les gars

+0

Je pense que vous avez mal compris cette réponse, il dit qu'il convertit les DateTimes UTC, il ne se contente pas jeter le temps de réglage de la zone. L'ajustement se passe automatiquement –

+1

C'est un message très confus - le "chaque date est convertie en GMT/UTC et ceux qui sont comparés" est correct, mais cela contredit le bit "la partie timezone est ignorée" ... –

+1

TIME 2 est plus tard que TIME 1 et c'est aussi le résultat que vous obtenez en faisant la comparaison, par exemple 'false'. Alors qu'est-ce que tu fais mal? Rien, sauf que vous semblez croire que TIME 2 est avant le temps 1. –

Répondre

1

Utilisation SomeDateTimeOffset.Compare(OtherDateTimeOffset) - il convertit explicitement en UTC avant de faire la comparaison.Il retourne moins de zéro si le premier est plus tôt que le second, 0 s'ils sont identiques et plus grand que zéro si le premier est plus tard que le second

Modifier parce que je pense que j'ai mal compris votre objectif, si vous voulez comparer les temps littéraux quel que soit le fuseau horaire, DateTime.Compare(SomeDateTimeOffset.DateTime, OtherDateTimeObject.DateTime) devrait faire ce que vous voulez

+0

J'ai vérifié que les deux comparaisons retournent le même résultat. J'apprécie la réponse malgré tout, comme j'ai vu les docs et je me demandais si je manquais quelque chose, mais oui - les deux méthodes sont les mêmes. – VSO

+0

Je ne vois pas ce qui est gagné en utilisant Compare() au lieu de < or >. ils prennent également en compte les fuseaux horaires. – kai

+0

Je ne pense pas que quelque chose soit gagné. C'est juste une syntaxe différente. Ils renvoient le même résultat, et Compare() est beaucoup plus compliqué parce que vous devez comprendre ce que veut dire la sortie int (au moins autant que je peux dire à partir de testing, voir edit si ennuyé). – VSO

1

Je voudrais convertir la date de ToUniversalTime fois avant de les comparer, de cette façon, il annulera les différences de fuseau horaire.

bool didUserLoginBeforeSysUpdate = clientLoginTime.ToUniversalTime() < lastSystemUpdateTimeFromDb.ToUniversalTime(); 

https://msdn.microsoft.com/en-us/library/system.datetime.touniversaltime(v=vs.110).aspx

+0

Il n'est pas nécessaire de convertir les DTO en DT UTC, les opérateurs>/ kai

+0

L'opérateur

+0

On dirait que les convertir ne fait rien, ils sont toujours le même temps "absolu" - c'est un malentendu de ma part, pas le vôtre . – VSO