it-roy-ru.com

Установите дату () в полнофункциональном поясе пользователя с помощью moment.js.

Я использую moment.js для отображения даты UTC в часовом поясе пользователей:

var date = new Date(Date.UTC(2016,03,30,0,0,0));
var now = new Date();
var diff = (date.getTime()/1000) - (now.getTime()/1000);

var textnode = document.createTextNode(moment(date).format('dddd, DD.MM.YYYY') + ' a las ' + moment(date).format('HH:mm A'));
document.getElementsByClassName("date")[0].appendChild(textnode.cloneNode(true));

Позже я использую переменную diff, чтобы показать таймер обратного отсчета.

Я хотел бы показать различный таймер обратного отсчета всем в их местном часовом поясе. (Используя разницу до полуночи в их часовом поясе, а не в UTC)

Но я изо всех сил пытаюсь заставить это работать. Вместо использования var date = new Date(Date.UTC(2016,03,30,0,0,0)); мне, вероятно, нужно использовать некоторую функцию moment.js, которая дает мне до полуночи в часовом поясе пользователей.

Лучшим примером будет канун Нового года. Если бы я использовал UTC, у каждого был бы один и тот же счетчик (осталось 9 часов), но в разных частях света это не имело бы смысла. Для кого-то в Австралии это должно быть 2 часа, а для кого-то в США - 14 часов.

7
Snowball

Я не уверен, что полностью понимаю ваш вопрос, но я дам вам несколько общих советов и советов.

  1. При использовании moment.js очень мало необходимости когда-либо использовать объект Date. Используйте его только для взаимодействия с другими API, которые ожидают объект Date.

  2. Чтобы получить момент в UTC, просто используйте moment.utc(...), передавая соответствующие аргументы, такие как moment.utc([2016,3,30]) или moment.utc('2016-04-30'), для полуночи 30 апреля UTC.

  3. Если вы хотите преобразовать это обратно в местное время пользователя, используйте функцию .local(). Например, moment.utc('2016-04-30').local() создаст момент с местным временем, эквивалентным предоставленному времени UTC.

  4. Если вам нужен момент по местному времени пользователя, то это будет moment(...), например moment([2016,3,30]) или moment('2016-04-30') для полуночи 30 апреля местное время.

  5. Вы можете различать два момента, используя функцию diff, которая может давать ответ в определенных единицах, таких как m1.diff(m2, 'seconds'), где m1 и m2 являются моментными объектами.

  6. Вам не нужно звонить format дважды. Просто заключите любой текст, который вы хотите, в квадратные скобки. .format('dddd, DD.MM.YYYY [a las] HH:mm A')

  7. Вы можете посмотреть на поддержку языкового стандарта в данный момент. Если я не ошибаюсь, «las» обозначает испанский, однако это не всегда «las», а иногда «a la», если час 1. Кроме того, момент использует только эти слова в своей функции .calendar(), например, при создании фразы типа "mañana a las 13:17". Обычная дата, отформатированная с помощью .format('LLLL') в испанском языке, будет выглядеть примерно так: "sábado, 19 de marzo de 2016 13:17". Таким образом, вы можете убедиться, что «лас» - это именно то, что вы хотите в каждом случае.

  8. Название на этот вопрос было, как установить дату в полночь. Для этого я рекомендую использовать функцию startOf момента. m.startOf('day') задаст момент m для начала дня, то есть обычно полночь. Имейте в виду, что не каждый местный день фактически начинается в полночь в каждом часовом поясе. Из-за аномалий, таких как переход на летнее время , некоторые дни могут начаться в 1:00. Например, это происходит в Бразилии 16 октября в этом году.

    Кроме того, если вы создали момент в режиме UTC, вы можете сначала преобразовать его в локальный режим, а затем установить в начале дня. Если вы не хотите изменять исходный моментный объект, сначала обязательно клонируйте его.

    Собираем все это вместе:

    var m1 = moment.utc([2016,3,30]);
    var m2 = m1.clone().local().startOf('day');
    
    var now = moment();
    var diff = m1.diff(now, 'seconds');
    
23
Matt Johnson

Так что ответ довольно прост (извините, я не пытаюсь заставить вас чувствовать себя глупо;))

var date = new Date(Date.UTC(2016,03,30,0,0,0));
var localDate = new Date(2016,03,30,0,0);
var now = new Date();
var diff = (localDate.getTime()/1000) - (now.getTime()/1000);

var textnode = document.createTextNode(moment(date).format('dddd, DD.MM.YYYY') + ' a las ' + moment(date).format('HH:mm A'));
document.getElementsByClassName("date")[0].appendChild(textnode.cloneNode(true));

Использование конструктора по умолчанию для объекта Date дает вам локальный объект даты/времени в JavaScript.

0
CodingGorilla