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

琐事:如何将JSON2.org DateTime字符串转换为C#DateTime,c#,json,datetime,C#,Json,Datetime,Asp.NETMVC2Futures似乎不能很好地处理JSON日期时间(包括双精度和十进制值)。因此,我将所有输入设置为字符串,使用了数据验证,并且工作得非常好 但是,我在Firefox 3.6中有一个JSON2.js日期: "/Date(1288296203190)/" 如何在C#中将其转换为有效日期 这并没有给出正确的日期(1/2/0001 11:47:09 AM),而不是2010年10月28日星期四16:03:23 GMT-0400(东部夏时制)。这可能是因为32位整数只有10位。然而,

Asp.NETMVC2Futures似乎不能很好地处理JSON日期时间(包括双精度和十进制值)。因此,我将所有输入设置为字符串,使用了数据验证,并且工作得非常好

但是,我在Firefox 3.6中有一个JSON2.js日期:

"/Date(1288296203190)/"
如何在C#中将其转换为有效日期

这并没有给出正确的日期(1/2/0001 11:47:09 AM),而不是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


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

问题在于历元的差异。看起来您的JSON2.js日期使用的是unix纪元(1970年1月1日),从系统中以毫秒为单位。DateTime(长刻度)文档:

需要一个日期和时间,以100纳秒为单位表示,该时间间隔自公历0001年1月1日00:00:00.000起已过去

像这样的事情应该会让你得到你想要的

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

问题在于时代的不同。看起来您的JSON2.js日期使用的是unix纪元(1970年1月1日),从系统中以毫秒为单位。DateTime(长刻度)文档:

需要一个日期和时间,以100纳秒为单位表示,该时间间隔自公历0001年1月1日00:00:00.000起已过去

像这样的事情应该会让你得到你想要的

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

这个问题基本上和这个一样

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

我将在这里复制:

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


这个问题基本上和这个一样

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

我将在这里复制:

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


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

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

  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\u time
的值为:

5/8/2012 10:00:53 AM

(via:)

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

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

  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\u time
的值为:

5/8/2012 10:00:53 AM
(via:)

我自己解析了字符串。这对我来说很好。任何人有其他优化方法,请让我知道


我自己解析了字符串。这对我来说很好。任何人有其他优化方法,请告诉我。

太好了。在DateTime前面加上new,时区减去4小时,你的答案是正确的非常感谢。也许像这个DateTime.UtcNow.Subtract(DateTime.Now)这样的东西可能需要日光节约。在DateTime前面加上new,时区减去4小时,你的答案是正确的非常感谢。也许像这个DateTime.UtcNow.Subtract(DateTime.Now)这样的东西可能也需要夏令时