如何比较DateTime值,考虑到时区?

时间:2015-07-04 12:13:47

标签: c# datetime timezone

我有两个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上找不到一个非常相似的问题。我相信这个问题的答案将会帮助他人。)

2 个答案:

答案 0 :(得分:4)

你说:

  

我有两个DateTime变量。每个都有一个存储在变量中的时区,这样当我使用包含zzz格式的ToString时,我得到一个包含+01:00的字符串。

这是一种常见的误解。 DateTime没有在变量中存储时区。它只有Kind属性,类型为DateTimeKind,可以是UtcLocalUnspecified

调用ToString时,zzz格式说明符使用Kind属性来确定要显示的偏移量。

  • KindDateTimeKind.Utc时,偏移量始终为+00:00

  • KindDateTimeKind.Local时,偏移量是从执行代码的计算机上的本地时区确定的。例如,我的计算机设置为美国太平洋时间,因此偏移量将为-08:00-07:00,具体取决于夏令时是否生效。

  • KindDateTimeKind.Unspecified时,其行为与Local相同。请注意,其他方法会以不同的方式处理Unspecified - 这只是zzz说明符的特定行为。

MSDN actually says

  

因此,建议不要将“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 statemore 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 );