代码之家  ›  专栏  ›  技术社区  ›  Zachary Scott

琐事:如何将JSON2.org日期时间字符串转换为C#日期时间

  •  0
  • Zachary Scott  · 技术社区  · 14 年前

    Net MVC2 Futures似乎不能很好地处理JSON日期时间(包括双精度和十进制值)。因此,我将所有输入设置为字符串,使用数据验证,一切都很好。

    但是,我从Firefox 3.6获得了这个JSON2.js日期:

    "/Date(1288296203190)/"
    

    如何在C#中将此交回有效日期?

    var a = new DateTime(1288296203190);
    

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

    b的值是1/2/0001上午11:47:09。

    它做了什么?包装?这是某种时间旅行的“符号位”问题吗?

    4 回复  |  直到 14 年前
        1
  •  2
  •   matheeeny    14 年前

    问题是时代的不同。看起来您使用的JSON2.js日期使用的是以ms为单位的unix epoch(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);
    
        2
  •  1
  •   mikhail-t    13 年前

    只需创建这个整数扩展名-

      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
  •  1
  •   Natarajan Ganapathi    11 年前
    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);
    

    我自己分析了绳子。它对我很有用。有没有其他优化方法,请告诉我。

        4
  •  0
  •   Community CDub    7 年前

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

    我认为这里公认的答案比@matheeeny的答案要好(尽管matheeeny很好地解释了OP最初解决方案的问题)。

    我抄过来 LukeH's accepted answer :

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

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