【问题标题】:How to get datetime based on timezone offset in c#?如何根据 c# 中的时区偏移量获取日期时间?
【发布时间】:2020-07-07 15:37:11
【问题描述】:

在 c# 中,我这样做

DateTime.Now.ToString("yyyy-dd-M--HH-mm-ss")

但它让我获得了服务器时间。但是我也有这种格式的偏移量,例如"-04:00"。如何结合偏移量来获取当地时间?

谢谢

【问题讨论】:

  • 你能分享你的代码,它处理偏移量吗?可以加减偏移值

标签: c# timezone


【解决方案1】:

如果您的意思是要获取包​​括偏移量在内的服务器系统本地时间,请使用DateTimeOffset.Now 属性。然后根据需要对其进行格式化。

DateTimeOffset.Now.ToString("yyyy-MM-dd HH:mm:ss zzz")

The zzz specifier 将偏移量生成为您要求的 ISO 8601 扩展格式的字符串。

如果您的意思是您有一个来自其他地方的 UTC 偏移量,并且您想将其应用于服务器的当前 UTC 时间,那么请改为执行以下操作:

TimeSpan offset = TimeSpan.Parse("-04:00");
DateTimeOffset now = DateTimeOffset.UtcNow.ToOffset(offset);
string result = now.ToString("yyyy-MM-dd HH:mm:ss zzz");

这需要当前服务器时间,并应用ToOffset 函数来调整您提供的偏移量。

请记住,偏移量与时区不同。您拥有的偏移量可能是当前日期和时间的偏移量,或者可能是该时区中的某个其他日期和时间的偏移量。例如,美国东部时间在夏令时是 UTC-4,但在标准时间是 UTC-5。请参阅the timezone tag wiki 中的“时区!= 偏移量”。

【讨论】:

  • 问题是偏移量是由客户端提供的,例如"-04:00",它与系统时区不同,所以我需要考虑这一点。
  • @omega Matt 的回答仍然是正确的。 DateTime 和 DateTimeOffse 都可以很好地解析该偏移格式。 DareTimeOffset限于系统时区,它显式存储偏移量
  • 从客户端,我得到了来自 javascript new Date() 的时区偏移量,这是否考虑到你最后提到的夏令时?
  • 如果你正在做new Date().getTimeZoneOffset() - 那将是 current 偏移量。您可以如上所述将其应用于“现在”,但您不能简单地将其存储在数据库中并再次使用它以应用于不同的日期时间。更全面的方法是使用Intl.DateTimeFormat().resolvedOptions().timeZone 从浏览器获取用户的 IANA 时区 ID。存储该字符串。将它与System.TimeZoneInfo 对象和我的TimeZoneConverter 库一起使用,或者与Noda Time 一起使用。
  • 我昨天发布的示例展示了如何在 C# 中使用 IANA 时区 ID 来获取当前时间:stackoverflow.com/a/62761358/634824
【解决方案2】:

这行得通。

DateTime.UtcNow.AddHours(DateTimeOffset.Parse("01/01/0001 00:00:00 -04:00").Offset.TotalHours).ToString("yyyy-dd-M--HH-mm-ss")

【讨论】:

  • 只是偶然。首先,这是一种本地化格式,如果服务器区域设置不匹配,这将失败。别介意美国与欧盟的差异。 C# 具有用于处理偏移的特定 DateTimeOffest 类型。您应该使用 ISO8601 格式以避免失败或更糟糕的错误日期。 4/7可豆4月7日或7月4日
【解决方案3】:

这应该可行

DateTime.UtcNow.AddHours(DateTimeOffset.Parse("01/01/0001 00:00:00 -04:00").Offset.TotalHours).ToString("yyyy-dd-M--HH-mm-ss",CultureInfo. InvariantCulture);

需要添加指令

using System.Globalization;

【讨论】:

  • 如何将"-04:00" 转换为-4?
  • 需要DateTime.UtcNow
  • .CultureInfo. InvariantCulture 是干什么用的?
  • 它是DateTime.ToString的FormatProvider
猜你喜欢
  • 2018-03-15
  • 1970-01-01
  • 2021-01-20
  • 2021-06-11
  • 2021-10-03
  • 2018-06-30
  • 2017-12-13
  • 2021-12-19
  • 1970-01-01
相关资源
最近更新 更多