如何用“上午”将“字符串”解析为“ DateTime”或“下午”格式(不是AM / PM)?

时间:2018-12-06 17:06:33

标签: c# .net datetime

我需要使用功能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 :(得分: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.字符串。如果您的字符串中包含这些字符串,则无需操作字符串,例如删除am之间的点和/或空格等。它还会解析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(当前使用的是不变的语言环境)并修改其AMDesignatorPMDesignator属性。然后,您可以使用"tt"this answerSoner Gönülthis answer来解释的Complexity格式说明符,并传递自定义DateTimeFormatInfoIFormatProviderDateTime.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