UTC DateTime转换为美国东部

时间:2017-09-11 11:10:13

标签: c# .net datetime timezone

我对UTC感到困惑,无法在任何地方找到任何内容。

格林威治标准时间为00:00:00

我想将其转换为美国东部标准时间的UTC时间。

我将04:00:00-04作为UTC字符串。

这是我的代码。

string UTCDateTime;
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("US Eastern Standard Time")
DateTime dateTimeOld = new DateTime(2017,09,11,0,0,0);
DateTime dateTime = TimeZoneInfo.ConvertTimeToUtc(dateTimeOld, timeZone);

UTCDateTime = dateTime.ToUniversalTime().ToString("yyyy-MM-dd HH:mm:ss");

var offset = timeZone.GetUtcOffset(dateTime);

UTCDateTime += ((offset < TimeSpan.Zero) ? "-" : "+") + offset.ToString("hh");'

所以我的输出将是一个UTC字符串:“2017-09-11 04:00:00-04”。

这是对的吗?不应该是“2017-09-11 00:00:00-04”

2 个答案:

答案 0 :(得分:2)

使用DateTimeOffset可以更好地处理此用例。

// The source time in UTC
DateTimeOffset utc = new DateTimeOffset(2017, 9, 11, 0, 0, 0, TimeSpan.Zero);

// The time zone for the Eastern US
TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");

// The converted time in the time zone
DateTimeOffset eastern = TimeZoneInfo.ConvertTime(utc, timeZone);

// output in a usable format
Console.WriteLine(eastern.ToString("yyyy-MM-dd HH:mm:ss zzz"));

//=>  2017-09-10 20:00:00 -04:00

一些注意事项:

  • GMT和UTC在这方面的意思相同。说你有GMT并且你想要UTC是荒谬的。如果您指的是特定格式的字符串,请描述格式。 UTC不是字符串格式。

  • "US Eastern Standard Time"条目只能在印第安纳州的某些地方使用。美国东部时区的大多数时区由"Eastern Standard Time"条目表示。如果您有兴趣,请参阅Time in Indiana了解详情。

  • 不要假设所有时区只有几小时的偏移量。许多也被30或45分钟抵消。如果您使用任何这些时区,只显示几小时可能会导致数据错误。

  • 除非源数据确实在计算机的本地时区,否则请避免调用ToUniversalTime

  • 请注意输出。您的代码或您的假设都不正确。美国东部地区落后于 UTC四小时。因此,当它是午夜UTC时,美国东部时间的前一天是20:00(或晚上8:00)。

答案 1 :(得分:1)

你的dateTimeOld是美国东部时间的午夜。

然后使用您的时区将其转换为UTC并输入dateTime。

由于UTC比EST早4小时,这意味着dateTime现在是04:00,使用DateTimeKind.Utc。

然后在分配中将其再次转换为UTCDateTime。但由于它已经是UTC(从您之前的转换),这没有任何作用。因此它会将2017-09-11 04:00:00放入字符串UTCDateTime。

然后您从时区信息中添加时区偏移 - 这没有任何意义。 时区与本地时间相关 - 即dateTimeOld。通过转换为UTC,您可以专门消除时区偏移。

因此要么从dateTimeOld初始化字符串并添加时区偏移量 - 这会给出: 2017-09-11 00:00:00-04

或直接在dateTime中使用UTC时间与&#39; Z&#39;后缀表示UTC(祖鲁时间),所以你得到 2017-09-11 04:00:00Z

这两个都表示同一时间(除非我复制粘贴错误):)

通常,在处理日期时,常见的约定是尽快将数据转换为UTC并在整个程序中保留UTC - 然后在数据显示时转换为本地时间。但您也可以选择使用DateTimeOffset - 与DateTime不同,它可以跨多个时区存储本地时间。