Получить правильное значение даты из строки формата .NET DateTime JSON в Javascript - PullRequest
2 голосов
/ 08 октября 2011

У меня есть приложение javascript, которое получает данные из ASP.NET WebService в формате JSON.В моем приложении много манипуляций с датами, которые оно также получает от WebService.

WebService сохраняет все даты в часовом поясе EST и отправляет их в таком формате:

{"Date":"\/Date(1319205600000+0300)\/"} 

в мое приложение javascript.

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

10/21/2011 10:00

, я должен отобразить для пользователя точно такое же время.

Итак, для преобразования дат я делаю что-то вроде этого:

function convert_date(millisec) {
    var date = new Date(millisec),
        local_offset = date.getTimezoneOffset(),
        server_offset = -5 * 60, //EST offset
        diff = (local_offset + server_offset) * 60000;

    return new Date(millisec + diff);
}

Но дело в том, что server_offset не всегда должно быть -5.Это может быть -4 в зависимости от значения летнего времени.Я попытался сделать server_offset = (date.isDST() ? -4 : -5) * 60 вместо этого, но я не нашел никакого решения для захвата isDST(), которое прекрасно работает для всех часовых поясов локального клиента.Большинство из них отлично работают для часового пояса этого локального браузера, который имеет то же значение DST, что и часовой пояс EST, но не работает, например, в случае часового пояса GMT + 5: 30.

Так есть ли способ определить,DST будет применяться для какой-то конкретной даты в часовом поясе EST из JavaScript?

Или, может быть, я что-то пропустил?

Ответы [ 2 ]

1 голос
/ 08 октября 2011

Если вы можете изменить веб-сервис, я бы также дал ему флаг, указывающий, было ли это летнее время в часовом поясе (EST) сервера.

Предполагая, что вы не можете сделать это, вы можете определить, является ли переход на летнее время в соответствии с этой информацией для DST в США :

Летнее время начинается во второе воскресенье марта и заканчивается в первое воскресенье ноября.

Предостережение о том, что это может измениться в будущем (я даже не знал, что оно изменилось в 2007 году).

0 голосов
/ 08 октября 2011

Я не совсем уверен, как именно вы получаете значение ticks, которое вы передаете функции, что, я думаю, у вас происходит что-то странное. Но если вопрос заключается в том, как написать функцию isDST(), то это должно быть довольно просто.

Date.prototype.isDST = function()
{
    var dt = new Date(this.getYear(), 1, 1);
    return dt.getTimezoneOffset() > this.getTimezoneOffset();
}

edit: не полируется / не проверяется на отрицательные смещения.

...