与IDateTimeZoneSource.MapTimeZoneId的Noda时区问题

Unb*_*ble 2 c# vb.net timezone nodatime

我正在尝试将Windows转换为IANA时区,以下是大部分时间都可以使用的代码.但是当windows time id ="Turks&Caicos"时,下面的代码返回NULL.我正在使用NODATIME版本1.3.1

    Public Function ConvertID_WindowsToIana(strWindowsZoneID As String) As String
        If strWindowsZoneID.Equals("UTC", StringComparison.OrdinalIgnoreCase) Then
            Return "Etc/UTC"
        End If

        Dim tzdbSource = NodaTime.TimeZones.TzdbDateTimeZoneSource.[Default]
        Dim tzi = TimeZoneInfo.MapTimeZoneId(strWindowsZoneID)
        Return tzdbSource.CanonicalIdMap(tzi)
    End Function
Run Code Online (Sandbox Code Playgroud)

这里当tzi = -4:00 Turks&Caicos时,在这种情况下返回为NULL.

现在,当我更新到2.2.3版本时,认为它将修复这些内容,但根据文档

在此输入图像描述

现在该函数将"当前字符串的位置"作为参数.

所以我的代码如下所示:

  Public Function ConvertID_WindowsToIana(strWindowsZoneID As String) As String

        Dim tzi = TimeZoneInfo.FindSystemTimeZoneById(strWindowsZoneID)
        Dim tzid = tzdbSource.GetSystemDefaultId(WHAT TO PUT HERE)
        // some logic
    End Function
Run Code Online (Sandbox Code Playgroud)

问题1:为什么我的第一个代码不适用于"特克斯和凯科斯群岛".

问题2:我更新了认为它将解决这个问题,但现在该功能已经消失并被替换,我不知道该使用什么.请帮我.

PS:对于Eastern和许多其他时区,First Code Snippet工作正常.

Jon*_*eet 6

GetSystemDefaultId不会取代所有的功能MapTimeZoneId- 你不想在这里打电话.

相反,tzdbSource.WindowsMapping用来获取一个WindowsZones然后可以用来查找TZDB ID的.这是一些示例代码:

using System;
using NodaTime.TimeZones;

public class Test
{
    static void Main()
    {
        var source = TzdbDateTimeZoneSource.Default;

        string windowsId = "Turks And Caicos Standard Time";

        var mapping = source.WindowsMapping.PrimaryMapping;
        if (mapping.TryGetValue(windowsId, out string tzdbId))
        {
            Console.WriteLine($"Mapped to {tzdbId}");
        }
        else
        {
            Console.WriteLine("Not found");
        }
    }    
}
Run Code Online (Sandbox Code Playgroud)

另一种方法是使用Matt Johnson的TimeZoneConverter软件包,它可以简化一些事情.如果你在其他地方使用Noda Time,那么坚持Noda Time可能是有意义的,但是如果你只是用它来进行时区ID转换,那么TimeZoneConverter是更好的选择.

至于为什么"特克斯和凯科斯群岛"不起作用 - 我认为你的意思是"特克斯和凯科斯标准时间"作为身份证.这只是在CLDR v30中的CLDR映射数据中引入的,该数据在1.3.1之后的一年内发布.如果您更新到1.3.5或1.4.2,这两个都应该没问题.