c# 将日期时间对象转换为 iso 8601 字符串

标签 c# datetime iso8601

我正在尝试将 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/

相关文章:

c# - SSIS 在脚本任务中显示变量值

c# - 我怎样才能加快这个从字符串中删除文本的方法?

c# - LINQ Where 使用列表过滤

python - 在python中格式化 "yesterday' s“日期

javascript - 如何在 JavaScript 中处理 DST 和时区

c# - 为什么 Enumerable.Cast 不使用用户定义的转换?

c# - 将日期格式化为特定格式

python - Pandas 根据区域频繁每 5 秒进行一次分组

r - ISO 8601 格式的当前时间

java - 将字符串时间戳转换为符合 ISO 8601 的字符串