c#将datetime对象转换为iso 8601字符串

use*_*137 9 c# datetime iso8601

我正在尝试将DateTime对象转换为ISO8601字符串,但仍然得到错误的结果.我查看了stackoverflow,但找不到合适的解决方案.

我从日期时间字符串"2017-06-26T20:45:00.070Z"开始,由newtonoft从json反序列化并转换为C#中的DateTime对象,相当于:

var theTime = new DateTime(2017, 6, 26, 20, 45, 00, 70, DateTimeKind.Utc);
Run Code Online (Sandbox Code Playgroud)

现在我需要将时间转换回它的原始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"
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?我希望使用toISOString()来执行js将会执行的操作,这是我在newTime2日期时间格式中列出的内容,但它也没有显示时间.

谢谢!

Mat*_*int 34

注意:

// 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"
Run Code Online (Sandbox Code Playgroud)

一些东西:

  • 不要Z在格式字符串中使用.这不是有效的格式说明符,因此它只被视为要输出的字符.无论.Kind输入日期时间如何设置,它都将出现在每个字符串中.

  • 随着DateTime,使用K-这正确传送.Kind通过附加Z到输出DateTimeKind.Utc,或从UTC胶印DateTimeKind.Local,或什么都没有了DateTimeKind.Unspecified.

  • 虽然它T会作为一个字符输出,因为它不是一个有效的格式说明符,我建议总是明确这些事情,所以更喜欢'T'.

  • 使用fff将始终返回三位小数(毫秒).如果要在零时省略小数,请FFF改用.您的使用sss无效.

  • 传递CultureInfo.InvariantCulture是一种很好的做法,因为它可以帮助您避免当前文化可能使用不同日历系统的问题.例如,ar-SA使用UmAlQuraCalendarISO 8601所要求的公历日历而不是公历.

  • 在您尝试过的代码中,您调用了theTime.UtcNow- 无法编译. UtcNow是静态属性,而不是实例属性.

  • 你也在你的代码中打电话theTime.Date.ToUniveralTime()- 不要那样做. .Date将时间分量设置为零,并且.ToUniversalTime()由于输入值已经有效,因此无效DateTimeKind.Utc.