2009-12-09 100 views
31

我有javascript日期对象,它给了我这种格式的日期字符串,“Wed Dec 16 00:00:00 UTC-0400 2009”。Javascript date to C#via Ajax

我通过Ajax把它传递给服务器(ASP.NET C#)

我如何转换, “星期三12月16日00:00:00 UTC-0400 2009” 到C#DateTime对象。 DateTime.Parse失败。

回答

52

您可以使用DateTime.ParseExact它允许你指定要用于解析格式字符串:

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

+1我不知道你能做到这一点,非常酷:) – Jay 2009-12-10 00:02:06

+0

您可能想使用DateTimeOffset代替。 – ColacX 2016-06-27 08:08:03

0

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

例如,你可以在JavaScript将返回表示日期的对象,您可以使用DateTime.Parse()上转换为C#DateTime对象的MS使用parse()

30

最可靠的方法是使用毫秒,因为时代。通过致电Date.getTime(),您可以轻松地在JavaScript中获得此信息。然后,在C#中,你可以将其转换为这样的日期时间:

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

你有10000乘以从毫秒到“蜱”,这是100纳秒转换。

+1

我知道这是一个古老的答案,但我确实有一个问题。是否有什么特别的原因可以添加新的TimeSpan,而不是调用DateTime的'.AddMilliseconds'方法? – Joshua 2011-11-15 17:25:08

+1

没有理由我记得。我已经编辑了使用'AddTicks'的答案,这可能比'AddMilliseconds'稍微快一点(我们在这里谈论几个CPU周期)。 – EMP 2011-12-12 09:33:11

+1

我很好奇为什么“时代”是1970/01/01。事实证明,这是“Unix时代”。我想我会分享,以防其他人感到好奇或困惑:http://en.wikipedia.org/wiki/Unix_time – 2012-06-20 16:26:06

5

仅仅为了后人,为了帮助未来的Google员工,我想扩展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#:

 DateTime currentTimeDotNet = new DateTime(1970, 1, 1).AddTicks(Convert.ToInt64(currentTime) * 10000); 

感谢this blog和EMP的答案,但采取了一些在两端进行试验和错误,以确保未来伙伴的合作。

+0

这是最正确的答案正确处理时区调整。 – 2014-01-15 13:04:35

22

你的情况,这可能是不可能的,但我真的建议更新JS代码通过ISO 8601格式的日期/时间。 http://en.wikipedia.org/wiki/ISO_8601

ISO 8601不仅是正式的标准,它也易于使用,并防止很多时区麻烦!

要获得8601个日期字符串在Javascript:

var d = new Date(); 
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z" 

要阅读C#8601个日期字符串:

DateTime d = DateTime.Parse(json_string); 
+0

我认为这是最好的方法,因为它只是一个步骤,并不需要通过其他任何环节来处理时区或System.DateTime分析。 – zomf 2015-04-08 22:45:23

+0

我正在使用这种方法来符合时刻 – 2016-06-21 19:08:31

+0

这个答案适用于我的场景。 – blfuentes 2017-08-23 14:30:50