#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, даже если часовой пояс на стороне клиента отличается