【问题标题】:How to parse "string" to "DateTime" with "a. m." or "p. m." format (not AM/PM)?如何使用“a.m.”将“string”解析为“DateTime”或“下午”格式(不是上午/下午)?
【发布时间】:2018-12-06 17:06:33
【问题描述】:

我需要使用函数DateTime.ParseExact() 将这个DateTime 字符串("6/12/2018 12:00:03 a. m.") 转换为DateTime 类型。

我使用此选项转换了string,它可以工作:

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

我还可以使用DateTime.ParseExact() 转换此字符串("6/12/2018 12:00:03"),但是当日期不包含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() 函数转换该日期时间字符串?

【问题讨论】:

标签: c# .net datetime


【解决方案1】:

这就是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. 字符串。如果你的字符串有这些,你没有o操作你的字符串,比如删除a和m之间的点和/或空格等。它也解析AM和PM .

【讨论】:

    【解决方案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)
    

    【讨论】:

      【解决方案3】:

      由于 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.

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-01-06
        • 2012-03-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-06-04
        • 2021-09-17
        相关资源
        最近更新 更多