将JS日期解析为C#日期时间

Parse JS date to C# DateTime

本文关键字:日期 时间 JS      更新时间:2023-09-26

我有一个javascript日期对象,它给我一个格式为"2012年9月4日星期二B0100(GMT夏令时)"的日期字符串

我正试图用这里提到的ParseEaxcat进行解析,但它抛出了一个无效的日期异常——任何人都会给我指明正确格式的方向

                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

如果可以(这听起来像是因为你有了对象),我建议从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#的日期原点(1月1日午夜)转换为javascript的日期原点。

这很有效。不过,为了避免在线拆分,您可能需要在传入之前去掉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);

已编辑以说明偏移。

我从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);
}
日期似乎与格式字符串不匹配。格式字符串有连字符,并且缺少带括号的部分。此外,没有提到具有4z的格式字符串,因此您可以将第一个字符串更改为0。

另一种方法是在JavaScript端将日期转换为合理的表示形式,这将显著增强健壮性:无需猜测语言服务器端,可以正确处理时区。

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

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

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

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

// 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