将本地时间转换为UTC

时间:2013-05-20 14:50:00

标签: c# .net datetime

我遇到了将日期时间存储为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。我在这里错过了什么?无论时区如何,它们应该是一样的,对吗?

提前非常感谢!

5 个答案:

答案 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;