我正在尝试将 DateTime 对象转换为 ISO8601 字符串,但总是得到错误的结果。我在 stackoverflow 上四处寻找,但找不到合适的解决方案。
我从日期时间字符串“2017-06-26T20:45:00.070Z”开始,它由 newtonsoft 从 json 反序列化并转换为 C# 中的 DateTime 对象,相当于:
var theTime = new DateTime(2017, 6, 26, 20, 45, 00, 70, DateTimeKind.Utc);
现在我需要将那个时间转换回它的原始 UTC 格式字符串以在另一个算法中使用它,但我尝试的每次转换都不会将它返回到那个原始字符串。不知道我做错了什么。
我试过:
var newTime = theTime.UtcNow.ToString("o");
// returns "2017-06-26T00:00:00.0000000Z"
var newTime2 = theTime.Date.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ss.sssZ");
// returns "2017-06-26T00:00:00.00Z"
我做错了什么?我想要等效于 js 使用 toISOString() 所做的事情,这是我在 newTime2 日期时间格式中列出的内容,但它也没有显示时间。
谢谢!
最佳答案
观察:
// Your input
DateTime dt = new DateTime(2017, 6, 26, 20, 45, 0, 70, DateTimeKind.Utc);
// ISO8601 with 7 decimal places
string s1 = dt.ToString("o", CultureInfo.InvariantCulture);
//=> "2017-06-26T20:45:00.0700000Z"
// ISO8601 with 3 decimal places
string s2 = dt.ToString("yyyy-MM-dd'T'HH:mm:ss.fffK", CultureInfo.InvariantCulture);
//=> "2017-06-26T20:45:00.070Z"
一些事情:
不要在格式字符串中使用
Z
。那不是 valid format specifier , 所以它只是作为一个字符来输出。无论输入日期时间的.Kind
设置如何,它都会出现在每个字符串中。对于
DateTime
,使用K
- 通过附加Z
正确传达.Kind
DateTimeKind.Utc
的输出,或DateTimeKind.Local
的 UTC 偏移量,或DateTimeKind.Unspecified
的任何内容。尽管
T
将作为字符输出,因为它不是有效的格式说明符,但我建议始终明确说明这些内容,因此更喜欢'T'
。使用
fff
将始终返回三位小数(毫秒)。如果您希望在零时省略小数点,请改用FFF
。您对sss
的使用无效。传递
CultureInfo.InvariantCulture
是一种很好的做法,因为它可以帮助您避免当前文化可能使用不同日历系统的问题。例如,ar-SA
使用UmAlQuraCalendar
,而不是 ISO 8601 要求的公历。在您尝试的代码中,您调用了
theTime.UtcNow
- 无法编译。UtcNow
是静态属性,不是实例属性。还在您的代码中调用了
theTime.Date.ToUniveralTime()
- 不要那样做。.Date
会将时间分量设置为零,并且.ToUniversalTime()
将无效,因为输入值已经具有DateTimeKind.Utc
。
关于c# 将日期时间对象转换为 iso 8601 字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44788305/