我的总部设在英国(目前GMT + 1次).
如果我运行这个:
> DateTime.UtcNow.ToString("R") // Or...
> DateTime.Now.ToUniversalTime().ToString("R")
"Mon, 06 Oct 2014 10:20:00 GMT"
Run Code Online (Sandbox Code Playgroud)
正确答案.
如果我现在运行相同,没有UTC DateTime转换:
> DateTime.Now.ToString("R")
"Mon, 06 Oct 2014 11:20:00 GMT"
Run Code Online (Sandbox Code Playgroud)
打印时间是正确的,但时区错误.我希望相反:
"Mon, 06 Oct 2014 11:20:00" // Or..
"Mon, 06 Oct 2014 11:20:00 BST"
Run Code Online (Sandbox Code Playgroud)
问题:这种行为是设计的吗?我可以获得与"R"格式相同的输出,但是使用正确的时区指示器吗?
它绝对不是一个bug,它是记录在案的行为:
自定义格式字符串是
"ddd, dd MMM yyyy HH':'mm':'ss 'GMT'".使用此标准格式说明符时,格式化或解析操作始终使用不变文化....
虽然RFC 1123标准将时间表示为协调世界时(UTC),但格式化操作不会修改
DateTime正在格式化的对象的值.因此,在执行格式化操作之前,必须DateTime通过调用DateTime.ToUniversalTime方法将值转换为UTC .相反,DateTimeOffset值会自动执行此转换;DateTimeOffset.ToUniversalTime在格式化操作之前无需调用该方法.
正如我在对这个问题的评论中指出的那样,格林尼治标准时间10:20是正确的,假设您在提出问题之前不久就运行了代码:11:20 GMT尚未发生.
所以基本上,当你按照文档中的指导和调用时ToUniversalTime,它做了正确的事情.当你不这样做时,它会产生一种误导性的价值 - 这是不幸的,但却是DateTimeIMO 破碎设计的一部分.
你应该考虑至少使用DateTimeOffset或者可能使用我的Noda Time项目.
| 归档时间: |
|
| 查看次数: |
3128 次 |
| 最近记录: |