Общая информация: Как преобразовать строку DateTime JSON2.org в C # DateTime - PullRequest
0 голосов
/ 04 ноября 2010

Asp.Net MVC 2 Futures, похоже, не очень хорошо обрабатывает JSON DateTime (включая двойные и десятичные значения). Поэтому я настроил все входные данные как строку, использовал проверку данных, и все работало довольно хорошо.

Однако у меня есть дата JSON2.js из Firefox 3.6:

"/Date(1288296203190)/"

Как мне включить это в действительную дату в C #?

var a = new DateTime(1288296203190);

Это не дает правильную дату (1/2/0001 11:47:09 AM) вместо чт 28 октября 2010 16:03:23 GMT-0400 (восточное дневное время). Вероятно, это потому, что 32-разрядное целое число составляет всего 10 цифр. Однако это тоже не получается:

var a = Int64.Parse("1288296203190");
var b = new DateTime(a);
Значение

b равно 1/2/0001 11:47:09.

Что это сделало? Заворачивать? Является ли это какой-то проблемой путешествия со знаком во времени?

Ответы [ 4 ]

2 голосов
/ 04 ноября 2010

Проблема в разнице эпох. Похоже, что дата JSON2.js, которую вы используете, использует эпоху Unix (1 января 1970 г.), измеренную в мс. Из документа System.DateTime (длинные тики):

ожидает дату и время, выраженные числом 100-наносекундных интервалов, прошедших с 1 января 0001 года в 00: 00: 00.000 по григорианскому календарю.

Примерно так должно получиться то, что вы хотите.

var unixEpoch = DateTime(1970, 1, 1);
var ticksSinceEpoch = 1288296203190 * 10000;
var time = new DateTime(unixEpoch.Ticks + ticksSinceEpoch);
1 голос
/ 05 декабря 2013
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);

Я сам проанализировал строку. Это работает нормально для меня. У кого-нибудь есть другой оптимизированный способ, пожалуйста, дайте мне знать.

1 голос
/ 08 мая 2012

И есть еще лучший способ (который также учитывает ваш местный часовой пояс):

Просто создайте это расширение целого числа -

  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)

0 голосов
/ 01 марта 2011

Этот вопрос в основном такой же, как этот: ASP.net c # Parse int as datetime .

И я думаю, что принятый ответ там лучше, чем ответ @ matheeeny (хотя matheeeny хорошо объяснил проблему оригинального решения ОП).

Я скопирую сюда Принял LukeH ответ :

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

Возможно, вам также потребуется явно указать DateTimeKind в зависимости от ваших точных требований:

var dt = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc)
             .AddMilliseconds(1286294501433);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...