Дата Javascript - как узнать, действует ли летнее время в данном часовом поясе

Во-первых, я НЕ ищу, действует ли летнее время на местном уровне.

Я запускаю процесс Node, у которого есть данные, связанные с временными метками. Мне нужно преобразовать эти временные метки в день / месяц / год в указанном часовом поясе, но все, что мне дано, - это смещение часового пояса и смещение летнего времени.

Я бы хотел, чтобы дата / момент лучше работали с часовыми поясами. Они отлично работают с UTC или местным часовым поясом, но, похоже, вам нужно взломать их, чтобы получить что-то еще.

Что-то мне не хватает? Предполагая, что я могу определить, действует ли летнее время, будет ли это работать:

var d = new Date(ts + timezone_offset - local_offset);
d.getMonth();
d.getDate();

где timezone_offset - это смещение часового пояса (стандартное смещение или dst)?

Как я могу определить, действует ли летнее время?


person user1756980    schedule 08.02.2013    source источник
comment
это дубликат: stackoverflow.com/questions/4903722/   -  person kmote    schedule 09.02.2013
comment
на самом деле это довольно просто, вам просто нужно сделать несколько сравнений дат, см. мое репо здесь для расширенного примера: github.com/jthoburn/Date.toString.js   -  person runspired    schedule 09.02.2013
comment
в частности, посмотрите на код для «I» и измените его, чтобы использовать этот метод: stackoverflow.com/a/14636431/1883464   -  person runspired    schedule 09.02.2013
comment
Вы действительно знаете идентификатор часового пояса? Если да, то это идентификатор Олсона, например America / New_York, или идентификатор Windows, например Eastern Standard Time? Или все, что вы знаете, что смещение -5 или -4?   -  person Matt Johnson-Pint    schedule 09.02.2013
comment
@runspired - мои комментарии к вашей библиотеке можно найти здесь. Спасибо.   -  person Matt Johnson-Pint    schedule 09.02.2013
comment
@kmote - Нет, это не обман, потому что он работает на узле, а не в браузере. В зависимости от его ответа на мой предыдущий комментарий может действительно подойти TimezoneJS. Я уточню в ответе после того, как он ответит.   -  person Matt Johnson-Pint    schedule 09.02.2013
comment
@runspired - возможно, я не понимаю код, но разве он не полагается на местный часовой пояс? Если нет, я не вижу, что он делает   -  person user1756980    schedule 09.02.2013
comment
@MattJohnson У меня есть оба, America / New_York и gmt -5, dst -4   -  person user1756980    schedule 09.02.2013
comment
@ user1756980 Как вам присваиваются временные метки? Строки ISO? клещи? несколько значений? Являются ли они местными для этого часового пояса или время в формате UTC? Вы можете привести пример? Я хочу быть уверенным, что дам полезный ответ. Спасибо.   -  person Matt Johnson-Pint    schedule 09.02.2013
comment
Мне удалось сделать что-то, что, как мне кажется, работает, я распечатал результат для всех дней этого года и по сравнению с тем, когда Google сообщает, что dst начинается и заканчивается, и это сработало, я не уверен, будет ли это работать каждый год / каждый время (я просто делал полночь каждый день). Временные метки - это тики (секунды с начала эпохи, но, конечно, при необходимости их можно легко преобразовать в миллисекунды).   -  person user1756980    schedule 09.02.2013
comment
@ user1756980 Это плохой план. Даты сильно различаются для разных зон, и даже в одних и тех же зонах они меняются из года в год. Я почти закончил с примером того, как делать то, что вы хотите, используя TimezoneJS, и вскоре опубликую его.   -  person Matt Johnson-Pint    schedule 10.02.2013


Ответы (3)


Во-первых, поймите, что если все, что у вас есть, это смещения, вы не сможете решить эту проблему. У вас должен быть идентификатор часового пояса, например "America/New_York". Поскольку в комментариях к вопросу вы сказали, что у вас это действительно есть, вы можете использовать одну из этих библиотек, чтобы выполнить свою работу. .

Ранее я публиковал еще один ответ на этот вопрос, рекомендуя TimeZoneJS, но сейчас я откажусь от него. - поскольку этот вопрос конкретно о DST, и TimeZoneJS имеет ошибки, неправильно сообщающие значения около переходов DST.

Вместо этого я теперь рекомендую использовать moment.js с момент-часовой пояс. После установки обеих библиотек (обязательно загружая фактические данные о часовом поясе, согласно документации) код довольно прост:

moment(timestamp).tz(timezone).isDST()

Например:

moment(1451624400000).tz('America/New_York').isDST(); // false
moment(1467345600000).tz('America/New_York').isDST(); // true

Или, если ваши временные метки уже являются строками с точки зрения местного времени, используйте вместо этого следующий синтаксис:

moment.tz('2016-01-01T00:00:00','America/New_York').isDST(); // false
moment.tz('2016-07-01T00:00:00','America/New_York').isDST(); // true
person Matt Johnson-Pint    schedule 28.01.2016
comment
Использует ли эта библиотека объект Date в качестве прокси под капотом, как это делает timezoneJS? Или все с нуля реализовали? - person matf; 28.01.2016
comment
Сам Moment в настоящее время использует объект Date для некоторых вещей, но принимает во внимание все различные причуды. Тем не менее, у нас есть открытый элемент, который можно удалить. Moment-timezone реализует все с нуля относительно часовых поясов. Он не полагается на объект Date для преобразования часовых поясов. - person Matt Johnson-Pint; 28.01.2016
comment
Я тестировал случаи, когда timezoneJS не работал, и они правильно работают с моментным часовым поясом. - person matf; 29.01.2016

Что-то мне не хватает? Предполагая, что я могу определить, действует ли летнее время, будет ли это работать, если timezone_offset - это смещение запрошенного часового пояса?

Старайтесь всегда использовать методы UTC для получения атрибутов дат. Таким образом, локальный часовой пояс вашего (сервера) не повлияет на вычисления:

var d = new Date(ts + timezone_offset);
d.getUTCMonth();
d.getUTCDate();

Как я могу определить, действует ли летнее время?

Это сложно. Для определения начала и окончания летнего времени существует / существовало множество различных алгоритмов, в зависимости от региона - см. http://en.wikipedia.org/wiki/Daylight_saving_time_by_country, например.

Я не знаю, есть ли какие-нибудь библиотеки, которые их уже кодировали, или, может быть, даже связаться с базой данных часовых поясов для правильной информации. В крайнем случае можно было бы спросить самого пользователя о деталях часового пояса.

person Bergi    schedule 08.02.2013

moment.js (http://momentjs.com/) имеет функцию isDST. Вы можете использовать момент (намного проще) или проверить, как это реализовано.

moment(your_date).isDST();
person Pascal Belloncle    schedule 08.02.2013
comment
Это будет работать, только если вы проверяете, находится ли дата в летнем времени в вашем местном часовом поясе. Ни в какой другой произвольной зоне. - person Matt Johnson-Pint; 10.02.2013