我有一个 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 对象。DateTime.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 对象。DateTime.Parse 失败。
您可以使用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);
最可靠的方法是使用自纪元以来的毫秒数。您可以通过在 JavaScript 中调用Date.getTime()
. 然后,在 C# 中,您可以将其转换为 DateTime,如下所示:
long msSinceEpoch = 1260402952906; // Value from Date.getTime() in JavaScript
return new DateTime(1970, 1, 1).AddTicks(msSinceEpoch * 10000);
您必须乘以 10,000 才能将毫秒转换为“滴答”,即 100 纳秒。
这在您的情况下可能是不可能的,但我真的建议更新 JS 代码以传递 ISO 8601 格式的日期/时间。 http://en.wikipedia.org/wiki/ISO_8601
ISO 8601 不仅是正式的标准,它也易于使用,避免了很多时区的麻烦!
要在 Javascript 中获取 8601 个日期时间字符串:
var d = new Date();
var iso_time = d.toISOString(); //"2014-05-06T18:49:16.029Z"
在 C# 中读取 8601 日期时间字符串:
DateTime d = DateTime.Parse(json_string);
只是为了后代,为了帮助未来的 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);
归功于此博客和 EMP 的回答,但在两端进行了一些试验和错误以使其正确,因此仅供未来的人们参考。
老实说,我不会尝试在 C# 中解析该日期字符串,我个人会尝试从您的 javascript 日期对象创建一个更有用的日期结构。
例如,您可以parse()
在 javascript 中使用它将返回表示日期对象的毫秒,您可以使用DateTime.Parse()
它来转换为 C# DateTime 对象。