Разобрать DateTime с часовым поясом формы PST / CEST / UTC / и т. Д.

StackOverflow https://stackoverflow.com/questions/241789

Вопрос

Я пытаюсь проанализировать международную строку даты и времени, похожую на:

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);

Другие советы

Быстрый ответ: вы не можете этого сделать.

<Ч>

Вот почему,

Существует исчерпывающая база данных мировых часовых поясов, ее можно получить в IANA здесь .

Проблема в том, что трех или четырехбуквенные сокращения имеют многозначную связь с часовыми поясами IANA. Например, " AMT " означает разные вещи, в зависимости от о вашей культуре, о том, в какой части мира вы находитесь, и о контексте вашей заявки.

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

Если вы действительно хотите решить эту проблему, я предлагаю использовать Noda Time для представления своего экземпляра s. Вам нужно будет написать код для преобразования сокращений в стандартный часовой пояс 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 

Словарь сокращений, если вы решили пойти по пути поиска и замены (я сделал).

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

Вот как:

<Ол>
  • Получить строку (предварительное условие: формат: ддд, дд ммм гггг чч: мм: сс 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, а затем передаю его в 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);
    }
    
    Лицензировано под: CC-BY-SA с атрибуция
    Не связан с StackOverflow
    scroll top