Получить правильное значение даты из строки формата .NET DateTime JSON в Javascript

#javascript #.net #datetime #date #dst

#javascript #.net #дата и время #Дата #летнее время

Вопрос:

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

Веб-сервис сохраняет все даты в 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.

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

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

Комментарии:

1. Можете ли вы изменить реализацию сервиса?

2. К вашему сведению, это не тики, это миллисекунды

3. @Sii Я могу попросить внести некоторые изменения, если они возможны. Я думаю, лучшим решением было бы хранить даты в UTC, но я не уверен, что это возможно.

Ответ №1:

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

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

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

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

Комментарии:

1. Спасибо, эта информация может помочь. Может быть, вы можете предложить какую-нибудь библиотеку, которая поможет мне определить даты на второе воскресенье марта и первое воскресенье ноября? 🙂

2. @aliona, к сожалению, я не могу — js не является моим основным языком, поэтому я не очень хорошо знаком с библиотеками для него. Если вы пойдете по этому пути, я думаю, вам лучше всего будет опубликовать новый вопрос, который может быть более конкретным: «Как определить 2-е воскресенье марта в JavaScript».

3. Спасибо! ваше предложение сработало для меня. Для целей манипулирования датами я выбрал библиотеку datejs. Похоже, теперь все работает нормально. Еще раз спасибо.

4. @aliona добро пожаловать, и спасибо, что сообщили мне о datajs 🙂

Ответ №2:

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

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

редактировать: это не отшлифовано / не протестировано на отрицательные смещения.

Комментарии:

1. Я полагаю, что ваш код даст мне значение летнего времени для часового пояса браузера пользователя. Это не то, что я ищу. Мне нужно знать значение DST для EST часового пояса.

2. Вы хотите знать, находится ли серверное время в DST? Почему? Если вы можете проанализировать предоставленное вам значение, то вы уже получаете правильное местное время с правильным смещением.

3. Сервер хранит все даты в EST. И когда я получаю определенную дату, мне нужно определить, находится ли эта дата в DST для EST часового пояса, но не для локального. Если я знаю значение летнего true/false времени, я буду знать правильное смещение для EST: -4 или -5 . Вся эта информация, которую я должен знать, чтобы иметь возможность правильно преобразовывать даты и получать точно такую же дату и время, как это было бы для EST, даже если часовой пояс на стороне клиента отличается