我有两个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>
答案 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