Как разобрать «строку» в «DateTime» с форматом «am» или «pm» (не AM / PM)? - PullRequest
0 голосов
/ 06 декабря 2018

Мне нужно преобразовать эту строку DateTime ("6/12/2018 12:00:03 a. m.") в тип DateTime, используя функцию DateTime.ParseExact().

Я преобразовал string, используя эту опцию, и она работает:

var date = "6/01/2018  12:00:03 a. m.";
var x=Convert.ToDateTime(date);

Также я смог преобразовать эту строку ("6/12/2018 12:00:03"), используя DateTime.ParseExact(), но когда дата неНе содержит индикатор a. m. или p. m.:

var date = "6/01/2018  12:00:03";
var x=DateTime.ParseExact(date, "d/MM/yyyy  h:mm:ss", CultureInfo.InvariantCulture);

Как преобразовать эту строку даты и времени, когда часть времени содержит часть a. m. или p. m., используя функцию DateTime.ParseExact()?

Ответы [ 3 ]

0 голосов
/ 06 декабря 2018

Сначала необходимо стандартизировать строки AM и PM

var dateStr = "6/01/2018  12:00:03 a. m.";

var cleanDate = dateStr.Replace("a. m.", "AM").Replace("p. m.","PM");
var date = DateTime.ParseExact(cleanDate, "d/MM/yyyy  h:mm:ss tt", CultureInfo.InvariantCulture)
0 голосов
/ 06 декабря 2018

Поскольку a. m. и p. m. являются нестандартными обозначениями для AM и PM, вам нужно будет создать свой собственный DateTimeFormatInfo на основе желаемой локали (вы используете инвариантную локаль в настоящее время)и измените его свойства AMDesignator и PMDesignator.Затем вы можете выполнить синтаксический анализ, используя спецификатор формата "tt", как описано в этот ответ от Soner Gönül , а также этот ответ от Сложность , передавая пользовательский DateTimeFormatInfo как IFormatProvider в DateTime.ParseExact(string s, string format, IFormatProvider provider):

// Construct an invariant DateTimeFormatInfo and modify its AMDesignator and PMDesignator.
// The DateTimeFormat must be cloned since the global instance is read-only.
var formatInfo = (DateTimeFormatInfo)CultureInfo.InvariantCulture.DateTimeFormat.Clone();
formatInfo.AMDesignator = "a. m.";
formatInfo.PMDesignator = "p. m.";

var x = DateTime.ParseExact(date, "d/MM/yyyy  h:mm:ss tt", formatInfo);

По соображениям производительности вы можете захотетьдля статического кэширования DateTimeFormatInfo, как показано, например, здесь .

В качестве альтернативы , есть несколько культур, которые используют a. m. и p. m. в качестве AMи обозначения PM, в основном испанские и каталонские, и ваше приложение может работать с одной из этих культур как текущая культура .Вы можете обнаружить все такие культуры следующим образом:

foreach (var info in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
    if (info.DateTimeFormat.AMDesignator == "a. m." && info.DateTimeFormat.PMDesignator == "p. m.")
    {
        Console.WriteLine("Culture {0} ({1}) has the required AM and PM designators.", info.DisplayName, info.Name);
    }
}

Какие выходные данные

Culture Catalan (ca) has the required AM and PM designators.
Culture Catalan (Andorra) (ca-AD) has the required AM and PM designators.
Culture Catalan (Catalan) (ca-ES) has the required AM and PM designators.
Culture Valencian (Spain) (ca-ES-valencia) has the required AM and PM designators.
Culture Catalan (France) (ca-FR) has the required AM and PM designators.
Culture Catalan (Italy) (ca-IT) has the required AM and PM designators.
Culture Spanish (Equatorial Guinea) (es-GQ) has the required AM and PM designators.
Culture Spanish (Mexico) (es-MX) has the required AM and PM designators.
Culture Spanish (Philippines) (es-PH) has the required AM and PM designators.

И вы можете проверить обозначения AM и PM текущей культуры, напечатав на консоли:

Console.WriteLine("Current culture AMDesignator=\"{0}\" and  PMDesignator=\"{1}\".",
                  CultureInfo.CurrentCulture.DateTimeFormat.AMDesignator,
                  CultureInfo.CurrentCulture.DateTimeFormat.PMDesignator);

Вы можете проанализировать строку date в любой из этих культур и получить желаемый результат:

var formatInfo = CultureInfo.GetCultureInfo("es-MX");

var x = DateTime.ParseExact(date, "d/MM/yyyy  h:mm:ss tt", formatInfo);

И если текущая культура вашего пользователя является одной из этих культур, вы можете передатьCultureInfo.CurrentCulture (или CultureInfo.CurrentUICulture при необходимости):

var x = DateTime.ParseExact(date, "d/MM/yyyy  h:mm:ss tt", CultureInfo.CurrentCulture);

Демонстрационная скрипка здесь .

0 голосов
/ 06 декабря 2018

Это то, для чего спецификатор пользовательского формата tt предназначен.

var date = "6/01/2018  12:00:03 am";
var x = DateTime.ParseExact(date, "d/MM/yyyy  h:mm:ss tt", CultureInfo.InvariantCulture);

Но помните, что этот tt спецификатор не анализ a. m. или a.m. строки.Если у ваших строк есть такие, вы должны t o манипулировать вашими строками, например, удалять точки и / или пробелы между a и m и т. Д. Он также анализирует AM и PM.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...