我的总部设在英国(目前GMT + 1次)。
如果我这样做:
> DateTime.UtcNow.ToString("R") // Or...
> DateTime.Now.ToUniversalTime().ToString("R")
"Mon, 06 Oct 2014 10:20:00 GMT"
正确答案。
如果我现在运行相同的,没有UTC DateTime转换:
> DateTime.Now.ToString("R")
"Mon, 06 Oct 2014 11:20:00 GMT"
打印时间正确,但时区错误。我希望相反:
"Mon, 06 Oct 2014 11:20:00" // Or..
"Mon, 06 Oct 2014 11:20:00 BST"
问题:这种行为是否符合设计要求?我可以获得与“R”格式相同的输出,但是使用正确的时区指示符吗?
答案 0 :(得分:6)
这绝对不是一个错误,它是documented行为:
自定义格式字符串为
"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
时,它会做正确的事情。当你不这样做时,它会产生一种误导性的价值 - 这是不幸的,但却是DateTime
IMO破碎设计的一部分。
您应该考虑至少使用DateTimeOffset
,或者可能使用我的Noda Time项目。