C#TryParseExact读取时区

C#TryParseExact读取时区,c#,datetime,C#,Datetime,可能重复: 我有一个日期字符串,格式如下 Fri, 14 Dec 2012 6:52 am PST 我想把它转换成日期时间。我正在使用DateTime.TryParseExact来实现它,但我无法读取时区。如果我将字符串(不带时区)更改为 和使用 DateTime.TryParseExact(DateString, "ddd, dd MMM yyyy h:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None,out dt) 它起

可能重复:

我有一个日期字符串,格式如下

Fri, 14 Dec 2012 6:52 am PST
我想把它转换成日期时间。我正在使用
DateTime.TryParseExact
来实现它,但我无法读取时区。如果我将字符串(不带时区)更改为

和使用

DateTime.TryParseExact(DateString, "ddd, dd MMM yyyy h:mm tt", CultureInfo.InvariantCulture, DateTimeStyles.None,out dt)
它起作用了。 我怎样才能读懂时区

编辑-我从Yahoo气象API(例如)获取数据


谢谢。

PST
不是.NET framework的可解析时区-时区格式说明符需要一个数字偏移量,如
-0800

解决这一问题的一种方法是在尝试解析之前将每个时区转换为其数字表示形式。

我不相信有一种方法可以处理时区(与当前UTC偏移量相反)。即使有,时区缩写也有可能模棱两可,因此它们通常不能作为传达时区信息的方式。不幸的是,它们被广泛使用,当然

我想你最好创建一个从缩写到“best guess time zone”的映射,然后从输入字符串中去掉最后一个空格后的任何内容,并使用它来获得区域


万一有人想知道,我也不会处理这个问题,但我希望在某个时候能取得进展:)

你可以用偏移量替换时区部分:

string DateString = "Fri, 14 Dec 2012 6:52 am PST";
DateTime dt;
bool parsable = DateTime.TryParseExact(
    DateString.Replace("PST", "+2")
    , "ddd, dd MMM yyyy h:mm tt z"
    , CultureInfo.InvariantCulture
    , DateTimeStyles.None
    , out dt);

是的,好吧,这是不可能的,但这不是问题的解决方案。所以我要做的是为阿伦阿拉姆找到一个解决方案:)

这里是(更新:修正时区-/+):

以及返回可解析偏移量的函数:

public static string TimeZoneToOffset(string tz)
    {
        tz = tz.ToUpper().Trim();
        for (int i = 0 ; i < TimeZones.Length ; i++)
        {
            if (((string)((string[])TimeZones.GetValue(i)).GetValue(0)) == tz)
            {
                return ((string)((string[])TimeZones.GetValue(i)).GetValue(1));
            }
        }
        return System.TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).ToString()
        .Replace(":", "").Substring(0, 5);
    }
