Поскольку 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);
Демонстрационная скрипка здесь .