我对UTC感到困惑,在任何地方都找不到任何东西。
我的GMT时间为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"
使用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"
条目表示。如果您有兴趣,请参阅印第安纳州的时间以获取更多详细信息。不要以为所有时区都只有数小时的抵销。许多也被抵消30或45分钟。如果您使用任何一个时区,则仅显示小时可能会导致数据错误。
避免调用
ToUniversalTime
,除非源数据确实在计算机的本地时区域。注意输出。您的代码或假设都不正确。美国东部是四个小时 utc。因此,当是午夜UTC时,在美国东部时间的前一天是20:00(或8:00 pm)。
您的dateTimeold是est。
的午夜然后,您使用时区将其转换为UTC并放入DateTime。
由于UTC比EST提前4小时,这意味着DateTime现在使用DateTimeKind.utc。
04:00您然后在分配中再次将其转换为UTCDATETIME。但是由于已经是UTC(从您以前的转换来看),这无济于事。因此,它将将2017-09-11 04:00:00放入字符串UTCDATETIME。
您然后添加时区信息中的时区偏移量 - 这是没有意义的。时区与本地时间关联 - 是DateTimeOld。通过转换为UTC,您特别摆脱了时区偏移。
因此,要么初始化datetimeold的字符串,然后添加时区偏移 - 这将给出:2017-09-11 00:00:00-04
或直接使用" Z"后缀直接在DateTime中使用UTC时间来指示UTC(Zulu Time),因此您可以获得2017-09-11 04:00:00z
这两个都表示同一时间(除非我复制了错误的东西):)
通常,在处理日期时,共同的约定是将数据尽快转换为UTC并在整个程序中保留UTC,然后在显示数据时转换为当地时间。但是您也可以选择使用dateTimeOffset - 它可以不同,与DateTime不同,可以在多个时区存储本地时间。