琐事:如何将 JSON2.org DateTime 字符串转换为 C# DateTime

Posted

技术标签:

【中文标题】琐事:如何将 JSON2.org DateTime 字符串转换为 C# DateTime【英文标题】:Trivia: How to convert a JSON2.org DateTime string to C# DateTime 【发布时间】:2011-05-04 21:26:50 【问题描述】:

Asp.Net MVC 2 Futures 似乎不能很好地处理 JSON DateTime(包括双精度值和十进制值)。因此,我将所有输入设置为字符串,使用数据验证,一切都运行良好。

但是,我有这个来自 Firefox 3.6 的 JSON2.js 日期:

"/Date(1288296203190)/"

如何在 C# 中将其转换为有效日期?

var a = new DateTime(1288296203190);

这并没有给出正确的日期(0001 年 1 月 2 日上午 11:47:09),而不是 2010 年 10 月 28 日星期四 16:03:23 GMT-0400(东部夏令时间)。这可能是因为 32 位整数只有 10 位。但是,这也失败了:

var a = Int64.Parse("1288296203190");
var b = new DateTime(a);

b 的值为 1/2/0001 11:47:09 AM。

它做了什么?裹?这是某种时间旅行“签名位”问题吗?

【问题讨论】:

【参考方案1】:
var jsonDate = "/Date(1288296203190+0530)/";
var strSec = jsonDate.Substring(6, 13);
var strTimeZone = jsonDate.Substring(19, 5);
sec = double.Parse(strSec);
var timeZoneHr = double.Parse(strTimeZone);
var timeZoneMin = timeZoneHr % 100;
 timeZoneHr = Math.Ceiling(timeZoneHr / 100);
var date = new System.DateTime(1970, 1, 1, 0, 0, 0, 0) 
     .AddMilliseconds(sec)
     .AddHours(timeZoneHr)
     .AddMinutes(timeZoneMin);

我自己解析了字符串。它对我来说工作正常。谁有其他优化方法,请告诉我。

【讨论】:

【参考方案2】:

还有更好的方法(也考虑到您当地的时区):

只需创建这个整数扩展 -

  public static class currency_helpers 
    public static DateTime UNIXTimeToDateTime(this int unix_time) 
      return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddSeconds(unix_time).ToLocalTime();
    
  

然后像这样在任何地方调用它:

var unix_time = 1336489253;    
var date_time = unix_time.UNIXTimeToDateTime();

date_time 的值为:

5/8/2012 10:00:53 AM

(通过:http://www.codeproject.com/Articles/10081/UNIX-timestamp-to-System-DateTime?msg=2494329#xx2494329xx)

【讨论】:

【参考方案3】:

这个问题和这个问题基本相同:ASP.net c# Parse int as datetime。

而且我认为那里接受的答案比@matheeeny 的答案更好(尽管 matheeeny 很好地解释了 OP 原始解决方案的问题)。

我会在这里复制LukeH's accepted answer:

var dt = new DateTime(1970, 1, 1).AddMilliseconds(1286294501433);

您可能还需要明确指定 DateTimeKind,具体取决于您的具体要求:

var dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
             .AddMilliseconds(1286294501433);

【讨论】:

【参考方案4】:

问题在于时代不同。看起来您拥有的 JSON2.js 日期使用了以毫秒为单位的 unix 纪元(1970 年 1 月 1 日)。来自 System.DateTime(long ticks) 文档:

期望日期和时间,以自公历 0001 年 1 月 1 日 00:00:00.000 以来经过的 100 纳秒间隔数表示。

这样的东西应该可以得到你想要的。

var unixEpoch = DateTime(1970, 1, 1);
var ticksSinceEpoch = 1288296203190 * 10000;
var time = new DateTime(unixEpoch.Ticks + ticksSinceEpoch);

【讨论】:

太棒了。在 DateTime 前面加上 new 并减去四个小时作为时区,你的答案是正确的。 :) 非常感谢。 可能是这样的 DateTime.UtcNow.Subtract(DateTime.Now) 可能在某个地方也需要夏令时

以上是关于琐事:如何将 JSON2.org DateTime 字符串转换为 C# DateTime的主要内容,如果未能解决你的问题,请参考以下文章

ARM琐事

如何将 numpy datetime64 转换为 datetime [重复]

如何将 Long 类型的 datetime 转换为具有正确时区的 DateTime

如何将SpriteKit中的单个游戏场景添加到普通的单视图Swift应用程序中

如何将 DateTime 转换为字符串 [重复]

如何将 SQL 日期转换为 DateTime?