[英]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
然后,您可以根据需要将该值转换为字符串。
当然,我真的建议用我的野田佳彦时间的项目,而不是,在那里你会解析到任何一个Instant
或ZonedDateTime
这将知道它在UTC ...... IMO, DateTime
简直是坏 ,正是由于这样那样的问题,你一直在看。
当您将Convert.ToDateTime
(内部使用DateTime.Parse
)与Z
(表示Zulu time )一起使用时,此方法会将当前时区偏移量添加到该DateTime值。
看来您当前的时区现在是UTC -04:00,所以这就是方法返回4小时的原因。
我建议将DateTime.ParseExact
与AdjustToUniversal
和AssumeUniversal
样式一起使用,以防止在Jon回答时进行Kind
转换。
日期和时间作为世界标准时间(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.