C# 具有IDateTimeZoneSource.MapTimeZoneId的Noda时区问题

C# 具有IDateTimeZoneSource.MapTimeZoneId的Noda时区问题,c#,vb.net,timezone,nodatime,C#,Vb.net,Timezone,Nodatime,我正在尝试将Windows转换为IANA时区,下面是大部分时间都有效的代码。但当windows time id=“Turks&Caicos”时,下面的代码返回NULL。我正在使用版本1.3.1 Public Function ConvertID_WindowsToIana(strWindowsZoneID As String) As String If strWindowsZoneID.Equals("UTC", StringComparison.OrdinalIgnor

我正在尝试将Windows转换为IANA时区,下面是大部分时间都有效的代码。但当windows time id=“Turks&Caicos”时,下面的代码返回NULL。我正在使用版本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
这里,当tzi=-4:00特克斯和凯科斯群岛时,在本例中,返回值为空

现在,当我更新到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
问题1:为什么我的第一个代码不适用于“特克斯和凯科斯群岛”

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


p.S:对于东部和许多其他时区,第一个代码片段工作正常。

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");
        }
    }    
}
另一种方法是使用Matt Johnson的软件包,它可以简化一些事情。如果你在其他地方使用野田佳彦时间,坚持使用野田佳彦时间可能是有意义的,但如果你只使用它进行时区ID转换,TimeZoneConverter是一个更好的选择


至于为什么“特克斯和凯科斯群岛”不起作用——我想你的意思是“特克斯和凯科斯群岛标准时间”作为ID。这只是在CLDR v30中引入的CLDR映射数据,它比1.3.1晚了一年发布。如果您更新到1.3.5或1.4.2,这两个版本都可以。

您的意思是更新到2.2.3吗?这是目前的版本。@JonSkeet:我的错。我在我的问题中添加了一个拼写错误部分。与其只注意拼写错误,不如修复它-根本不需要提及3.1.1。完成。有些人不喜欢这样编辑,因为这样会使他们原来的评论过时。无论如何,我做出了改变。:)@我已经在第一个代码片段中添加了我的完整函数。你能看一下吗。我真的很感激。工作得很有魅力!