JSON даты и часовые пояса - PullRequest
       3

JSON даты и часовые пояса

1 голос
/ 02 августа 2011

У меня есть следующий код:

$(function () {

    var thedate = "/Date(1198908717056)/";
    var thedate2 = ProcessDate(thedate)
    alert(thedate2);

});

function ProcessDate(DateString) {

    var TheDate = eval(DateString.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));
    return TheDate;
}

Когда он запускается, он возвращает предупреждение с 29 декабря, и время отображается как восточное время. Когда я меняю часовой пояс на моем компьютере, он все еще показывает дату в восточном часовом поясе.

У меня такой вопрос: содержит ли строка "/ Date (1198908717056) /" часовой пояс?информация или часовой пояс отображается в предупреждении как результат определения браузером моего часового пояса?

Спасибо.

Ответы [ 2 ]

2 голосов
/ 02 августа 2011

JSON вообще не имеет дат (это один из недостатков JSON). Эти строки - просто строки.

Некоторые структуры, такие как ASP.Net, используют этот синтаксис для указания дат. В каком часовом поясе они будут продиктованы рамками. Я считаю, что даты указаны в UTC, и поэтому вы можете просто использовать конструктор new Date(Number) для их создания (подробнее в этот другой ответ ). Это создает дату путем непосредственной установки ее внутреннего значения в «миллисекундах с начала эпохи UTC», подробнее в разделе 15.9 спецификации. Имейте в виду, что это работает только в том случае, если фактически все, что создает эти псевдо-даты, использует UTC.


Обновление : Глядя на ваш код, хотя он работает, эта строка:

var TheDate = eval(DateString.replace(/\/Date\((\d+)\)\//gi, "new Date($1)"));

... является злоупотреблением eval. eval следует по возможности избегать. Вместо этого, если вы хотите сохранить его как однострочник:

var TheDate = new Date(Number(DateString.replace(/\/Date\((\d+)\)\//gi, "$1")));

... или несколько более наглядно:

var Match = /\/Date\((\d+)\)\//gi.exec(DateString);
var TheDate;
if (Match) {
  TheDate = new Date(Number(Match[1]));
}

Во всех этих случаях Date будет инициализирован значением времени UTC, встроенным в строку даты. Но затем, когда вы попросите JavaScript отформатировать дату (например, через toString), он будет использовать ваш местный часовой пояс для этого. Вы не показали, как вы выводите дату, поэтому я не могу сказать вам, почему часовой пояс, кажется, не изменится, если вы измените свой часовой пояс (возможно, браузер не принял изменение?). Когда я делаю это, если я вывожу дату в виде строки, она показывает ее по британскому летнему времени (которое является моим текущим часовым поясом), если я использую toString, или UTC, если я использую toUTCString. Вот живой пример , в котором используется как исходная дата, так и дата (сегодняшняя дата, как я ее пишу), которая относится к летнему времени, поэтому даже в Великобритании вы можете увидеть разницу между UTC и местным временем.


Не по теме : В JavaScript преобладающим соглашением является использование имен в формате camelCase, начинающихся со строчной буквы как для локальных переменных, так и для имен функций. Итак, theDate, а не TheDate. Начальные заглавные буквы зарезервированы для функций конструктора (например, Date). Конечно, вы можете игнорировать это соглашение, но другим будет трудно прочитать ваш код.

1 голос
/ 02 августа 2011

Часовой пояс взят из вашей текущей настройки системы.Посмотрите на класс Дата .

Данное значение указано в миллисекундах и не содержит часовой пояс.Конструктор Date () ожидает, что в UTC будут указаны миллисекунды.Если у вас есть значения с известным часовым поясом, вы должны использовать версию конструктора dateString.

Однако, насколько мне известно, в JavaScript нет способа конвертировать часовые пояса, кроме UTC и локальной системы.часовой пояс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...