我试图弄清楚如何使用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);
}
这是我在其他帖子中看到的内容,但看起来它只会以错误的方式更改小时。.请帮助。
答案 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