Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 来自奥尔森时区的.NET时区信息_C#_.net_Timezone - Fatal编程技术网

C# 来自奥尔森时区的.NET时区信息

C# 来自奥尔森时区的.NET时区信息,c#,.net,timezone,C#,.net,Timezone,如何将以下内容转换为System.TimeZone或System.TimeZoneInfo { "timeZone": "America/Los_Angeles", "currentOffsetMs": -25200000 } 这是我从第三方web服务获取的数据 我假设偏移量是UTC的差值,我被告知“美国/洛杉矶”是奥尔森时区。Java将其解析为Java时区没有问题,但我需要将其解析为C#TimeZoneInfo对象。将currentOffsetMs转换为小时和剩余分钟后,您可以枚举

如何将以下内容转换为System.TimeZone或System.TimeZoneInfo

{
  "timeZone": "America/Los_Angeles", 
  "currentOffsetMs": -25200000
}
这是我从第三方web服务获取的数据


我假设偏移量是UTC的差值,我被告知“美国/洛杉矶”是奥尔森时区。Java将其解析为Java时区没有问题,但我需要将其解析为C#TimeZoneInfo对象。

将currentOffsetMs转换为小时和剩余分钟后,您可以枚举定义的TimeZoneInfo对象:

foreach (TimeZoneInfo nextZone in TimeZoneInfo.GetSystemTimeZones())
{
    int nextHours = nextZone.BaseUtcOffset.Hours + 24;     // To prevent negative numbers
    int nextMinutes = nextZone.BaseUtcOffset.Minutes;
    if (tzHours == nextHours && tzMinutes == nextMinutes)
    {
        myTimeZoneInfo = nextZone;
        break;
    }
}
有一个“Olson时区到Win32时区”表。在此基础上,我创建了一个很好的小C#helper函数,用于将Olson时区字符串映射到.NET时区信息:

