将JS日期解析为C#DateTime

时间:2012-09-04 16:48:39

标签: c# javascript datetime

我有javascript日期对象,它以这种格式给我一个日期字符串,“Tue Sep 04 2012B0100(GMT Daylight Time)”

我正在尝试使用ParseEaxcat解析here,但它会抛出无效的日期异常 - 任何人都指向正确格式的方向

                string date = "Tue Sep 04 2012B0100 (GMT Daylight Time)";
                dt = DateTime.ParseExact(date,"ddd MMM dd yyyyBzzzz",
                     CultureInfo.InvariantCulture);

我也很满意地看着这个: http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx

6 个答案:

答案 0 :(得分:8)

如果可以(并且听起来就像你有对象那样),我建议从Javascript(.getTime())中提取自1970/01/01以来的毫秒数,将其转换为.Net ticks (100纳秒单位),并用它来解析成C#DateTime。

var ticks = (jsMillis * 10000) + 621355968000000000;
var date = new DateTime(ticks);

其中jsMillis是您在Javascript DateTime对象上调用getTime()获得的数字。

621355968000000000将从C#的日期来源(0001年1月1日午夜)转换为javascript的日期来源。

答案 1 :(得分:3)

这很有效。但是,您可能希望在传递GMT日光时间部分之前将其剥离,以避免在线分割。

string date = "Tue Sep 04 2012B0100 (GMT Daylight Time)";
var dt = DateTime.ParseExact(date.Split('(')[0].Replace("B","+").Trim(), "ddd MMM dd yyyyzzz", CultureInfo.InvariantCulture);

编辑以说明偏移。

答案 2 :(得分:2)

我从JavaScript获得了不同的日期时间格式。以下是我必须做的事情:

public void Main()
{
    Console.WriteLine(
        ConvertJsDate("Fri Apr 18 2014 16:23:18 GMT-0500 (Central Daylight Time)"));
    //test more regular date
    Console.WriteLine(
        ConvertJsDate("4/18/2014 16:23:18")); 
}

public DateTime ConvertJsDate(string jsDate)
{
    string formatString = "ddd MMM d yyyy HH:mm:ss";

    var gmtIndex = jsDate.IndexOf(" GMT");
    if (gmtIndex > -1) 
    {
        jsDate = jsDate.Remove(gmtIndex);
        return DateTime.ParseExact(jsDate, formatString, null);
    }
    return DateTime.Parse(jsDate);
}

答案 3 :(得分:0)

日期似乎与格式字符串不匹配。格式字符串具有连字符,并且缺少带括号的部分。此外,没有提到带有4个z的格式字符串,因此您可以将第一个更改为0。

答案 4 :(得分:0)

替代方法是将日期转换为JavaScript方面的合理表示将更加健壮:无需猜测语言服务器端,可以正确处理时区。

如果您使用某种自动转换(即JSON.stringify),您可能需要添加一个与日期字段并行的字段,并使用相同值的字符串表示形式,并在服务器端使用它而不是原始字段。

{ dateFied: new Date(),
  dateFiledAsIsoString: "....." }

如果决定走这条路线,还要考虑将时区(时间偏移)传递给服务器端代码或在JavaScript端将时间转换为UTC。考虑使用ISO8601格式作为日期:yyyy-MM-ddTHH:mm:ss.fffffffzzz。

答案 5 :(得分:0)

有很多方法可以做到这一点......但这是我发现最简单的......

// JavaScript
var d = new Date();
d.toLocaleString();
// =>   "6/26/2015, 2:07:25 PM"

// Can be Parsed by the C# DateTime Class
DateTime d = DateTime.Parse( @"6/26/2015, 2:07:25 PM" );
Console.WriteLine( d.ToLongDateString() );
// =>   Friday, June 26, 2015