在C#中查找字符串日期的日期时间格式

8
我正在开发一个应用程序。该应用程序使用日期格式,例如"2012-11-21 15:22:35"。 我已经知道该格式为"yyyy-MM-dd HH:mm:ss"。但是如何以编程方式查找任意输入字符串的日期和时间格式?有没有办法实现这个功能?

如果我理解问题的话,那是不可能的。因为你无法确定“2012-11-12”到底是十二月十一日还是十一月十二日。 - Hamlet Hakobyan
由于它是一个字符串,所以它本身没有关于其内容的嵌入式信息。因此,即使这个字符串包含日期时间信息,这也是你之前已知的信息。如果没有先验知识,你唯一的选择就是尝试猜测其格式,但这并不完全可靠。我相信1月1日在"dd-MM-yyyy"和"MM-dd-yyyy"中被表述时是相同的。因此,没有健壮的技术可用。 - J0HN
你的应用程序生成日期吗?如果是的话,你可以获取它的文化并从中获取精确的日期时间格式。如果你已经将日期作为字符串从外部源获取,你可能需要查询该源以获取其本地文化(通常日期时间数据存储在一个区域设置)或者至少尝试使用datetime.TryParse()函数来解析。 - Nogard
4个回答

10

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

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);
        }

5
我认为当月份小于等于12时,日期字符串可能的格式为"yyyy-MM-dd""yyyy-dd-MM",这会导致问题。除非在解析器中设置偏好,否则无法确定正确的格式。
例如:2012/08/07 - “这是七月还是八月?”
您可以尝试使用 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
如果您想识别日期格式,几乎没有100%的确定性。但是,您可以通过给定的CultureInfo支持的所有格式并尝试解析它们。不幸的是,这可能会产生错误的结果,因为无法确定以下内容中的年、月和日:
10/11/12
根据您的文化偏见,您可能将其解释为2012年10月11日、2012年11月10日或2010年11月12日。
您没有提到要对日期执行什么操作,因此我将向您介绍常规最佳实践:
1. 如果您想在应用程序的不同模块之间传输日期,请使用不变的日期格式。 2. 如果需要格式化日期和时间,请使用给定文化的默认日期格式。 3. 谈到默认日期格式,如果您想接受用户输入的日期,您可能希望以文化的默认格式解析自由格式输入,或者您可以创建(或使用预先存在的)日期时间选择器控件。后一种方法更可取。
第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
}

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

根据您的应用程序类型,您可能希望使用专用的日历控件,例如jQuery UI Datepicker


-1
使用以下代码:

string sysFormat = CultureInfo.CurrentCulture.DateTimeFormat;


谢谢,但它提供的是当前系统日期时间格式,而不是该字符串的格式。 :P - Dany

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接