公共静态字符串时区偏移量(字符串tz)
{
tz=tz.ToUpper().Trim();
对于(int i=0;i
可在此处找到:

希望它能起作用:)
祝你今天愉快

有趣。我正在查看链接,但找不到任何与之匹配的内容。谢谢您提供的信息。@arunalam-是的,
k
z
zz
zzz
格式说明符仅适用于数字时区偏移,而不适用于命名的时区偏移。命名时区没有格式说明符。这可能是最好的选择,但仍然不太好。特别是由于一些缩写词在多个地方使用(例如,澳大利亚、北美和中国使用CST,其偏移量非常不同)。还要记住,人们经常误用日光/标准缩写(例如,当他们实际上在标准时间时说CDT,反之亦然)。你应该看看日期,看看它是否在标准时间和白天@布莱恩赖斯:当然-这就是为什么我特别指出了模糊性。但不幸的是,这是目前我们所能做到的最好的:(啊,对了。我读到这是指日光/标准转换期间的模糊性,但我明白你可能是指两者。我可以为时区创建字典/DB表,但名称中有模糊性。你可能想检查这些值。AEST是+10/11而不是-10/11(毕竟我住在这里)使用AEST天气是很常见的,我们目前在DST或不在DST,因为一些州不遵守它,并且在同一时区(例如,昆士兰和新南威尔士州不遵守,并且他们在同一时区)。因此,在这些情况下,上述时间也将缩短一小时。
    public static string[][] TimeZones = new string[][] {
        new string[] {"ACDT", "+1030", "Australian Central Daylight"},
        new string[] {"ACST", "+0930", "Australian Central Standard"},
        new string[] {"ADT", "-0300", "(US) Atlantic Daylight"},
        new string[] {"AEDT", "+1100", "Australian East Daylight"},
        new string[] {"AEST", "+1000", "Australian East Standard"},
        new string[] {"AHDT", "-0900", ""},
        new string[] {"AHST", "-1000", ""},
        new string[] {"AST", "-0400", "(US) Atlantic Standard"},
        new string[] {"AT", "-0200", "Azores"},
        new string[] {"AWDT", "+0900", "Australian West Daylight"},
        new string[] {"AWST", "+0800", "Australian West Standard"},
        new string[] {"BAT", "+0300", "Bhagdad"},
        new string[] {"BDST", "+0200", "British Double Summer"},
        new string[] {"BET", "-1100", "Bering Standard"},
        new string[] {"BST", "-0300", "Brazil Standard"},
        new string[] {"BT", "+0300", "Baghdad"},
        new string[] {"BZT2", "-0300", "Brazil Zone 2"},
        new string[] {"CADT", "+1030", "Central Australian Daylight"},
        new string[] {"CAST", "+0930", "Central Australian Standard"},
        new string[] {"CAT", "-1000", "Central Alaska"},
        new string[] {"CCT", "+0800", "China Coast"},
        new string[] {"CDT", "-0500", "(US) Central Daylight"},
        new string[] {"CED", "+0200", "Central European Daylight"},
        new string[] {"CET", "+0100", "Central European"},
        new string[] {"CST", "-0600", "(US) Central Standard"},
        new string[] {"EAST", "+1000", "Eastern Australian Standard"},
        new string[] {"EDT", "-0400", "(US) Eastern Daylight"},
        new string[] {"EED", "+0300", "Eastern European Daylight"},
        new string[] {"EET", "+0200", "Eastern Europe"},
        new string[] {"EEST", "+0300", "Eastern Europe Summer"},
        new string[] {"EST", "-0500", "(US) Eastern Standard"},
        new string[] {"FST", "+0200", "French Summer"},
        new string[] {"FWT", "+0100", "French Winter"},
        new string[] {"GMT", "-0000", "Greenwich Mean"},
        new string[] {"GST", "+1000", "Guam Standard"},
        new string[] {"HDT", "-0900", "Hawaii Daylight"},
        new string[] {"HST", "-1000", "Hawaii Standard"},
        new string[] {"IDLE", "+1200", "Internation Date Line East"},
        new string[] {"IDLW", "-1200", "Internation Date Line West"},
        new string[] {"IST", "+0530", "Indian Standard"},
        new string[] {"IT", "+0330", "Iran"},
        new string[] {"JST", "+0900", "Japan Standard"},
        new string[] {"JT", "+0700", "Java"},
        new string[] {"MDT", "-0600", "(US) Mountain Daylight"},
        new string[] {"MED", "+0200", "Middle European Daylight"},
        new string[] {"MET", "+0100", "Middle European"},
        new string[] {"MEST", "+0200", "Middle European Summer"},
        new string[] {"MEWT", "+0100", "Middle European Winter"},
        new string[] {"MST", "-0700", "(US) Mountain Standard"},
        new string[] {"MT", "+0800", "Moluccas"},
        new string[] {"NDT", "-0230", "Newfoundland Daylight"},
        new string[] {"NFT", "-0330", "Newfoundland"},
        new string[] {"NT", "-1100", "Nome"},
        new string[] {"NST", "+0630", "North Sumatra"},
        new string[] {"NZ", "+1100", "New Zealand "},
        new string[] {"NZST", "+1200", "New Zealand Standard"},
        new string[] {"NZDT", "+1300", "New Zealand Daylight"},
        new string[] {"NZT", "+1200", "New Zealand"},
        new string[] {"PDT", "-0700", "(US) Pacific Daylight"},
        new string[] {"PST", "-0800", "(US) Pacific Standard"},
        new string[] {"ROK", "+0900", "Republic of Korea"},
        new string[] {"SAD", "+1000", "South Australia Daylight"},
        new string[] {"SAST", "+0900", "South Australia Standard"},
        new string[] {"SAT", "+0900", "South Australia Standard"},
        new string[] {"SDT", "+1000", "South Australia Daylight"},
        new string[] {"SST", "+0200", "Swedish Summer"},
        new string[] {"SWT", "+0100", "Swedish Winter"},
        new string[] {"USZ3", "+0400", "USSR Zone 3"},
        new string[] {"USZ4", "+0500", "USSR Zone 4"},
        new string[] {"USZ5", "+0600", "USSR Zone 5"},
        new string[] {"USZ6", "+0700", "USSR Zone 6"},
        new string[] {"UT", "-0000", "Universal Coordinated"},
        new string[] {"UTC", "-0000", "Universal Coordinated"},
        new string[] {"UZ10", "+1100", "USSR Zone 10"},
        new string[] {"WAT", "-0100", "West Africa"},
        new string[] {"WET", "-0000", "West European"},
        new string[] {"WST", "+0800", "West Australian Standard"},
        new string[] {"YDT", "-0800", "Yukon Daylight"},
        new string[] {"YST", "-0900", "Yukon Standard"},
        new string[] {"ZP4", "+0400", "USSR Zone 3"},
        new string[] {"ZP5", "+0500", "USSR Zone 4"},
        new string[] {"ZP6", "+0600", "USSR Zone 5"}
        };
public static string TimeZoneToOffset(string tz)
    {
        tz = tz.ToUpper().Trim();
        for (int i = 0 ; i < TimeZones.Length ; i++)
        {
            if (((string)((string[])TimeZones.GetValue(i)).GetValue(0)) == tz)
            {
                return ((string)((string[])TimeZones.GetValue(i)).GetValue(1));
            }
        }
        return System.TimeZone.CurrentTimeZone.GetUtcOffset(DateTime.Now).ToString()
        .Replace(":", "").Substring(0, 5);
    }