Javascript日期到ASP.NET日期:字符串未被识别为有效的DateTime

时间:2014-06-04 17:41:02

标签: c# javascript asp.net asp.net-mvc datetime

我使用以下命令通过AJAX将日期传回我的MVC控制器:

date.GetDate().toLocaleDateString();

这将产生一个“4/5/2014”的值......当我尝试使用以下命令在我的控制器中转换它时:

DateTime myDate = DateTime.ParseExact(request.Params["myDate"], "dd/MM/yyyy", CultureInfo.InvariantCulture);

我得到“字符串未被识别为有效的DateTime”。这是有道理的,因为字符串的格式不正确...当我将字符串硬编码为:“04/05/2014”它将解决我的问题。

无论如何修复来自javascript的格式而不必将字符串拆分为日,月,年并以正确的格式重新组装它?

非常感谢任何建议!

谢谢

其他信息:

string myRequestDate = request.Params["myDate"];
string myViewBagDate = ViewBag.MyDate;

//This line passes
DateTime date1 = DateTime.ParseExact(myViewBagDate, "d/M/yyyy", CultureInfo.InvariantCulture);

//This line fails...
DateTime date5 = DateTime.ParseExact(myRequestDate, "d/M/yyyy", CultureInfo.InvariantCulture);

当我在两个字符串变量上添加一个监视时,我看到的每种方式的值都相同,但由于某种原因,第二行失败...

因此,当我将myRequestDate看作一个char数组时,我发现那里有一堆看起来不像日期的东西......

enter image description here

4 个答案:

答案 0 :(得分:1)

只需更改用于匹配JavaScript日期的格式字符串即可。

DateTime.ParseExact(request.Params["myDate"], "d/M/yyyy", CultureInfo.InvariantCulture);

答案 1 :(得分:1)

此代码:

var d=new Date();
console.log(d.toString());

在Windows 8.1 Chrome中执行此输出

"Wed Jun 04 2014 20:38:23 GMT+0200 (Hora de verano romance)"

但是在Kubuntu的Cromium中

"Wed Jun 04 2014 20:38:23 GMT+0200 (CEST)"

非常相似,但其他浏览器返回不同类型的格式,我使用此功能,这种工作与各种格式很好。

public static DateTime ParseDate(string value)
    {
        if (value == null)
        {
            throw new ArgumentNullException("value");
        }
        string[] formats = {"ddd MMM dd yyyy hh:mm:ss 'UTC'zzz",
                           "ddd MMM d yyyy hh:mm:ss 'UTC'zzz",
                            "ddd MMM d hh:mm:ss 'UTC'zzz yyyy",
                            "ddd MMM dd hh:mm:ss 'UTC'zzz yyyy",
                            "ddd MMM dd yyyy hh:mm:ss 'GMT'zzz",
                           "ddd MMM d yyyy hh:mm:ss 'GMT'zzz",
                           "ddd MMM d hh:mm:ss 'GMT'zzz yyyy",
                            "ddd MMM dd hh:mm:ss 'GMT'zzz yyyy",
                            "dd-MM-yyyy",
                            "yyyy-MM-dd'T'hh:mm:ss"
                           };
        DateTime fecha;
        //Try the default
        if (!DateTime.TryParse(value, out fecha))
        {
            if (!DateTime.TryParseExact(value, formats,
                                       new CultureInfo("en-US"),
                                       DateTimeStyles.None, out fecha))
            {
                if (value.Length > 24)
                {
                    return ParseDate(value.Substring(0, 24));
                }
                else
                {
                    throw new FormatException();
                }
            }

        }
        return fecha;

    }

答案 2 :(得分:1)

字符8206(U + 200E)是Unicode LEFT-TO-RIGHT MARK(不可见)。 试着找出它来自哪里并从源头上删除它。

作为解决方法,您可以在解析日期之前删除这些字符:

myRequestDate = myRequestDate.Replace("\u200E", "");
DateTime date5 = DateTime.ParseExact(myRequestDate, "d/M/yyyy", CultureInfo.InvariantCulture);

答案 3 :(得分:1)

在客户端使用以下代码:

    (date.GetDate()).toDateString();

在你的控制器方面:

    var date = Convert.ToDateTime(Request.Params["myDate"]);