我对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”
答案 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不同,它可以跨多个时区存储本地时间。