5

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

我尝试了不同的方法来做到这一点,但都返回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; 

- - - - - - - - - - - - - - - - - - -编辑 - - - - - - ------------------

好的对不起,我没有很好地解释它。如果我输入英国格式,比如 27/02/2013,当我将英国格式设置为 dd/MM/yyyy 时它工作正常,问题是当我输入美国或任何其他格式时,它返回的日期不正确,所以我是改变格式轮思维是问题所在。

阅读您的评论后,我现在恍然大悟,我的 uk 格式第一次正确,所以我的问题是,如何更改代码,以便可以正确解析任何日期格式。

希望这更有意义谢谢

4

6 回答 6

7

你的字符串

"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:日历日期 → 日期格式

于 2013-03-27T14:59:00.573 回答
1

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

string ukFormat = "dd/MM/yyyy";    

并阅读有关此的文档

于 2013-03-27T12:37:48.193 回答
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, 因为格式无效导致解析失败。

于 2013-03-27T12:36:34.467 回答
1

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

改变你的模式,""dd/MM/yyyy""使TryParseExact工作。

于 2013-03-27T12:37:16.420 回答
0

感谢大家帮助我了解我哪里出错了,下面的代码是我想出的,虽然并不完美,因为 03/06/2013 UK 与 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");
                            }

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

谢谢

乔治

于 2013-03-28T12:02:29.503 回答
0

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

于 2014-01-22T23:12:11.147 回答