繁体   English   中英

DateTime.ToString()不转换时间

[英]DateTime.ToString() not converting time

看起来时间在转换过程中会自动改变。 我的输入是17:15:25 但是,它转换为13:15:25可能是什么原因?

string testDate = Convert.ToDateTime("2016-03-24T17:15:25.879Z")
                         .ToString("dd-MMM-yyyy HH:mm:ss", CultureInfo.InvariantCulture);

我得到的testDate结果是: 24-Mar-2016 13:15:25

输入中的Z表示UTC时间,但是Convert.ToDateTime的默认行为是将结果转换为本地时间。 如果您查看Convert.ToDateTime("2016-03-30T17:15:25.879Z").Kind您会看到它是Local

我建议使用DateTime.ParseExact ,您可以在其中指定所需的确切行为,例如,保留UTC时间:

var dateTime = DateTime.ParseExact(
    "2016-03-30T17:15:25.879Z",
    "yyyy-MM-dd'T'HH:mm:ss.FFF'Z'",
    CultureInfo.InvariantCulture,
    DateTimeStyles.AdjustToUniversal | DateTimeStyles.AssumeUniversal);
Console.WriteLine(dateTime);      // March 30 2016 17:15 (...)
Console.WriteLine(dateTime.Kind); // Utc

然后,您可以根据需要将该值转换为字符串。

当然,我真的建议用我的野田佳彦时间的项目,而不是,在那里你会解析到任何一个InstantZonedDateTime这将知道它在UTC ...... IMO, DateTime简直是坏 ,正是由于这样那样的问题,你一直在看。

当您将Convert.ToDateTime (内部使用DateTime.Parse )与Z (表示Zulu time )一起使用时,此方法会将当前时区偏移量添加到该DateTime值。

看来您当前的时区现在是UTC -04:00,所以这就是方法返回4小时的原因。

我建议将DateTime.ParseExactAdjustToUniversalAssumeUniversal样式一起使用,以防止在Jon回答时进行Kind转换。

AdjustToUniversal

日期和时间作为世界标准时间(UTC)返回。 如果输入字符串表示本地时间,则通过时区说明符或AssumeLocal ,将日期和时间从本地时间转换为UTC。 如果输入字符串表示UTC时间,则通过时区说明符或AssumeUniversal不会发生转换 如果输入字符串不表示本地时间或UTC时间,则不进行任何转换,并且结果Kind属性为Unspecified

由于CultureInfo.InvariantCulture。 您正在格林威治标准时间转换日期

Convert.ToDateTime("2016-03-24T17:15:25.879Z")

然后将其转换为不变文化中的字符串

ToString("dd-MMM-yyyy HH:mm:ss",CultureInfo.InvariantCulture);

您应该使用DateTime.ParseExact,然后在转换中使用不变的区域性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM