양식 PST/CEST/UTC/등의 시간대가있는 DateTime 구문 분석
문제
나는 다음과 유사한 국제 DateTime 현악기를 구문 분석하려고합니다.
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);
문제는 형식 문자열에서 '...'에 무엇을 사용해야합니까? 보고 사용자 정의 날짜 및 시간 형식 문자열 MSDN 페이지는 PST/CEST/GMT/UTC 양식에서 시간대를 구문 분석 할 수있는 형식 문자열을 나열하지 않는 것 같습니다.
해결책
Afaik 시간대 약어는 인식되지 않습니다. 그러나 약어를 시간대 오프셋으로 바꾸면 괜찮습니다. 예 :
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);
다른 팁
빠른 대답은 할 수 없다는 것입니다.
이유는 다음과 같습니다.
World Timezones의 결정적인 데이터베이스가 있습니다. 여기 이아나.
문제는 3 개 또는 4 개의 문자 약어가 Iana Timezones와 다중 연관성을 가지고 있다는 것입니다. 예를 들어 "AMT"
문화에 따라 다른 것을 의미합니다.
AMT "Armenia Time" Asia UTC + 4 hours
AMT "Amazon Time" South America UTC - 4 hours
당신이 정말로 이것을 다루고 싶다면, 나는 노다 시간 당신을 대표합니다 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
검색 및 교체 경로로 가기로 결정한 경우 약어 사전 (I DID).
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를 사용하고 있다는 것을 알았습니다. 체재문화에 따라 날짜와 시간은 날짜/시간과 시간대를 분리하고 날짜/시간에 문화 방법을 적용하고 시간대를 추가합니다. "CEST"가 다른 문화에 대해 다른 경우, 모든 옵션을 나열하여 변경해야합니다 (아마도 사례 명령문).
2) 날짜/시간을 다른 시간대로 변환하려면 CultureInfo를 사용할 수 없습니다.
나는 읽는 것이 좋습니다 :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
이것은 방법입니다 :
- 문자열 가져 오기 (전제 조건 : 형식 : DDD, DD MMM YYYY HH : MM : SS ZZZ)
- 마지막 공백을 얻으십시오
- 문자열에서 zzz를 제거하지만 zzz의 값을 저장하십시오.
- ZZZ의 조회 오프셋
- 문자열에 오프셋을 추가하십시오
string dateString = reader.ReadContentAsString(); int timeZonePos = dateString.LastIndexOf(' ') + 1; string tz = dateString.Substring(timeZonePos); dateString = dateString.Substring(0, dateString.Length - tz.Length ); dateString += s_timeZoneOffsets[tz]; // https://msdn.microsoft.com/en-us/library/w2sa9yss(v=vs.110).aspx //string es = reader.ReadElementString("pubDate"); this.m_value = System.DateTime.ParseExact(dateString, "ddd, dd MMM yyyy HH:mm zzz", System.Globalization.CultureInfo.InvariantCulture);
~와 함께
private static System.Collections.Generic.Dictionary<string, string> s_timeZoneOffsets =
new System.Collections.Generic.Dictionary<string, string>() {
{"ACDT", "+10:30"},
{"ACST", "+09:30"},
{"ADT", "-03:00"},
{"AEDT", "+11:00"},
{"AEST", "+10:00"},
{"AHDT", "-09:00"},
{"AHST", "-10:00"},
{"AST", "-04:00"},
{"AT", "-02:00"},
{"AWDT", "+09:00"},
{"AWST", "+08:00"},
{"BAT", "+03:00"},
{"BDST", "+02:00"},
{"BET", "-11:00"},
{"BST", "-03:00"},
{"BT", "+03:00"},
{"BZT2", "-03:00"},
{"CADT", "+10:30"},
{"CAST", "+09:30"},
{"CAT", "-10:00"},
{"CCT", "+08:00"},
{"CDT", "-05:00"},
{"CED", "+02:00"},
{"CET", "+01:00"},
{"CEST", "+02:00"},
{"CST", "-06:00"},
{"EAST", "+10:00"},
{"EDT", "-04:00"},
{"EED", "+03:00"},
{"EET", "+02:00"},
{"EEST", "+03:00"},
{"EST", "-05:00"},
{"FST", "+02:00"},
{"FWT", "+01:00"},
{"GMT", "+00:00"},
{"GST", "+10:00"},
{"HDT", "-09:00"},
{"HST", "-10:00"},
{"IDLE", "+12:00"},
{"IDLW", "-12:00"},
{"IST", "+05:30"},
{"IT", "+03:30"},
{"JST", "+09:00"},
{"JT", "+07:00"},
{"MDT", "-06:00"},
{"MED", "+02:00"},
{"MET", "+01:00"},
{"MEST", "+02:00"},
{"MEWT", "+01:00"},
{"MST", "-07:00"},
{"MT", "+08:00"},
{"NDT", "-02:30"},
{"NFT", "-03:30"},
{"NT", "-11:00"},
{"NST", "+06:30"},
{"NZ", "+11:00"},
{"NZST", "+12:00"},
{"NZDT", "+13:00"},
{"NZT", "+12:00"},
{"PDT", "-07:00"},
{"PST", "-08:00"},
{"ROK", "+09:00"},
{"SAD", "+10:00"},
{"SAST", "+09:00"},
{"SAT", "+09:00"},
{"SDT", "+10:00"},
{"SST", "+02:00"},
{"SWT", "+01:00"},
{"USZ3", "+04:00"},
{"USZ4", "+05:00"},
{"USZ5", "+06:00"},
{"USZ6", "+07:00"},
{"UT", "-00:00"},
{"UTC", "-00:00"},
{"UZ10", "+11:00"},
{"WAT", "-01:00"},
{"WET", "-00:00"},
{"WST", "+08:00"},
{"YDT", "-08:00"},
{"YST", "-09:00"},
{"ZP4", "+04:00"},
{"ZP5", "+05:00"},
{"ZP6", "+06:00"}
};
여기 내가해야 할 일이 있습니다.
JavaScript에서 DateTime을받은 다음 Oracle 데이터베이스에 저장하기 위해 ASP.NET으로 전달합니다. 동부 및 중앙 시간에 대한 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);
}