【问题标题】:Trivia: How to convert a JSON2.org DateTime string to C# DateTime琐事:如何将 JSON2.org DateTime 字符串转换为 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。

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

【问题讨论】:

    标签: c# json datetime


    【解决方案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)
          • 可能在某个地方也需要夏令时
          猜你喜欢
          • 2021-03-31
          • 1970-01-01
          • 1970-01-01
          • 2014-03-01
          • 1970-01-01
          • 1970-01-01
          • 2012-05-05
          • 2011-10-16
          • 2016-03-17
          相关资源
          最近更新 更多