比较两个DateTimeOffsets?

时间:2016-03-17 14:35:21

标签: c# datetimeoffset

我有两个DateTimeOffset对象,在记录它们时返回如下:

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

我不想用代码混淆这一点,但比较是这样的(根据MSDN):

bool didUserLoginBeforeSysUpdate = clientLoginTime < lastSystemUpdateTimeFromDb;

我认为我的主要误解来自于它是否考虑了比较中的时区调整(+00:00/-04:00)。我的理解是它没有并按照SO post比较原始时间。

  

但是,在进行比较时会忽略时区部分。在   换句话说,每个日期时间都转换为GMT / UTC,那些是   比较。

所以,简而言之,我做错了什么?为什么TIME 2没有显示为早于TIME 1?

编辑:

    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

看起来我误解了UTC如何保存。我认为3/17/2016 2:09:19 PM -04:00意味着“世界时间是下午2:09:19,而当地时间存放时间是4小时。无论如何,我需要问一个不同的问题,感谢帮助人员。” / p>

2 个答案:

答案 0 :(得分:1)

使用SomeDateTimeOffset.Compare(OtherDateTimeOffset) - 在进行比较之前明确转换为UTC。如果第一个早于第二个,则返回小于零,如果它们相同则返回0,如果第一个晚于第二个,则返回大于零。

编辑,因为我认为我误解了你的目标;如果你的意思是比较文字时间而不考虑时区,DateTime.Compare(SomeDateTimeOffset.DateTime, OtherDateTimeObject.DateTime)应该做你想做的事。

答案 1 :(得分:1)

我会在比较它们之前将日期时间转换为ToUniversalTime,这样就可以消除时区差异。

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

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