将JS date解析为C#DateTime

将JS date解析为C#DateTime,c#,javascript,datetime,C#,Javascript,Datetime,我有一个javascript日期对象,它以这种格式给我一个日期字符串,“Tue Sep 04 2012B0100(GMT夏令时)” 如前所述,我正在尝试使用ParseAxCAT进行解析,但它抛出了一个无效的日期异常-有人告诉我正确的格式吗 string date = "Tue Sep 04 2012B0100 (GMT Daylight Time)"; dt = DateTime.ParseExact(date,"ddd MMM d

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

如前所述,我正在尝试使用ParseAxCAT进行解析,但它抛出了一个无效的日期异常-有人告诉我正确的格式吗

                string date = "Tue Sep 04 2012B0100 (GMT Daylight Time)";
                dt = DateTime.ParseExact(date,"ddd MMM dd yyyyBzzzz",
                     CultureInfo.InvariantCulture);
我也不高兴地看到了这一点:

如果可以的话(因为有了对象,听起来像是这样),我建议从Javascript(.getTime())中提取自1970/01/01以来的毫秒数,将其转换为.Net刻度(100纳秒单位),并使用它解析为C#DateTime

var ticks = (jsMillis * 10000) + 621355968000000000;
var date = new DateTime(ticks);
其中,jsMillis是通过调用Javascript DateTime对象上的getTime()获得的数字


62135596800000000将从C#的日期来源(0001年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);

编辑以说明偏移量。

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

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

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

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

如果决定走这条路线,也要考虑通过时区(时间偏移)到服务器端代码,或者在JavaScript端将时间转换为UTC。考虑使用ISO8601格式的日期:yyyy mm DDthh:mm:ssfffffffZZ. 我从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);
}

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

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

我可能错了,但我想格式字符串中的破折号“-”会引起一些麻烦,因为它们不在源字符串中?听起来像是非标准的日期时间格式,你确定B不是加号吗?您可能需要对字符串进行一些预处理,以获得.NET来解析它。当您有英文日和月名称时,使用不变量文化可能不好。如果您将dt字符串化,您会注意到您将获得类似于39/04/12的值。第三天是你一周中的一天。只要格式化它,如果你需要在另一边喜欢;dt.ToString(“mm/dd/yy”);从某种意义上说,它不会引发异常,但它是否会将UTC偏移量设置为日期的小时和分钟?要使用zzz解析偏移量,它似乎会查找+修饰符。用a+替换B,应该可以得到你想要的结果。+1-在JS中使用
date.getTime()
来获得历元时间是解决这个问题的正确方法。试图解析
date.toString()
的结果充满了危险。请参阅。它不是GETTIME()-考虑使用值EffoE(),这是从1970- 1月1日午夜开始的毫秒数。你在第一部分是正确的。JS应该将<代码>日期<代码>转换成更可靠的表示。但是,不要处理字符串,只需使用
getTime()
获取自epoch以来的刻度数。这样,你就不必担心时区了。@josh3736,我不太确定如果你使用滴答声(除非你先转换成UTC,然后再转换成滴答声,我想这不是你的建议)
getTime
总是自动处理UTC。@josh3736,你想提供一个链接吗?据我所知,它只是从当地时间的特定时刻(1970年1月1日)偏移,但在不知道计算时区的情况下,无法将1346789616870这样的数字转换为正确的时间…:“根据世界时返回与指定日期时间对应的数值。”