任何人都可以看到我做错了什么,我正在尝试解析日期以确保其有效日期,如果是这样,请将其转换为我需要的格式。
我尝试了不同的方法,但都返回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格式,所以我的问题是,如何更改代码,以便可以正确解析任何日期格式。
希望更有意义 感谢
答案 0 :(得分:5)
你的字符串
"0:ddd, MMM d, yyyy"
有一个数字0
,一个冒号:
和一个与
"Wed, Mar 27, 2013"
例如,如果文化是"en-GB"
(“英语(英国)”)。它可能来自String.Format
,Console.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 */
可能意味着
因此它含糊不清,我们无法确定日期是什么意思。另请参阅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"
,顺便说一下,您可以使用单个d
和M
来表示单个数字和两位数字日/月。
目前您正在获取DateTime.MinValue
,因为解析因格式无效而失败。
答案 2 :(得分:1)
我不知道您的期望,但您的输入字符串不符合您的ukFormat
模式!所以这是完全正确的行为。
将您的模式更改为""dd/MM/yyyy""
以使TryParseExact
正常工作。
答案 3 :(得分:1)
答案 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