ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – 为什么没有DateTime.ToString(“R”)和DateTime.TryParseExact往返?

2019-06-11 21:55:23  阅读:284  来源: 互联网

标签:c datetime datetimeoffset


我正在Web服务中实现条件请求.后端可以轻松检索实体的最后修改日期,因此我发送Last-Modified并返回If-Modified-Since. RFC for HTTP Dates指定的格式与“R” format specifier in .NET相同.

问题是DateTime.ToString(“R”)正确地格式化日期,但是将“R”传递给ParseExact不会读回时区(有一个“往返”说明符,“O”,但它不在我需要的格式).这是LinqPad中的一个例子:

DateTime lastModified = new DateTime(2015, 10, 01, 00, 00, 00, DateTimeKind.Utc);
string lastModifiedField = lastModified.ToString("R"); // Thu, 01 Oct 2015 00:00:00 GMT
DateTime ifModifiedSince = DateTime.ParseExact(
   lastModifiedField, "R", CultureInfo.InvariantCulture);

ifModifiedSince.Kind.Dump(); // Unspecified

我当然可以在解析的DateTime上使用方法强制它使用我想要的格式,但是如何让框架使用已经存在的数据呢?

解决方法:

我偶然发现了解释这个问题的参考资料,因此提出并回答了我自己的问题.

source to datetimeparse.cs表示这是一个无法修复兼容性的错误.

// The "r" and "u" formats incorrectly quoted 'GMT' and 'Z', respectively.  We cannot
// correct this mistake for DateTime.ParseExact for compatibility reasons, but we can 
// fix it for DateTimeOffset.ParseExact as DateTimeOffset has not been publically released
// with this issue.

因此,此注释所在的代码由DateTime.ParseExact和DateTimeOffset.ParseExact调用,并且实际上建议DateTimeOffset.ParseExact更正确.实际上,根据choosing between DateTime and DateTimeOffset的文件:

These uses for DateTimeOffset values are much more common than those
for DateTime values. As a result, DateTimeOffset should be considered
the default date and time type for application development.

因此理想的解决方案是切换到DateTimeOffset,但如果仍需要DateTime:

DateTime lastModified = new DateTime(2015, 10, 01, 00, 00, 00, DateTimeKind.Utc);
string lastModifiedField = lastModified.ToString("R");
DateTimeOffset ifModifiedSinceOffset = DateTimeOffset.ParseExact(
   lastModifiedField, "R", CultureInfo.InvariantCulture);
DateTime ifModifiedSince = ifModifiedSinceOffset.UtcDateTime;

ifModifiedSince.Kind.Dump(); // Utc

这正确地将时区标识为GMT / UTC,从而在DateTime上设置正确的属性.

标签:c,datetime,datetimeoffset
来源: https://codeday.me/bug/20190611/1221446.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有