你说:
我有两个 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 说明符的特定行为。
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
此外
正如 Gustav 指出的那样,您可以只使用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,因为这些值可能已被解析为您所在时区的不同 local 时间,即使它们会与太平洋时区的本地时间相同。
使用DateTimeOffset还是比较简单,转换次数少,不受当地时区影响。