【问题标题】:C# TimeZoneInfo to convert GMT timezone name to system timezoneC# TimeZoneInfo 将 GMT 时区名称转换为系统时区
【发布时间】:2017-11-29 09:20:22
【问题描述】:

在windows中,我们得到这样的时区列表:

ID    Time zone name               Display string
--    --------------               --------------
0     Dateline Standard Time       (UTC-12:00) International Date Line West
110   UTC-11                       (UTC-11:00) Coordinated Universal Time -11
200   Hawaiian Standard Time       (UTC-10:00) Hawaii
300   Alaskan Standard Time        (UTC-09:00) Alaska

更多here.

我使用此列表将一个时区转换为另一个时区,使用 TimeZoneInfo 类,该类接受上面列表中显示的时区名称。

例如。

// Local time zone to UTC
var utcOffset = new DateTimeOffset(DateTime.UtcNow, TimeSpan.Zero);
var localTimeZone = TimeZoneInfo.FindSystemTimeZoneById(timezoneName); // here tz name can be any name from above table
var localOffset = new DateTimeOffset(date.Value, localTimeZone.GetUtcOffset(utcOffset));
DateTime utcDate = localOffset.UtcDateTime;

现在我遇到了 SalesForce 时区表示,例如:

Time Zone Code  Time Zone Name
--------------  --------------
GMT+14:00       Line Is. Time (Pacific/Kiritimati)
GMT+13:00       Phoenix Is.Time (Pacific/Enderbury)
GMT+13:00       Tonga Time (Pacific/Tongatapu)
GMT+12:45       Chatham Standard Time (Pacific/Chatham)

更多here.

我找不到使用上表中给出的time zone codetime zone name 进行转换的内置功能。

【问题讨论】:

  • SalesForce“时区名称”中括号中的部分是 IANA 时区 ID。您必须使用 TimeZoneInfo 吗?我的 Noda Time 项目与 IANA 时区信息很好地集成在一起 - 但如果您对 Windows 时区名称有其他用途,那可能不如仅转换。
  • 如果您只想将 IANA ID 转换为 Windows ID,您可能需要使用 nuget.org/packages/TimeZoneConverter 但请注意,并不总是直接对应,并且数据可能不同。
  • @JonSkeet 谢谢。我对 Windows tz 名称没有任何特定用途。我只需要将 UTC 等效日期保存在数据库中。其中一个外部系统发送带有 Windows tz 名称的信息,我必须将其转换为 UTC 并将其保存到数据库中。其他外部系统在 IANA tz ID 中发送 tz 名称。我需要将其转换为 UTC 并将其保存到 db 中。因此,我一直在寻找同时接受 tz 名称的通用功能。谢谢你的链接。那么使用 Noda,我可以同时处理这两种名称格式吗?
  • @JonSkeet 所以TimeZoneConverter 正是我需要的。我可以将 IANA tz 转换为 Windows tz。将检查您对直接通信的附加评论。您能否将评论作为答案,以便我接受?谢谢。
  • 是的,Noda Time 在完整框架上也支持 BCL 名称。 (现在添加关于TimeZoneConverter 的答案。)

标签: c# .net datetime


【解决方案1】:

如果您乐于使用 TimeZoneInfoDateTime/DateTimeOffset,您可以使用 Matt Johnson 的 TimeZoneConverter 库将 IANA ID(括号中的部分,例如 Pacific/Kiritimati)转换为Windows 系统时区 ID。

来自project page docs的示例:

string tz = TZConvert.IanaToWindows("America/New_York");
// Result:  "Eastern Standard Time"

或者:

TimeZoneInfo tzi = TZConvert.GetTimeZoneInfo("America/New_York");

但是,需要注意的事项:

  • 不会总是存在从 IANA ID 到 Windows ID 的完整映射。有些没有映射,尽管情况比以前好。
  • Windows 时区数据有时可能与 IANA 数据不同。 (再次,这正在变得更好。)
  • 时区数据随时间而变化。如果您要存储 未来 日期/时间值,您可能希望存储时区和本地时间,而不是 UTC 时刻。 (该时刻可能不会映射到未来的同一本地时间。)
  • 某些当地时间可能不明确 - 例如如果时钟在特定时区的特定日期从凌晨 2 点回到凌晨 1 点,则该天的凌晨 1:15 将在该时区出现两次。想想你想如何处理它,然后进行测试。

我个人还是建议使用我的 Noda Time 库,作为处理日期/时间的一种更简洁的方式,但我承认,如果您已经有很多代码处理 DateTime,那可能不是可行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多