/// <summary>
/// Converts an Olson time zone ID to a Windows time zone ID.
/// </summary>
/// <param name="olsonTimeZoneId">An Olson time zone ID. See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html. </param>
/// <returns>
/// The TimeZoneInfo corresponding to the Olson time zone ID, 
/// or null if you passed in an invalid Olson time zone ID.
/// </returns>
/// <remarks>
/// See http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
/// </remarks>
public static TimeZoneInfo OlsonTimeZoneToTimeZoneInfo(string olsonTimeZoneId)
{
    var olsonWindowsTimes = new Dictionary<string, string>()
    {
        { "Africa/Bangui", "W. Central Africa Standard Time" },
        { "Africa/Cairo", "Egypt Standard Time" },
        { "Africa/Casablanca", "Morocco Standard Time" },
        { "Africa/Harare", "South Africa Standard Time" },
        { "Africa/Johannesburg", "South Africa Standard Time" },
        { "Africa/Lagos", "W. Central Africa Standard Time" },
        { "Africa/Monrovia", "Greenwich Standard Time" },
        { "Africa/Nairobi", "E. Africa Standard Time" },
        { "Africa/Windhoek", "Namibia Standard Time" },
        { "America/Anchorage", "Alaskan Standard Time" },
        { "America/Argentina/San_Juan", "Argentina Standard Time" },
        { "America/Asuncion", "Paraguay Standard Time" },
        { "America/Bahia", "Bahia Standard Time" },
        { "America/Bogota", "SA Pacific Standard Time" },
        { "America/Buenos_Aires", "Argentina Standard Time" },
        { "America/Caracas", "Venezuela Standard Time" },
        { "America/Cayenne", "SA Eastern Standard Time" },
        { "America/Chicago", "Central Standard Time" },
        { "America/Chihuahua", "Mountain Standard Time (Mexico)" },
        { "America/Cuiaba", "Central Brazilian Standard Time" },
        { "America/Denver", "Mountain Standard Time" },
        { "America/Fortaleza", "SA Eastern Standard Time" },
        { "America/Godthab", "Greenland Standard Time" },
        { "America/Guatemala", "Central America Standard Time" },
        { "America/Halifax", "Atlantic Standard Time" },
        { "America/Indianapolis", "US Eastern Standard Time" },
        { "America/Indiana/Indianapolis", "US Eastern Standard Time" },
        { "America/La_Paz", "SA Western Standard Time" },
        { "America/Los_Angeles", "Pacific Standard Time" },
        { "America/Mexico_City", "Mexico Standard Time" },
        { "America/Montevideo", "Montevideo Standard Time" },
        { "America/New_York", "Eastern Standard Time" },
        { "America/Noronha", "UTC-02" },
        { "America/Phoenix", "US Mountain Standard Time" },
        { "America/Regina", "Canada Central Standard Time" },
        { "America/Santa_Isabel", "Pacific Standard Time (Mexico)" },
        { "America/Santiago", "Pacific SA Standard Time" },
        { "America/Sao_Paulo", "E. South America Standard Time" },
        { "America/St_Johns", "Newfoundland Standard Time" },
        { "America/Tijuana", "Pacific Standard Time" },
        { "Antarctica/McMurdo", "New Zealand Standard Time" },
        { "Atlantic/South_Georgia", "UTC-02" },
        { "Asia/Almaty", "Central Asia Standard Time" },
        { "Asia/Amman", "Jordan Standard Time" },
        { "Asia/Baghdad", "Arabic Standard Time" },
        { "Asia/Baku", "Azerbaijan Standard Time" },
        { "Asia/Bangkok", "SE Asia Standard Time" },
        { "Asia/Beirut", "Middle East Standard Time" },
        { "Asia/Calcutta", "India Standard Time" },
        { "Asia/Colombo", "Sri Lanka Standard Time" },
        { "Asia/Damascus", "Syria Standard Time" },
        { "Asia/Dhaka", "Bangladesh Standard Time" },
        { "Asia/Dubai", "Arabian Standard Time" },
        { "Asia/Irkutsk", "North Asia East Standard Time" },
        { "Asia/Jerusalem", "Israel Standard Time" },
        { "Asia/Kabul", "Afghanistan Standard Time" },
        { "Asia/Kamchatka", "Kamchatka Standard Time" },
        { "Asia/Karachi", "Pakistan Standard Time" },
        { "Asia/Katmandu", "Nepal Standard Time" },
        { "Asia/Kolkata", "India Standard Time" },
        { "Asia/Krasnoyarsk", "North Asia Standard Time" },
        { "Asia/Kuala_Lumpur", "Singapore Standard Time" },
        { "Asia/Kuwait", "Arab Standard Time" },
        { "Asia/Magadan", "Magadan Standard Time" },
        { "Asia/Muscat", "Arabian Standard Time" },
        { "Asia/Novosibirsk", "N. Central Asia Standard Time" },
        { "Asia/Oral", "West Asia Standard Time" },
        { "Asia/Rangoon", "Myanmar Standard Time" },
        { "Asia/Riyadh", "Arab Standard Time" },
        { "Asia/Seoul", "Korea Standard Time" },
        { "Asia/Shanghai", "China Standard Time" },
        { "Asia/Singapore", "Singapore Standard Time" },
        { "Asia/Taipei", "Taipei Standard Time" },
        { "Asia/Tashkent", "West Asia Standard Time" },
        { "Asia/Tbilisi", "Georgian Standard Time" },
        { "Asia/Tehran", "Iran Standard Time" },
        { "Asia/Tokyo", "Tokyo Standard Time" },
        { "Asia/Ulaanbaatar", "Ulaanbaatar Standard Time" },
        { "Asia/Vladivostok", "Vladivostok Standard Time" },
        { "Asia/Yakutsk", "Yakutsk Standard Time" },
        { "Asia/Yekaterinburg", "Ekaterinburg Standard Time" },
        { "Asia/Yerevan", "Armenian Standard Time" },
        { "Atlantic/Azores", "Azores Standard Time" },
        { "Atlantic/Cape_Verde", "Cape Verde Standard Time" },
        { "Atlantic/Reykjavik", "Greenwich Standard Time" },
        { "Australia/Adelaide", "Cen. Australia Standard Time" },
        { "Australia/Brisbane", "E. Australia Standard Time" },
        { "Australia/Darwin", "AUS Central Standard Time" },
        { "Australia/Hobart", "Tasmania Standard Time" },
        { "Australia/Perth", "W. Australia Standard Time" },
        { "Australia/Sydney", "AUS Eastern Standard Time" },
        { "Etc/GMT", "UTC" },
        { "Etc/GMT+11", "UTC-11" },
        { "Etc/GMT+12", "Dateline Standard Time" },
        { "Etc/GMT+2", "UTC-02" },
        { "Etc/GMT-12", "UTC+12" },
        { "Europe/Amsterdam", "W. Europe Standard Time" },
        { "Europe/Athens", "GTB Standard Time" },
        { "Europe/Belgrade", "Central Europe Standard Time" },
        { "Europe/Berlin", "W. Europe Standard Time" },
        { "Europe/Brussels", "Romance Standard Time" },
        { "Europe/Budapest", "Central Europe Standard Time" },
        { "Europe/Dublin", "GMT Standard Time" },
        { "Europe/Helsinki", "FLE Standard Time" },
        { "Europe/Istanbul", "GTB Standard Time" },
        { "Europe/Kiev", "FLE Standard Time" },
        { "Europe/London", "GMT Standard Time" },
        { "Europe/Minsk", "E. Europe Standard Time" },
        { "Europe/Moscow", "Russian Standard Time" },
        { "Europe/Paris", "Romance Standard Time" },
        { "Europe/Sarajevo", "Central European Standard Time" },
        { "Europe/Warsaw", "Central European Standard Time" },
        { "Indian/Mauritius", "Mauritius Standard Time" },
        { "Pacific/Apia", "Samoa Standard Time" },
        { "Pacific/Auckland", "New Zealand Standard Time" },
        { "Pacific/Fiji", "Fiji Standard Time" },
        { "Pacific/Guadalcanal", "Central Pacific Standard Time" },
        { "Pacific/Guam", "West Pacific Standard Time" },
        { "Pacific/Honolulu", "Hawaiian Standard Time" },
        { "Pacific/Pago_Pago", "UTC-11" },
        { "Pacific/Port_Moresby", "West Pacific Standard Time" },
        { "Pacific/Tongatapu", "Tonga Standard Time" }
    };

    var windowsTimeZoneId = default(string);
    var windowsTimeZone = default(TimeZoneInfo);
    if (olsonWindowsTimes.TryGetValue(olsonTimeZoneId, out windowsTimeZoneId))
    {
        try { windowsTimeZone = TimeZoneInfo.FindSystemTimeZoneById(windowsTimeZoneId); }
        catch (TimeZoneNotFoundException) { }
        catch (InvalidTimeZoneException) { }
    }
    return windowsTimeZone;
}
//
///将奥尔森时区ID转换为Windows时区ID。
/// 
///奥尔森时区ID。请参阅http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html. 
/// 
///与奥尔森时区ID对应的时区信息,
///如果传入的奥尔森时区ID无效,则返回null。
/// 
/// 
///看http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/zone_tzid.html
/// 
公共静态时区信息OlsonTimeZoneToTimeZoneInfo(字符串olsonTimeZoneId)
{
var olsonWindowsTimes=新字典()
{
{“非洲/班吉”、“中非西部标准时间”},
{“非洲/开罗”、“埃及标准时间”},
{“非洲/卡萨布兰卡”,“摩洛哥标准时间”},
{“非洲/哈拉雷”,“南非标准时间”},
{“非洲/约翰内斯堡”、“南非标准时间”},
{“非洲/拉各斯”,“中非西部标准时间”},
{“非洲/蒙罗维亚”、“格林威治标准时间”},
{“非洲/内罗毕”、“东非标准时间”},
{“非洲/温得和克”,“纳米比亚标准时间”},
{“美国/安克雷奇”,“阿拉斯加标准时间”},
{“美洲/阿根廷/圣胡安”,“阿根廷标准时间”},
{“美洲/亚松森”、“巴拉圭标准时间”},
{“美洲/巴伊亚”,“巴伊亚标准时间”},
{“美国/波哥大”,“南太平洋标准时间”},
{“美洲/布宜诺斯艾利斯”、“阿根廷标准时间”},
{“美洲/加拉加斯”、“委内瑞拉标准时间”},
{“美国/卡宴”,“南非东部标准时间”},
{“美洲/芝加哥”,“中央标准时间”},
{“美洲/奇瓦瓦”,“山区标准时间(墨西哥)”,
{“美洲/库亚巴”,“巴西中部标准时间”},
{“美国/丹佛”,“山区标准时间”},
{“美国/福塔莱萨”,“南非东部标准时间”},
{“美洲/哥达布”、“格陵兰标准时间”},
{“美洲/危地马拉”、“中美洲标准时间”},
{“美国/哈利法克斯”,“大西洋标准时间”},
{“美国/印第安纳波利斯”,“美国东部标准时间”},
{“美国/印第安纳州/印第安纳波利斯”,“美国东部标准时间”},
{“美国/拉巴斯”,“南非西部标准时间”},
{“美国/洛杉矶”,“太平洋标准时间”},
{“美国/墨西哥城”、“墨西哥标准时间”},
{“美洲/蒙得维的亚”,“蒙得维的亚标准时间”},
{“美国/纽约”,“东部标准时间”},
{“美国/诺伦哈”,“UTC-02”},
{“美国/凤凰城”,“美国山地标准时间”},
{“美洲/里贾纳”、“加拿大中部标准时间”},
{“美洲/圣伊莎贝尔”,“太平洋标准时间(墨西哥)”,
{“美洲/圣地亚哥”,“太平洋标准时间”},
{“美洲/圣保罗”,“南美洲东部标准时间”},
{“美国/圣约翰”,“纽芬兰标准时间”},
{“美洲/蒂华纳”,“太平洋标准时间”},
{“南极洲/麦克默多”,“新西兰标准时间”},
{“大西洋/南乔治亚州”、“UTC-02”},
{“亚洲/阿拉木图”、“中亚标准时间”},
{“亚洲/安曼”、“约旦标准时间”},
{“亚洲/巴格达”,“阿拉伯标准时间”},
{“亚洲/巴库”、“阿塞拜疆标准时间”},
{“亚洲/曼谷”、“东南亚标准时间”},
{“亚洲/贝鲁特”、“中东标准时间”},
{“亚洲/加尔各答”,“印度标准时间”},
{“亚洲/科伦坡”、“斯里兰卡标准时间”},
{“亚洲/大马士革”、“叙利亚标准时间”},
{“亚洲/达卡”、“孟加拉国标准时间”},
{“亚洲/迪拜”、“阿拉伯标准时间”},
{“亚洲/伊尔库茨克”,“东北亚-东部标准时间”},
{“亚洲/耶路撒冷”、“以色列标准时间”},
{“亚洲/喀布尔”、“阿富汗标准时间”},
{“亚洲/堪察加半岛”、“堪察加半岛标准时间”},
{“亚洲/卡拉奇”,“巴基斯坦标准时间”},
{“亚洲/加德满都”、“尼泊尔标准时间”},
{“亚洲/加尔各答”,“印度标准时间”},
{“亚洲/克拉斯诺亚尔斯克”,“北亚标准时间”},
{“亚洲/吉隆坡”、“新加坡标准时间”},
{“亚洲/科威特”、“阿拉伯标准时间”},
{“亚洲/马加丹”,“马加丹标准时间”},
{“亚洲/马斯喀特”,“阿拉伯标准时间”},
{“亚洲/新西伯利亚”,“北中亚标准时间”},
{“亚洲/口头”、“西亚标准时间”},
{“亚洲/仰光”,“缅甸标准时间”},
{“亚洲/利雅得”,“阿拉伯标准时间”},
{“亚洲/首尔”、“韩国标准时间”},
{“亚洲/上海”、“中国标准时间”},
{“亚洲/新加坡”、“新加坡标准时间”},
{“亚洲/台北”,“台北标准时间”},
{“亚洲/塔什干”,“西亚标准时间”},
{“亚洲/第比利斯”,“格鲁吉亚标准时间”},
{“亚洲/德黑兰”、“伊朗标准时间”},
{“亚洲/东京”、“东京标准时间”},
{“亚洲/乌兰巴托”,“乌兰巴托标准时间”},
{“亚洲/海参崴”,“海参崴标准时间”},
{“亚洲/雅库茨克”,“雅库茨克标准时间”},
{“亚洲/叶卡捷琳堡”、“叶卡捷琳堡标准时间”},
{“亚洲/埃里温”,“亚美尼亚标准时间”},
{“大西洋/亚速尔群岛”,“亚速尔群岛立场”
private static void LoadMappingsO()
{
    var file = new FileInfo("windowsZones.xml");
    if (!file.Exists)
    {
        return;
    }

    var map = new Dictionary<string, string>();
    using (var reader = file.OpenText())
    {
        var readerSettings = new XmlReaderSettings { XmlResolver = null, ProhibitDtd = false };

        using (var xmlReader = XmlReader.Create(reader, readerSettings))
        {
            var document = new XPathDocument(xmlReader);
            var navigator = document.CreateNavigator();

            var nodes = navigator.Select("/supplementalData/windowsZones/mapTimezones/mapZone");

            while (nodes.MoveNext())
            {
                var node = nodes.Current;
                if (node == null) continue;

                var olsonNames = node.GetAttribute("type", "").Split(' ');
                var windowsName = node.GetAttribute("other", "");
                foreach (var olsonName in olsonNames)
                {
                    if (!map.ContainsKey(olsonName))
                    {
                        map.Add(olsonName, windowsName);
                    }
                }
            }
        }
    }

    using (TextWriter tw = new StreamWriter("dict.txt", false))
    {
        foreach (var key in map.Keys)
        {
            tw.WriteLine(string.Format("{{\"{0}\", \"{1}\"}},", key, map[key]));
        }
    }
}
private static void LoadMappings()
{
    var map = new Dictionary<string, string>();
    var xdoc = XDocument.Load("windowsZones.xml");

    var zones = xdoc.XPathSelectElements("/supplementalData/windowsZones/mapTimezones/mapZone");
    foreach (var zone in zones)
    {
        var olsonNames = zone.Attribute("type")?.Value.Split(' ');
        if (olsonNames == null)
            continue;

        var windowsName = zone.Attribute("other")?.Value;
        if (string.IsNullOrWhiteSpace(windowsName))
            continue;

        foreach (var olsonName in olsonNames)
        {
            map[olsonName] = windowsName;
        }
    }

    using (TextWriter tw = new StreamWriter("dict.txt", false))
    {
        foreach (var key in map.Keys)
        {
            tw.WriteLine($"{{\"{key}\", \"{map[key]}\"}},");
        }
    }
}
    # Download the xml file.
    $xml = [Xml] /// Load the XML content here

    # Parse the fields we want from the XML.
    $mappings1 = $xml.supplementalData.windowsZones.mapTimezones.mapZone | select Type,Other 

    # Extrapolate extra rows for entries that contain more than one IANA name seperated by spaces.
    # Example: |<mapZone other="Alaskan Standard Time" territory="US" type="America/Anchorage America/Juneau America/Nome America/Sitka America/Yakutat"/>
    $mappings2 = $mappings1 | %{
        $mapping = $_
        $_.Type.Split(" ") | %{
            New-Object PSObject -Property @{type = $_; other = $mapping.other}
        }  
    }

    # Remove dup's
    $mappings3 = $mappings2 | sort type -Unique

    # Generate the case statements.
    $mappings3 | %{ [String]::Format("case @""{0}"": return @""{1}"";", $_.Type, $_.Other)}
using NodaTime;
using NodaTime.TimeZones;

...

public TimeZoneInfo GetTimeZoneInfoForTzdbId(string tzdbId)
{
  var mappings = TzdbDateTimeZoneSource.Default.WindowsMapping.MapZones;
  var map = mappings.FirstOrDefault(x =>
      x.TzdbIds.Any(z => z.Equals(tzdbId, StringComparison.OrdinalIgnoreCase)));
  return map == null ? null : TimeZoneInfo.FindSystemTimeZoneById(map.WindowsId);
}