在c#中找出字符串日期的日期时间格式

时间:2012-11-22 13:39:53

标签: c# datetime internationalization globalization cultureinfo

我正在申请。该应用程序使用日期格式,如 "2012-11-21 15:22:35"
我已经知道格式为"yyyy-MM-dd HH:mm:ss"。但是我怎么能以编程方式找到日期和时间任意输入字符串的时间格式?有没有办法做到这一点?

4 个答案:

答案 0 :(得分:7)

这可能对你有帮助.. (在数组中,添加更多格式以进行检查)

string[] formats = {"M/d/yyyy", "MM/dd/yyyy",                                    
                            "d/M/yyyy", "dd/MM/yyyy", 
                            "yyyy/M/d", "yyyy/MM/dd",
                            "M-d-yyyy", "MM-dd-yyyy",                                    
                            "d-M-yyyy", "dd-MM-yyyy", 
                            "yyyy-M-d", "yyyy-MM-dd",
                            "M.d.yyyy", "MM.dd.yyyy",                                    
                            "d.M.yyyy", "dd.MM.yyyy", 
                            "yyyy.M.d", "yyyy.MM.dd",
                            "M,d,yyyy", "MM,dd,yyyy",                                    
                            "d,M,yyyy", "dd,MM,yyyy", 
                            "yyyy,M,d", "yyyy,MM,dd",
                            "M d yyyy", "MM dd yyyy",                                    
                            "d M yyyy", "dd MM yyyy", 
                            "yyyy M d", "yyyy MM dd"
                           };

        DateTime dateValue;

        foreach (string dateStringFormat in formats)
        {
            if (DateTime.TryParseExact(strDateTime, dateStringFormat,
                                       CultureInfo.InvariantCulture,
                                       DateTimeStyles.None,
                                       out dateValue))
                //Console.WriteLine("Converted '{0}' to {1}.", dateStringFormat, dateValue.ToString("yyyy-MM-dd"));                
                Console.WriteLine( dateStringFormat);
        }

答案 1 :(得分:3)

我认为你会遇到月份值为< = 12的日期字符串问题,因为这意味着该字符串的格式可以是"yyyy-MM-dd""yyyy-dd-MM"

除非您在解析器中添加首选项,否则无法知道哪一个是正确的。

例如: 2012/08/07 - “这可能是7月还是8月?”

你可以强制它,并希望有一个与格式匹配的CultureInfo

 var datestring = "2012-10-05 12:00:03";
 DateTime time;
 var matchingCulture = CultureInfo.GetCultures(CultureTypes.AllCultures).FirstOrDefault(ci => DateTime.TryParse(datestring, ci, DateTimeStyles.None, out time))

答案 2 :(得分:2)

如果您想识别格式,几乎无法100%确定地执行此操作。但是,您可能希望浏览给定CultureInfoTryParse支持的所有格式。不幸的是,这可能会产生不正确的结果,因为无法用这样的方式告诉什么是年,月和日:

  

10/11/12

根据您的文化偏见,您可以将其解释为2012年10月11日; 2012年11月10日或2010年11月12日。

你还没有提到你想对日期做什么,所以我会给你定期的最佳实践:

  1. 如果要在应用程序的不同模块之间传输日期,请使用不变日期格式。
  2. 如果您需要格式化日期和时间,请使用特定文化的默认日期格式。
  3. 谈论默认日期格式,如果您想接受最终用户输入的日期,您可能希望以文化的默认格式解析自由格式输入,或者您可以创建(或使用预先存在的)日期时间选择器控件。后一种方法是优选的。
  4. 广告1.转换为不变日期&时间格式使用:

    DateTime now = DateTime.UtcNow;
    string formatted = now.ToUniversalTime.ToString(CultureInfo.InvariantCulture);
    

    或(转换为ISO8601 - 格式化):

    string formatted = now.ToString("u");
    

    同样,您可以从不变格式解析DateTime:

    DateTime result;
    string source = "11/20/2012 11:22:33";
    if (DateTime.TryParse(source, CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal, out result))
    {
      // do something with result
    }
    

    或(通用格式不需要CultureInfo):

    DateTime result;
    string source = "2012-11-20 11:22:33Z";
    if (DateTime.TryParse(source, out result))
    {
      // do something
    }
    

    Ad 2& 3.格式化和解析特定文化类似于格式化和解析不变日期,但您需要将InvariantCulture替换为检测到的特定实例,例如CultureInfo.CurrentCulture

    根据应用程序的类型,您可能需要使用专用的日历控件,即jQuery UI Datepicker

答案 3 :(得分:-1)

使用以下代码:

string sysFormat = CultureInfo.CurrentCulture.DateTimeFormat;