Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/439.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过Ajax将Javascript日期转换为C#_C#_Javascript_Date - Fatal编程技术网

通过Ajax将Javascript日期转换为C#

通过Ajax将Javascript日期转换为C#,c#,javascript,date,C#,Javascript,Date,我有一个javascript日期对象,它以这种格式给我一个日期字符串,“Wed Dec 16 00:00:00 UTC-0400 2009” 我通过Ajax将其传递给服务器(ASP.NET c#) 如何将“Wed Dec 16 00:00:00 UTC-0400 2009”转换为C#DateTime对象。解析失败。老实说,我不会尝试在C#中解析该日期字符串,我个人会尝试从javascript日期对象创建一个更有用的日期结构 例如,您可以在javascript中使用parse(),它将返回表示日期

我有一个javascript日期对象,它以这种格式给我一个日期字符串,“Wed Dec 16 00:00:00 UTC-0400 2009”

我通过Ajax将其传递给服务器(ASP.NET c#)


如何将“Wed Dec 16 00:00:00 UTC-0400 2009”转换为C#DateTime对象。解析失败。

老实说,我不会尝试在C#中解析该日期字符串,我个人会尝试从javascript日期对象创建一个更有用的日期结构

例如,您可以在javascript中使用
parse()
,它将返回表示日期对象的ms,您可以在上使用
DateTime.parse()
将其转换为C#DateTime对象。

您可以使用它来指定用于解析的格式字符串:

DateTime dt = DateTime.ParseExact("Wed Dec 16 00:00:00 UTC-0400 2009",
                                  "ddd MMM d HH:mm:ss UTCzzzzz yyyy",
                                  CultureInfo.InvariantCulture);

最可靠的方法是使用从纪元开始的毫秒。您可以通过调用
Date.getTime()
在JavaScript中轻松实现这一点。然后,在C#中,您可以将其转换为如下所示的日期时间:

long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000);

你必须乘以10000才能将毫秒转换为100纳秒的“滴答声”。

为了子孙后代,为了帮助未来的谷歌同行,我想进一步介绍一下EMP的答案

EMP的答案提供了UTC的时间(如果这是您想要的,请使用)

要以C#到达客户机当地时间:

在JavaScript中:

        var now = new Date();
        var UTC = now.getTime();
        var localOffset = (-1) * now.getTimezoneOffset() * 60000;
        var currentTime = Math.round(new Date(UTC + localOffset).getTime()); 
在C#中:


这要归功于和EMP的回答,但双方都做了一些尝试和错误,所以仅供未来的朋友参考。

这在您的情况下可能不可能,但我确实建议更新JS代码,以ISO 8601格式传递日期/时间

ISO 8601不仅是正式的标准,而且易于使用,避免了很多时区的麻烦

要在Javascript中获取8601个日期时间字符串,请执行以下操作:

var d = new Date();
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z"
要在C#中读取8601个日期时间字符串,请执行以下操作:


我知道这是一个老生常谈的答案,但我确实有一个问题。您添加新的TimeSpan而不是调用DateTime的
.addMillimes
方法有什么特别的原因吗?我记不清原因了。我现在编辑了答案以使用
AddTicks
,这可能比
addmillides
(我们这里讨论的是几个CPU周期)稍微快一些。我很好奇为什么“纪元”是1970/01/01。事实证明,这就是“Unix时代”。我想我会与大家分享一下,以防其他人好奇或困惑:有什么理由不使用DateTime.AddMillimes吗?返回新的日期时间(1970,1,1).add毫秒(mssincepoch);注意:JS Date.getTime返回UTC时间。因此,如果你想使用C语言的本地时间,你必须使用ToLocalTime():
返回新的日期时间(1970,1,1).AddTicks(mssincepoch*10000).ToLocalTime()这是正确处理时区调整的最正确答案。我认为这是最好的方法,因为这是一个单一步骤,不需要跳过任何其他障碍来处理时区或System.DateTime解析。我使用此方法来符合MomentJS您可能希望改为使用DateTimeOffset。
var d = new Date();
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z"
DateTime d = DateTime.Parse(json_string);