如何从UTC偏移量获取DateTime

时间:2019-02-12 04:02:39

标签: c# datetime

我试图弄清楚如何使用UTC偏移量值获取DateTime实例,无论当前系统是哪个UTC,我都必须获取所需UTC偏移量的DateTime。 / p>

我见过的所有帖子都是关于从DateTime获取UTC字符串数据的,而且我也看到有一篇帖子说如何通过计算差异来获取其他DateTime使用当前的DateTime似乎效果不佳,因为无论系统使用哪个UTC,我都需要代码正常工作。

到目前为止,我已经尝试过:

public static void Main(string[] args) {
    DateTime utcDateTime = DateTime.UtcNow;
    TimeSpan offSet = TimeSpan.FromHours((double)-4.00); // UTC-4
    DateTime newDateTime = utcDateTime.Add(offSet);

    Console.WriteLine(newDateTime);
}

这是我在其他帖子中看到的内容,但看起来它只会以错误的方式更改小时。.请帮助。

2 个答案:

答案 0 :(得分:2)

要以DateTime作为特定偏移量(例如UTC-4)来获取当前时间,最简单的方法(IMHO)为:

DateTime dt = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(-4)).DateTime;

获得相同结果的另一种(信使)方法是:

DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.AddHours(-4), DateTimeKind.Unspecified);

也可以将其保留为DateTimeOffset,这样就不会丢失UTC的偏移量。

DateTimeOffset dto = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(-4));

或者更混乱的方式:

TimeSpan offset = TimeSpan.FromHours(-4);
DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.Add(offset), DateTimeKind.Unspecified);
DateTimeOffset dto = new DateTimeOffset(dt, offset);

但是,在大多数情况下,可能无法使用固定的偏移量,而是在特定时区中寻找时间,具体取决于所考虑的日期,该偏移量可能有多种不同的偏移量,这是由于夏令时和特定政府遵守的标准时间的变化。

另请参见the timezone tag wiki中的“时区!=偏移”。

在.NET中,TimeZoneInfo类可以为您管理此类更改。在Windows上,它使用Microsoft时区标识符,在Linux或Mac OSX上,它使用IANA时区标识符。例如:

// On Windows:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime dt = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);

// On Linux/OSX:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
DateTime dt = TimeZoneInfo.ConvertTime(DateTime.UtcNow, tz);

在两个示例中,将应用正确的UTC偏移量(用于EST的UTC-5或用于EDT的UTC-4)。

这些也可以使用DateTimeOffset值编写:

// On Windows:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTimeOffset dto = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tz);

// On Linux/OSX:
TimeZoneInfo tz = TimeZoneInfo.FindSystemTimeZoneById("America/New_York");
DateTimeOffset dto = TimeZoneInfo.ConvertTime(DateTimeOffset.UtcNow, tz);

另外,如果您需要编写可在任何平台上运行的代码,则可以使用我的TimeZoneConverter库在任何平台上使用任何一组标识符。

答案 1 :(得分:1)

为什么所有人都给出如此复杂的答案?

这是错吗?

DateTime.UtcNow.AddHours(-4); //UTC-4