通过Ajax将Javascript日期转换为C#
我有一个javascript日期对象,它以这种格式给我一个日期字符串,“Wed Dec 16 00:00:00 UTC-0400 2009” 我通过Ajax将其传递给服务器(ASP.NET 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(),它将返回表示日期
如何将“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);