我遇到了将日期时间存储为UTC的问题,并且混淆了为什么在更改时区时不会产生相同的结果:
var dt = DateTime.Parse("1/1/2013");
MessageBox.Show(TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local).ToString());
我手动在东部和中部之间的机器上切换我的本地时区。
中央收益率1/1/2013 6:00:00 AM
和东部收益率1/1/2013 5:00:00 AM
。我在这里错过了什么?无论时区如何,它们应该是一样的,对吗?
提前非常感谢!
答案 0 :(得分:12)
我认为您遗失的是DateTime
声明返回的DateTime.Parse()
并未附带时区。它只是一个可以在任何时区的日期和时间。当你拨打TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local)
时,你告诉它它开始的时区。所以如果你从中心开始,你会得到一个答案,而如果你从东部开始,你会得到一个小时前的答案, 世界标准时间。实际上,这就是您的代码所显示的内容。
答案 1 :(得分:3)
.ToUtc()
类
DateTime
方法
答案 2 :(得分:2)
这是午夜
var dt = DateTime.Parse("1/1/2013");
东部和中部的午夜绝对时间不一样
这就是时区的全部目的。
答案 3 :(得分:0)
您可以使用NodaTime:
static string LocalTimeToUTC(string timeZone, string localDateTime)
{
var pattern = LocalDateTimePattern.CreateWithInvariantCulture("dd/MM/yyyy HH:mm:ss");
LocalDateTime ldt = pattern.Parse(localDateTime).Value;
ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]);
Instant instant = zdt.ToInstant();
ZonedDateTime utc = instant.InUtc();
string output = utc.ToString("dd/MM/yyyy HH:mm:ss", CultureInfo.InvariantCulture);
return output;
}
答案 4 :(得分:0)
当您无法将本地时间转换为UTC时,只需删除index的最后一个关键字,然后再转换为UtcDateTime
NewsDate = DateTimeOffset.Parse(data.NewsDate.Remove(data.NewsDate.LastIndexOf("IST"))).UtcDateTime;