如何获取DateTime Format实际日期时间的字符串?

时间:2018-01-02 14:33:25

标签: c# datetime

我想要一个日期时间字符串,并获取其格式的字符串版本:

e.g。如果由于解析异常而错误地解析了日期时间,则2017-01-02将产生YYYY-MM-dd用于记录目的。

这可能与System.DateTime或任何其他内置功能一起使用吗?

2 个答案:

答案 0 :(得分:4)

  

“2017-01-02”会产生“YYYY-MM-dd”

这是不可能的。你要求魔法,从没有中做出某事

如果没有计算机(或人类)的元信息,则无法决定是1月2日还是2月1日。两者都是可能的。

答案 1 :(得分:2)

没有可靠的方法来获取基于可能看起来像日期的字符串的格式字符串。

我能提出的最接近的黑客是迭代所有文化,然后尝试ParseExact在每个culturinfo的DateTimeFormat属性中找到的预定义DateTime模式。

黑客看起来像这样:

var date = "2017-01-02";

var formats = new Dictionary<string,int>();

// go over all cultures
foreach(var ci in CultureInfo.GetCultures(CultureTypes.SpecificCultures))
{
  // each culture has a DateTimeFormatInfo that holds date and time patterns
  foreach(var p in typeof(DateTimeFormatInfo)
                   .GetProperties()
                   .Where(prop => prop.Name.EndsWith("Pattern")))
  { 
    // get a pattern property from the cultureinfo DateTimeFormat
    var fmt = (string) p.GetValue(ci.DateTimeFormat, null);
    try
    {
      // try to parse the date
      DateTime.ParseExact(date,fmt , ci);
      // add the format
      if (formats.Keys.Contains(fmt))
      {
         formats[fmt]++; // how often this was a valid date
      }
      else
      {
         formats.Add(fmt, 1); // first time we found it
      }
    }
    catch
    {
     // no date in this culture for this format, ignore
    }

  }
}

// output the formats that were parsed as a date
foreach(var kv in formats)
{
   // Dump is a linqPad extension, use Console.WriteLine if that bothers you
   kv.Value.Dump(kv.Key);
}

并在我的方框中返回

  

<强> YYYY-MM-DD
  40个
  的 YYYY-M-d
  1

现在01/02/2017会返回:

  

<强> DD / MM / YYYY
   255

     

<强> d / M / yyyy的
  93

     

<强> M / d / yyyy的
  20

     

<强> d /月/年
  11

     

<强烈> MM / DD / YYYY
  2

显示了评论中提出的一些问题。在不知道文化的情况下,生成日期字符串就是猜测日期格式是什么。最坏的情况是它们之间是数字和破折号的字符串。