parsingdate时间与PST / CEST / UTC /等forms的时区

我试图parsing国际date时间string类似于:

24-okt-08 21:09:06 CEST 

到目前为止,我有这样的东西:

 CultureInfo culture = CultureInfo.CreateSpecificCulture("nl-BE"); DateTime dt = DateTime.ParseExact("24-okt-08 21:09:06 CEST", "dd-MMM-yy HH:mm:ss ...", culture); 

问题是我应该用什么格式string中的'…'? 查看自定义date和时间格式string MSDN页似乎没有列出用于parsingPST / CEST / GMT / UTCforms的时区的格式string。

AFAIK时区缩写不被识别。 但是,如果您将时区偏移量replace为缩写,则会正常。 例如:

 DateTime dt1 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+2"), "dd-MMM-yy HH:mm:ss z", culture); DateTime dt2 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+02"), "dd-MMM-yy HH:mm:ss zz", culture); DateTime dt3 = DateTime.ParseExact("24-okt-08 21:09:06 CEST".Replace("CEST", "+02:00"), "dd-MMM-yy HH:mm:ss zzz", culture); 

快速的回答是,你不能这样做。


这是为什么,

世界时区有一个明确的数据库,你可以在这里从IANA处获得 。

问题是,3或4个字母缩写与IANA时区有多对一的关系。 例如"AMT"意味着不同的东西,这取决于你的文化或你所处的世界的哪一部分。

 AMT "Armenia Time" Asia UTC + 4 hours AMT "Amazon Time" South America UTC - 4 hours 

如果你真的想解决这个问题,我build议使用野田时间代表你的Instance 。 您将不得不编写一些代码将缩写转换为标准的IANA时区。

我们无法为您做到这一点,这取决于您的应用程序的上下文。


另一个很好的例子是"CST"

 CST "China Standard Time" Asia UTC + 8 hours CST "Central Standard Time" Central America UTC - 6 hours CST "Cuba Standard Time" Caribbean UTC - 5 hours CST "Central Standard Time" North America UTC - 6 hours 

缩写字典,如果你决定去search和replace路线(我做过)。

 Dictionary<string, string> _timeZones = new Dictionary<string, string>() { {"ACDT", "+1030"}, {"ACST", "+0930"}, {"ADT", "-0300"}, {"AEDT", "+1100"}, {"AEST", "+1000"}, {"AHDT", "-0900"}, {"AHST", "-1000"}, {"AST", "-0400"}, {"AT", "-0200"}, {"AWDT", "+0900"}, {"AWST", "+0800"}, {"BAT", "+0300"}, {"BDST", "+0200"}, {"BET", "-1100"}, {"BST", "-0300"}, {"BT", "+0300"}, {"BZT2", "-0300"}, {"CADT", "+1030"}, {"CAST", "+0930"}, {"CAT", "-1000"}, {"CCT", "+0800"}, {"CDT", "-0500"}, {"CED", "+0200"}, {"CET", "+0100"}, {"CEST", "+0200"}, {"CST", "-0600"}, {"EAST", "+1000"}, {"EDT", "-0400"}, {"EED", "+0300"}, {"EET", "+0200"}, {"EEST", "+0300"}, {"EST", "-0500"}, {"FST", "+0200"}, {"FWT", "+0100"}, {"GMT", "GMT"}, {"GST", "+1000"}, {"HDT", "-0900"}, {"HST", "-1000"}, {"IDLE", "+1200"}, {"IDLW", "-1200"}, {"IST", "+0530"}, {"IT", "+0330"}, {"JST", "+0900"}, {"JT", "+0700"}, {"MDT", "-0600"}, {"MED", "+0200"}, {"MET", "+0100"}, {"MEST", "+0200"}, {"MEWT", "+0100"}, {"MST", "-0700"}, {"MT", "+0800"}, {"NDT", "-0230"}, {"NFT", "-0330"}, {"NT", "-1100"}, {"NST", "+0630"}, {"NZ", "+1100"}, {"NZST", "+1200"}, {"NZDT", "+1300"}, {"NZT", "+1200"}, {"PDT", "-0700"}, {"PST", "-0800"}, {"ROK", "+0900"}, {"SAD", "+1000"}, {"SAST", "+0900"}, {"SAT", "+0900"}, {"SDT", "+1000"}, {"SST", "+0200"}, {"SWT", "+0100"}, {"USZ3", "+0400"}, {"USZ4", "+0500"}, {"USZ5", "+0600"}, {"USZ6", "+0700"}, {"UT", "-0000"}, {"UTC", "-0000"}, {"UZ10", "+1100"}, {"WAT", "-0100"}, {"WET", "-0000"}, {"WST", "+0800"}, {"YDT", "-0800"}, {"YST", "-0900"}, {"ZP4", "+0400"}, {"ZP5", "+0500"}, {"ZP6", "+0600"} }; 

我有两个答案,因为我不完全确定你在问什么。

1)我看到你正在使用CultureInfo,所以如果你只是想把date和时间格式化为文化特定的,我会分开date/时间和时区,在date/时间上应用文化方法,并附加时区。 如果“CEST”对于不同的文化背景是不同的,你将不得不通过列出所有选项来改变它(可能在case语句中)。

2)如果您希望将date/时间转换为另一个时区,则不能使用CultureInfo,

我build议阅读: http : //msdn.microsoft.com/en-us/library/ms973825.aspx

您也可以使用.NET Framework 3.5类TimeZoneInfo(与TimeZone不同)来使您的生活更轻松。

http://msdn.microsoft.com/en-us/library/system.timezoneinfo.aspx

这是我必须做的。

我从JavaScript接收date时间,然后将其传递到ASP.NET以存储在Oracle数据库中。 这是我的东部和中央的C#代码。

 string datetimevalue = hidfileDateTime.Value; datetimevalue= datetimevalue.Replace("EDT", "EST"); datetimevalue = datetimevalue.Replace("CDT", "CST"); if (datetimevalue.Contains("CST")) { filedt = DateTime.ParseExact(datetimevalue, "ddd MMM d HH:mm:ss CST yyyy", provider).ToUniversalTime().AddHours(1).ToLocalTime(); } else { filedt = DateTime.ParseExact(datetimevalue, "ddd MMM d HH:mm:ss EST yyyy", provider); }