【问题标题】:How Do I Convert IANA zone + datetime to UTC + Offset using NodaTime如何使用 NodaTime 将 IANA 区域 + 日期时间转换为 UTC + 偏移量
【发布时间】:2015-02-26 19:24:00
【问题描述】:

我有字符串格式的本地时间:“yyyy-MM-dd HH:mm:ss”和那个时间的 IANA 时区(例如“欧洲/伦敦”)。

如何在 C# 中(可能使用 NodaTime)将其转换为 UTC+TimeZone 偏移字符串

例如"yyyy-MM-dd HH:mm:ss+01:00" ?

我什至不知道从哪里开始!

据我所知(恐怕我是升 C 的新手): 我知道我需要将其转换为即时,但无法掌握图书馆。

string dateTime = "2014-12-31 12:30:00";
string IANA = "Europe/London";
Instant instDateTime = NodaTime.Instant.FromDateTimeUtc(Convert.ToDateTime(dateTime));
string outputUTC = string.Format("yyyy-MM-dd HH:mm:ssZ", instDateTime);

感谢 Matt(请参阅下面的答案),我现在拥有了我需要的功能(请注意,我最终需要的是 UTC,而不是日期时间 + 偏移量):

有点担心的是,欧洲/莫斯科是 UTC+04:00,而实际上自 2014 年 10 月 26 日以来是 UTC+03:00。

    static void Main(string[] args)
    {
        string dateTime = "2014-12-31T12:30:00";
        string timeZone = "Europe/Moscow";

        Console.WriteLine(timeZone + " Local time '" + dateTime + "' to Zulu time");
        Console.WriteLine(ConvertIANALocalTimeToZulu(timeZone, dateTime));
        Console.WriteLine();
        Console.WriteLine("Zulu time '" + dateTime + "' to " + timeZone + " local time");
        Console.WriteLine(ConvertZuluTimeToIANALocalTime(timeZone, dateTime));

        Console.ReadLine();
    }

    static string ConvertIANALocalTimeToZulu(string timeZoneIANA, string localDateTime)
    {
        var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss");
        LocalDateTime ldt = pattern.Parse(localDateTime).Value;
        ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZoneIANA]);
        Instant instant = zdt.ToInstant();
        ZonedDateTime zulu = instant.InUtc();
        ////string output = zulu.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture);
        string output = zulu.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);

        return output;
    }

    static string ConvertZuluTimeToIANALocalTime(string timeZoneIANA, string zuluDateTime)
    {
        var pattern = InstantPattern.CreateWithInvariantCulture("yyyy-MM-ddTHH:mm:ss");
        Instant instant = pattern.Parse(zuluDateTime).Value;
        ZonedDateTime zdt = instant.InZone(DateTimeZoneProviders.Tzdb[timeZoneIANA]);
        ////string output = zdt.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture);
        string output = zdt.ToString("yyyy-MM-ddTHH:mm:ss", CultureInfo.InvariantCulture);

        return output;
    }

【问题讨论】:

  • 从发布代码开始。即使是非常糟糕的代码也可以让别人帮助你克服你没有清除的第一个障碍。
  • 表现出体面的努力,有人会帮助你!
  • 我已阅读这篇关于将文本从 IANA 转换为 Windows 的帖子,但我不明白这里发生了什么。 iana to windows time zone conversion
  • @PaulPanayis - 这个问题是关于 IANA 时区系统和 Microsoft Windows 时区系统之间的转换 - 这不是您在帖子中似乎感兴趣的内容。阅读the timezone tag wiki了解更多详情。

标签: c# datetime utc nodatime iana


【解决方案1】:

您的问题不清楚您的意思是原始值是 UTC 还是本地时间。

如果是 UTC,则执行以下操作:

string dateTime = "2014-12-31 12:30:00";
string timeZone = "Europe/London";

var pattern = InstantPattern.CreateWithInvariantCulture("yyyy-MM-dd HH:mm:ss");
Instant instant = pattern.Parse(dateTime).Value;
ZonedDateTime zdt = instant.InZone(DateTimeZoneProviders.Tzdb[timeZone]);
string output = zdt.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture);

如果是当地时间,则改为:

string dateTime = "2014-12-31 12:30:00";
string timeZone = "Europe/London";

var pattern = LocalDateTimePattern.CreateWithInvariantCulture("yyyy-MM-dd HH:mm:ss");
LocalDateTime ldt = pattern.Parse(dateTime).Value;
ZonedDateTime zdt = ldt.InZoneLeniently(DateTimeZoneProviders.Tzdb[timeZone]);
string output = zdt.ToString("yyyy-MM-dd HH:mm:sso<m>", CultureInfo.InvariantCulture);

另外 - 您应该注意,在 12 月,伦敦是格林威治标准时间 (UTC+00:00) - 因此对于您提供的值,任一函数的输出将为 "2014-12-31 12:30:00+00:00"

【讨论】:

  • 嗨,马特,对不起,我不清楚。我开始的时间是当地时间。我实际上希望转换为祖鲁时间,据我所知,这根本不包括偏移量?
  • 感谢您的上述帮助。它全面地回答了我的问题,并为我提供了掌握所有这些所需的开始。
  • 很高兴为您提供帮助。另外,请注意,您可能可以大大简化您的功能。如果您使用的是完整的 ISO8601 格式(使用 T 分隔符),则有像 LocalDateTimePattern.GeneralIsoPattern 这样的属性会有所帮助。此外,如果您计划在没有偏移或Z 的情况下进行格式化,您可以重复使用相同的LocalDateTimePattern 实例来解析 格式,而不是调用ToString。此外,您可能会考虑省略 InUTC 步骤,并直接格式化瞬间 - 因为它在内部已经是 UTC。
  • 关于莫斯科的时区,该更改是在 NodaTime 1.3 发布之后在 tzdb 中进行的。 NodaTime 的嵌入数据不是自我更新的。如in the user guide here 所述,您必须自己使用外部数据进行管理。
猜你喜欢
  • 2012-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-06
  • 2014-02-04
相关资源
最近更新 更多