2 回答
TA贡献1856条经验 获得超17个赞
要以特定偏移量(例如 UTC-4)获取当前时间,最简单的方法(恕我直言)是:DateTime
DateTime dt = DateTimeOffset.UtcNow.ToOffset(TimeSpan.FromHours(-4)).DateTime;
获得相同结果的另一种(更混乱)方法是:
DateTime dt = DateTime.SpecifyKind(DateTime.UtcNow.AddHours(-4), DateTimeKind.Unspecified);
也可以将其保留为 ,这样与UTC的偏移量就不会丢失。DateTimeOffset
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);
但是,在大多数情况下,人们可能不是使用固定的偏移量,而是在特定时区中查找时间,由于夏令时和特定政府观察到的标准时间的变化,该时区可能具有各种不同的偏移量,具体取决于所讨论的日期。
另请参阅时区标签 wiki 中的“时区 != 偏移量”。
在 .NET 中,类可以为您管理此类更改。在Windows上,它使用Microsoft时区标识符,在Linux或Mac OSX上,它使用IANA时区标识符。例如:TimeZoneInfo
// 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 偏移量(UTC-5 表示 EST 或 UTC-4 表示 EDT)。
这些也可以使用值编写: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 库在任何平台上使用任一组标识符。
- 2 回答
- 0 关注
- 80 浏览
添加回答
举报