从各种字符串创建日期时间对象

本文关键字:时间 对象 创建日期 字符串 | 更新日期: 2023-09-27 18:33:15

>我有一个日期格式的字符串。我想将其转换为DateTime对象。但是我不确定字符串的格式。

我可以使用任何方法使其适用于以下输入?

"12/31/2015", "31/12/2015", "2015-12-31"

从各种字符串创建日期时间对象

DateTime.TryParseExact方法有一个重载,它将你的格式作为字符串数组。

string s = "";
DateTime dt;
var array = new[] {"MM/dd/yyyy", "dd/MM/yyyy", "yyyy-MM-dd"};
if(DateTime.TryParseExact(s, array, CultureInfo.InvariantCulture,
                          DateTimeStyles.None, out dt))
{
    //
}

我使用 InvariantCulture 作为IFormatProvider /因为格式说明符具有将我替换为当前区域性或提供的区域性日期分隔符的特殊含义。这意味着,如果您使用 CurrentCulture 并且它没有 / 作为DateSeparator,即使您的字符串和格式完全匹配,您的解析也会失败。

但请记住

这种方式适合您的示例。

但是像01/02/2015这样的字符串是一个问题,因为这种方法无法知道这是1 February 20152 January 2015。在这种情况下,此方法使用第一个成功匹配的格式分析字符串。

但是我不确定字符串的格式。

如果要完全成功解析所有示例,则必须知道它们的确切格式。

您可以将 TryParseExact 与预期格式列表一起使用。

string[] formats = { "MM/dd/yyyy", "dd/MM/yyyy", "yyyy-MM-dd" };
DateTime outputDate;
DateTime.TryParseExact(inputText, formats, 
    CultureInfo.InvariantCulture, DateTimeStyles.None, out outputDate)
您可以使用

允许的区域性列表:

        var list = new List<string> {"12/31/2015", "31/12/2015", "2015-12-31"};
        var allowedCultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
        foreach (string s in list)
        {
            DateTime dt;
            foreach (CultureInfo culture in allowedCultures)
            {
                if (DateTime.TryParse(s, culture, DateTimeStyles.None, out dt))
                {
                    Console.WriteLine("{0} - {1}", culture.DisplayName, dt.ToShortDateString());
                    break;
                }
            }
        }
您可以使用

DateTime.Parse . 试试这段代码:

// Define cultures to be used to parse dates.
      CultureInfo[] cultures = {CultureInfo.CreateSpecificCulture("en-US"), 
                                CultureInfo.CreateSpecificCulture("fr-FR"), 
                                CultureInfo.CreateSpecificCulture("de-DE")};
      // Define string representations of a date to be parsed. 
      string[] dateStrings = {"01/10/2009 7:34 PM", 
                              "10.01.2009 19:34", 
                              "10-1-2009 19:34" };
      // Parse dates using each culture. 
      foreach (CultureInfo culture in cultures)
      {
         DateTime dateValue;
         Console.WriteLine("Attempted conversions using {0} culture.", 
                           culture.Name);
         foreach (string dateString in dateStrings)
         {
            try {
               dateValue = DateTime.Parse(dateString, culture);
               Console.WriteLine("   Converted '{0}' to {1}.",
                                 dateString, dateValue.ToString("f", culture));
            }
            catch (FormatException) {
               Console.WriteLine("   Unable to convert '{0}' for culture {1}.", 
                                 dateString, culture.Name);
            }
         }
         Console.WriteLine();