我需要使用功能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()
部分时,如何转换日期时间字符串?
答案 0 :(得分:4)
这就是the tt
custom format specifier的作用。
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.
字符串。如果您的字符串中包含这些字符串,则无需操作字符串,例如删除a
和m
之间的点和/或空格等。它还会解析AM
以及PM
。
答案 1 :(得分:2)
您必须先对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)
答案 2 :(得分:1)
由于a. m.
和p. m.
是AM和PM的非标准指示符,因此您将需要根据所需的语言环境创建自己的自定义DateTimeFormatInfo
(当前使用的是不变的语言环境)并修改其AMDesignator
和PMDesignator
属性。然后,您可以使用"tt"
的this answer和Soner Gönül的this answer来解释的Complexity格式说明符,并传递自定义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。