DateTime.TryParseExact CultureInfo.InvariantCulture

时间:2013-03-27 12:34:29

标签: c# c#-4.0

任何人都可以看到我做错了什么,我正在尝试解析日期以确保其有效日期,如果是这样,请将其转换为我需要的格式。

我尝试了不同的方法,但都返回01/01/0001 00:00:00

字符串parseArrivalDate = 02/02/2013

的值
DateTime ukDateFormat;
string ukFormat = "0:ddd, MMM d, yyyy";    
DateTime.TryParseExact(parseArrivalDate, ukFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out ukDateFormat);    
DateTime test = ukDateFormat; 

------------------------------------- EDIT --------- ----------------------

好的抱歉,我没有解释得很清楚。如果我输入英国格式说27/02/2013,当我有英国格式为dd / MM / yyyy它工作正常,问题是当我进入美国或任何其他格式时,它返回错误的日期,所以我是改变格式围绕思考问题。

在阅读你的评论之后,我已经明白了,我第一次使用了uk格式,所以我的问题是,如何更改代码,以便可以正确解析任何日期格式。

希望更有意义 感谢

6 个答案:

答案 0 :(得分:5)

你的字符串

"0:ddd, MMM d, yyyy"

有一个数字0,一个冒号:和一个与

对应的格式
"Wed, Mar 27, 2013"

例如,如果文化是"en-GB"(“英语(英国)”)。它可能来自String.FormatConsole.WriteLine或类似的方法调用,将其放入大括号{}以格式化文本,如

Console.WriteLine("The date {0:ddd, MMM d, yyyy} was selected.", someDateTime);

它适用于以下代码:

string arrivalDateString = "Wed, Mar 27, 2013";

...

DateTime result;
string yourFormat = "ddd, MMM d, yyyy";    // no "0:" part
bool isOK = DateTime.TryParseExact(arrivalDateString, yourFormat, CultureInfo.InvariantCulture, DateTimeStyles.None, out result);    
if (isOK)
{
    // Worked! Answer is in 'result' variable
}
else
{
    // Didn't work! 'result' variable holds midnight 1 January 0001
}

"27/03/2013"对应的格式为"dd/MM/yyyy"(或"d/M/yyyy")。与"03/27/2013"对应的格式为"MM/dd/yyyy"(或"M/d/yyyy")。

由于像

这样的字符串,因此不可能有一种处理两种日期样式的方法
"01/04/2013"   /* ambiguous */

可能意味着

  • 2013年4月1日
  • 2013年1月4日

因此它含糊不清,我们无法确定日期是什么意思。另请参阅Wikipedia: Calendar date → Date format

答案 1 :(得分:1)

您的日期字符串为:02/02/2013,您使用的格式为"0:ddd, MMM d, yyyy",这是错误的,如果它的月份是第一个,则应为MM/dd/yyyy

DateTime ukDateFormat;
string ukFormat = "MM/dd/yyyy";    
DateTime.TryParseExact(parseArrivalDate, ukFormat,CultureInfo.InvariantCulture,DateTimeStyles.None, out ukDateFormat);    
 DateTime test = ukDateFormat; 

如果您指定的日期包含第一天和第一天,则使用格式"dd/MM/yyyy",顺便说一下,您可以使用单个dM来表示单个数字和两位数字日/月。

目前您正在获取DateTime.MinValue,因为解析因格式无效而失败。

答案 2 :(得分:1)

我不知道您的期望,但您的输入字符串不符合您的ukFormat模式!所以这是完全正确的行为。

将您的模式更改为""dd/MM/yyyy""以使TryParseExact正常工作。

答案 3 :(得分:1)

您提供的格式看起来有点奇怪。尝试用这个替换它

string ukFormat = "dd/MM/yyyy";    

并阅读documentation

答案 4 :(得分:0)

感谢大家帮助我了解我哪里出错了,下面的代码就是我想出来的,虽然并不完美,因为03/06/2013英国不同于03/06/2013 US的意思。

我在文本框上方添加了文字,要求人们使用格式dd / mm / yyyy。

string getArrivalDate   = ArrivalDate;
                    string getDepartureDate = DepartureDate;

                    string dteFormat        = "dd/MM/yyyy";
                    DateTime result;
                    string arrivalDateParse;
                    string departureDateParse;

                    bool arrival = DateTime.TryParseExact(getArrivalDate, dteFormat, new CultureInfo("en-GB"), DateTimeStyles.None, out result);
                    if (arrival)
                        {
                        arrivalDateParse = getArrivalDate;
                        }
                    else
                        {
                        arrivalDateParse = "notvalid";
                        }

                    bool depart = DateTime.TryParseExact(getDepartureDate, dteFormat, new CultureInfo("en-GB"), DateTimeStyles.None, out result);
                    if (depart)
                        {
                        departureDateParse = getDepartureDate;
                        }
                    else
                        {
                        departureDateParse = "notvalid";
                        }

                    if (arrivalDateParse == "notvalid" || departureDateParse == "notvalid")
                        {
                        if (Request.IsAjaxRequest())
                            {
                            return Json(new { Confirm = "Date not in correct format" }, JsonRequestBehavior.AllowGet);
                            }
                        else
                            {
                            TempData["Error"] = "Sorry your arrival date or departure date is not a valid format, please enter date as dd/mm/yyyy example 02/12/2013";

                            return View("~/Views/Shared/Error.cshtml");
                            }

如果有人可以改进代码,我们将不胜感激。

由于

乔治

答案 5 :(得分:0)

考虑使用RoundTrip样式(ISO-8601),而不是使用InvariantCulture。请参阅此MSDN文章:http://msdn.microsoft.com/en-us/library/bb882584.aspx