Разбор французской даты - PullRequest
4 голосов
/ 01 июня 2010

Я пытаюсь проанализировать французскую дату для объекта DateTime, но пока безуспешно.Есть ли способ сделать это?

String foo = "mar, 20 avr 2010 09:00:00 -0500";

Я уже пытался разобрать другую культуру и изменить культуру потока.

System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-CA",true);
CultureInfo culture = new CultureInfo("fr-CA",true);
DateTime.Parse(foo,culture,DateTimeStyles.AdjustToUniversal);

Ответы [ 3 ]

6 голосов
/ 01 июня 2010

Вы можете только проанализировать (с помощью Parse или ParseExact) то, что вы можете создать при форматировании DateTime.

Ближайший спецификатор пользовательского формата к вашему примеру ввода, вероятно, выглядит примерно так:

ддд, дд МММ гггг ЧЧ ':' мм ':' ss zzz

Код:

CultureInfo culture = new CultureInfo("fr-CA", true);

var f = new DateTimeOffset(2010, 04, 20, 09, 00, 00, TimeSpan.FromHours(-5))
            .ToString("ddd, dd MMM yyyy HH':'mm':'ss zzz", culture);

Это дает следующий результат:

"mar., 20 avr. 2010 09:00:00 -05:00"

Как видите, спецификатор короткого дня и короткого месяца (ddd и MMM) добавляет . после имени, а спецификатор часового пояса (zzz) вставляет :.

Полагаю, что ToString невозможно заставить сгенерировать желаемый результат и, следовательно, не анализировать результат с ParseExact. Я полагаю, что вам нужно разобрать строку самостоятельно, используя обычные манипуляции со строкой.

3 голосов
/ 01 июня 2010

Самое близкое, я думаю, вы получите

DateTime.ParseExact("mar., 01 juin 2010 12:11:53 -04:00", "ddd, dd MMM yyyy hh:mm:ss zzz", culture); // extra period after "mar"
// or
DateTime.ParseExact("mardi, 01 juin 2010 12:12:33 -04:00", "dddd, dd MMM yyyy hh:mm:sszzz", culture ); // full day name

Почему DateTime.Parse не работает:

Документация для DateTime.Parse говорит, что

Параметр s должен содержать представление даты и времени в один из форматов, возвращаемых DateTimeFormatInfo.GetAllDateTimePatterns () метод современной культуры.

На моем компьютере, используя этот код, я получаю следующие форматы. Похоже, вашего паттерна нет в списке.

    CultureInfo culture = new CultureInfo("fr-CA", true);

    foreach( string dateTimePattern in culture.DateTimeFormat.GetAllDateTimePatterns())
    {
        Debug.WriteLine(dateTimePattern);
    }
  • YYYY-MM-дд
  • дд-ММ-уу
  • гг ММ дд
  • дд / ММ / ГГ
  • д ММММ гггг
  • д МММ гггг
  • д ММММ гггг ЧЧ: мм
  • д ММММ гггг Ч: мм
  • д ММММ гггг ч 'ч' мм
  • д МММ гггг ЧЧ: мм
  • д МММ гггг Ч: мм
  • д МММ гггг ч 'ч' мм
  • д ММММ гггг ЧЧ: мм: сс
  • д ММММ гггг Ч: мм: сс
  • д ММММ гггг ч 'ч' мм
  • д ММММ гггг Ч: мм
  • д МММ гггг ЧЧ: мм: сс
  • д МММ гггг Ч: мм: сс
  • д МММ гггг ч 'ч' мм
  • д МММ гггг Ч: мм
  • гггг-мм-дд ЧЧ: мм
  • гггг-мм-дд Ч: мм
  • гггг-мм-дд ч 'ч' мм
  • гг-мм-дд ЧЧ: мм
  • гг-мм-дд Ч: мм
  • гг-мм-дд ч 'ч' мм
  • дд-мм-гг ЧЧ: мм
  • дд-мм-гг Ч: мм
  • дд-мм-гг ч 'ч' мм
  • гг ММ дд ЧЧ: мм
  • гг ММ дд Ч: мм
  • ггг ММ дд Ч 'мм
  • дд / мм / гг ЧЧ: мм
  • дд / мм / гг Ч: мм
  • дд / мм / гг ч 'ч' мм
  • гггг-мм-дд чч: мм: сс
  • гггг-мм-дд Ч: мм: сс
  • гггг-мм-дд ч 'ч' мм
  • гггг-мм-дд Ч: мм
  • гг-мм-дд ЧЧ: мм: сс
  • гг-мм-дд Ч: мм: сс
  • гг-мм-дд ч 'ч' мм
  • гг-мм-дд Ч: мм
  • дд-мм-гг ЧЧ: мм: сс
  • дд-мм-гг Ч: мм: сс
  • дд-мм-гг ч 'ч' мм
  • дд-мм-гг Ч: мм
  • ггг ММ дд ЧЧ: мм: сс
  • ггг ММ дд Ч: мм: сс
  • ггг мм дд ч 'ч' мм
  • гг ГМ дд Ч: мм
  • дд / мм / гг ЧЧ: мм: сс
  • дд / мм / гг Ч: мм: сс
  • дд / мм / гг ч 'ч' мм
  • дд / мм / гг Ч: мм
  • д ММММ
  • д ММММ
  • гггг '-' MM '-' dd'T'HH ':' мм ':' ss.fffffffK
  • гггг '-' MM '-' dd'T'HH ':' мм ':' ss.fffffffK
  • ддд, дд МММ гггг ЧЧ ':' мм ':' сс 'GMT'
  • ддд, дд МММ гггг ЧЧ ':' мм ':' сс 'GMT'
  • гггг '-' MM '-' dd'T'HH ':' мм ':' сс
  • HH: мм
  • В 'ч' мм
  • HH: мм: сс
  • H: мм: сс * +1154 *
  • В 'ч' мм
  • H: мм
  • гггг '-' ММ '-' дд ЧЧ ':' мм ':' ss'Z '
  • д ММММ гггг чч: мм: сс
  • д ММММ гггг Ч: мм: сс
  • д ММММ гггг ч 'ч' мм
  • д ММММ гггг Ч: мм
  • д МММ гггг ЧЧ: мм: сс
  • д МММ гггг Ч: мм: сс
  • д МММ гггг ч 'ч' мм
  • д МММ гггг Ч: мм
  • ММММ, гггг
  • ММММ, гггг
2 голосов
/ 01 июня 2010

Название дня и месяца не сокращены должным образом, им нужен период. Если вы можете массировать струну, то можете заставить ее работать:

using System;
using System.Globalization;

class Program {
    static void Main(string[] args) {
        String foo = "mar., 20 avr. 2010 09:00:00 -0500";
        var cvt = CultureInfo.GetCultureInfo("fr-CA").DateTimeFormat;
        var dt = DateTimeOffset.Parse(foo, cvt, DateTimeStyles.RoundtripKind);
        Console.WriteLine(dt);
        Console.ReadLine();
    }
}
...