我有两个DateTime
个变量。每个都有一个时区存储在变量中,这样当我ToString
格式包含zzz时,我会得到一个包含+01:00
的字符串。
在设计时我不知道时区是什么,我期待变量彼此具有不同的时区。
我想比较两个DateTime
值,以便我知道哪个值更新。
例如,如果变量A是2015-07-04T02:00:00+03:00
而变量B是2015-07-03T18:00:00-07:00
那么B>甲
我用C#写什么告诉我这个? (我不想使用第三方库。)
(对于SO问题关闭狂热者:我花了几个小时使用谷歌,MSDN和SO进行调查,我很困惑。我在SO上找不到一个非常相似的问题。我相信这个问题的答案将会帮助他人。)答案 0 :(得分:4)
你说:
我有两个DateTime变量。每个都有一个存储在变量中的时区,这样当我使用包含zzz格式的ToString时,我得到一个包含+01:00的字符串。
这是一种常见的误解。 DateTime
没有在变量中存储时区。它只有Kind
属性,类型为DateTimeKind
,可以是Utc
,Local
或Unspecified
。
调用ToString
时,zzz
格式说明符使用Kind
属性来确定要显示的偏移量。
当Kind
为DateTimeKind.Utc
时,偏移量始终为+00:00
。
当Kind
为DateTimeKind.Local
时,偏移量是从执行代码的计算机上的本地时区确定的。例如,我的计算机设置为美国太平洋时间,因此偏移量将为-08:00
或-07:00
,具体取决于夏令时是否生效。
当Kind
为DateTimeKind.Unspecified
时,其行为与Local
相同。请注意,其他方法会以不同的方式处理Unspecified
- 这只是zzz
说明符的特定行为。
因此,建议不要将“zzz”格式说明符与
DateTime
值一起使用。
回到你的问题:
在设计时我不知道时区是什么,我期待变量彼此具有不同的时区。
然后你不能使用DateTime
。您应该使用DateTimeOffset
,因为它会保留特定的时区偏移,而不是使用DateTimeKind
。
例如,如果变量A是2015-07-04T02:00:00 + 03:00,变量B是2015-07-03T18:00:00-07:00,则B> A.我用C#写什么告诉我这个?
DateTimeOffset a = DateTimeOffset.Parse("2015-07-04T02:00:00+03:00");
DateTimeOffset b = DateTimeOffset.Parse("2015-07-03T18:00:00-07:00");
bool result = b > a; // true
另请参阅:DateTime vs DatetimeOffset
<强>此外强>
正如古斯塔夫指出的那样,只要你在比较之前转换回世界时,就可以只使用DateTime
。这项工作归功于DateTime
's hidden fourth state(more here)。在解析期间正确设置状态,并在调用ToUniversalTime
时将其考虑在内。然后比较具有有效的UTC时间来操作。
DateTime A = DateTime.Parse("2015-11-01T01:00:00-07:00");
DateTime B = DateTime.Parse("2015-11-01T01:00:00-08:00");
Console.WriteLine(A.ToUniversalTime().ToString("'A: 'yyyy'-'MM'-'dd hh:mm:ss"));
Console.WriteLine(B.ToUniversalTime().ToString("'B: 'yyyy'-'MM'-'dd hh:mm:ss"));
Console.WriteLine( B.ToUniversalTime() > A.ToUniversalTime() );
Console.WriteLine( B > A );
结果:
A: 2015-11-01 08:00:00
B: 2015-11-01 09:00:00
True
False
如果您的本地时区设置为太平洋时间,您将获得上述结果。但是,如果将其设置为其他内容 - 您可能会获得最后一个结果的True
,因为这些值可能已在您的时区中解析为不同的本地次,即使它们是太平洋时区的相同的当地时间。
使用DateTimeOffset
仍然更简单,转换次数更少,并且不会受到本地时区的影响。
答案 1 :(得分:0)
你试过这个吗?
var A = DateTime.Parse("2015-07-04T02:00:00+03:00");
var B = DateTime.Parse("2015-07-03T18:00:00-07:00");
Console.WriteLine( B > A );