18

我遇到了将日期时间存储为 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。我在这里想念什么?无论时区如何,它们都应该相同,对吗?

提前非常感谢!

4

5 回答 5

21

我认为您缺少的是DateTime您的语句返回的DateTime.Parse()内容没有时区。它只是一个可以在任何时区的日期和时间。当你打电话时TimeZoneInfo.ConvertTimeToUtc(dt, TimeZoneInfo.Local),你告诉它它从哪个时区开始。所以如果你从中央开始,你会得到一个答案,而如果你从东部开始,你会得到一个早一个小时的答案,UTC。确实,这就是您的代码所显示的。

于 2013-05-20T14:59:39.957 回答
7

有一个类的.ToUniversalTime()方法DateTime

于 2013-05-20T14:56:53.160 回答
2

这是午夜

var dt = DateTime.Parse("1/1/2013");

东部和中部的午夜不是同一个绝对时间。
这就是时区的全部目的。

于 2013-05-20T15:03:18.907 回答
0

当您无法将本地时间转换为 UTC 时,只需删除 index 的最后一个关键字,然后转换为UtcDateTime

NewsDate = DateTimeOffset.Parse(data.NewsDate.Remove(data.NewsDate.LastIndexOf("IST"))).UtcDateTime;
于 2020-05-19T05:27:28.457 回答
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;
}
于 2018-02-11T07:05:26.310 回答