由于 a. m. 和 p. m. 是 AM 和 PM 的非标准指示符,因此您需要根据所需的语言环境(您当前使用不变的语言环境)创建自己的自定义 DateTimeFormatInfo 并修改其 AMDesignator和PMDesignator 属性。然后您可以使用this answer by Soner Gönül 以及this answer by Complexity 中解释的"tt" 格式说明符进行解析,将自定义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,如图所示,例如here。
或者,有几种文化确实使用 a. m. 和 p. m. 作为 AM 和 PM 指示符,主要是西班牙语和加泰罗尼亚语,您的应用可能会以其中一种文化作为current culture。您可以通过以下方式发现所有此类文化:
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);
演示小提琴here.