为了账号安全,请及时绑定邮箱和手机立即绑定

如何从 UTC 偏移量获取日期时间

如何从 UTC 偏移量获取日期时间

C#
米脂 2022-09-04 17:03:23
我正在尝试弄清楚如何使用UTC偏移值获取实例,无论当前系统是哪个UTC,我都必须获得所需的UTC偏移量。DateTimeDateTime我看到的所有帖子都是关于从中获取UTC字符串数据的,我也看到有一个帖子说如何使用电流计算差异来获得另一个,这似乎不能很好地工作,因为我需要代码才能工作,无论系统使用哪个UTC。DateTimeDateTimeDateTime到目前为止,我尝试过什么: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 回答

?
慕慕森

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 库在任何平台上使用任一组标识符。


查看完整回答
反对 回复 2022-09-04
?
12345678_0001

TA贡献1802条经验 获得超5个赞

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

这是错的吗?

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


查看完整回答
反对 回复 2022-09-04
  • 2 回答
  • 0 关注
  • 80 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信