Я, как правило, являюсь разработчиком на стороне сервера, чувствую себя немного как рыба из воды, пытающаяся отобразить значения времени на внешней стороне. Как я могу получить поведение, подобное функциям PHP date () и strtotime () из moment.js? Я просто хочу, чтобы метка времени Unix отображалась в формате H: i: s, и наоборот.
До сих пор я пробовал следующее из существующего примера кода и документации:
moment(timestamp).format(H:i:s);
moment().duration(timestamp).format(H:i:s);
moment.unix(timestamp).format(h:mm:ss);
moment(formatted,'H:i:s');
Ни один из них не работал должным образом. Это может быть помечено как повторяющееся, поскольку существует множество вопросов об моментах.js, но я не знаю, были ли это обновления самой библиотеки или немного другой контекст, я не нашел ни одного существующего решения, которое бы сработало для меня.
У кого-нибудь есть предложения по этим двум простым задачам?
РЕДАКТИРОВАТЬ:
Я вычленил две разные проблемы из этого. Во-первых, это работает на момент документы сказать должны работать дают странные значения:
moment(1437462000).format('h:mm:ss')
например, который должен вернуть 7:00:00 UTC, возвращает 10:17:42. Это можно исправить в этом случае, используя вместо этого параметр moment.unix (1437462000) .utc (). Format (‘h: mm: ss’), но это приводит ко второй проблеме — функция .utc (), похоже, игнорируется при обратном преобразовании даты в метку времени:
timestamp = moment(formatted,'DD/MM/YYYY H:m:s').utc().unix();
будет по-прежнему возвращать значение, исправленное в часовом поясе (в моем случае это неверно на несколько часов, поскольку форматированное время не имеет никакого отношения к клиентскому компьютеру), независимо от того, включена функция .utc () или нет.
Несколько вещей, которые вы должны понять:
Метки времени Unix должны всегда с точки зрения UTC. Они никогда не корректируются для часового пояса в числовой форме. Если они настроены на часовой пояс, это делается во время интерпретации числа, а не в его представлении.
В то время как «метка времени Unix» традиционно секунд, многие среды используют миллисекунды вместо. РНР date
временные метки основаны на секундах, в то время как момент и JavaScript Date
объект как использовать миллисекунды по умолчанию. С использованием moment.unix
Функция позволит вам передавать секунды и идентична простому умножению отметки времени на 1000.
Момент имеет два встроенных режима, местный а также универсальное глобальное время. Режим по умолчанию местный. Неважно, что вы вводите, если вы не указали UTC, момент будет настроен на локальный. Чтобы указать UTC, вы используете utc
функция. Есть две формы функции:
moment.utc(input) // parsing form
moment(input).utc() // conversion form
Обе формы требуют некоторого ввода и приводят к мгновению в режиме UTC. Разница в том, как вход интерпретированы. В любом случае, если входное значение однозначно, результат тот же. Для строк это означает, что вход будет содержать Z
(из ISO8601), или смещение на основе UTC. Все остальные формы неоднозначны. Например, если я пройду "2015-11-08 01:23:45"
Я получу разные результаты в зависимости от того, интерпретирую ли я эту строку как местное время или как UTC.
Для чисел они всегда интерпретированы в миллисекундах в UTC. Однако, если вы используете moment(number)
без того звонка .utc()
тогда момент остается в местный режим, поэтому любой вывод будет отображаться как местное время.
Когда вы звоните moment.unix(input)
, ввод является количеством секунд, но момент остается в местный Режим. Таким образом, чтобы отобразить время UTC, вы должны использовать moment.unix(input).utc()
,
Если ваши предварительно записанные временные метки из другой системы представлены в числовой форме, но откорректированы вне UTC, то они неверны. У вас плохие данные, и Момент не может помочь вам, если вы не знаете конкретно как они отклонились, и вы пишете код для противодействия этому.
Форматеры Moment чувствительны к регистру. M
месяцы, m
минут. H
это часы на 24-часовой основе, h
это часы на 12-часовых часах. Используйте две последовательные буквы, если вы хотите добавить нулевое заполнение. Пример, HH:mm:ss
за 13:02:03
против h:m:s
за 1:2:3
,
минутное X
Форматеру не важно, в каком режиме находится момент. Он всегда будет излучать секунды в формате UTC. Аналогично x
форматер возвращает миллисекунды в UTC, как и moment.valueOf()
,
Кроме того, ваш последний пример:
moment.unix(1437462000).utc().format()
Возвращает "2015-07-21T07:00:00+00:00"
— что я считаю, ценность, которую вы ожидали.
Вы также получаете одну и ту же оригинальную временную метку независимо от того, какую из них вы пытаетесь:
moment.unix(1437462000).utc().format("X") // "1437462000"moment.unix(1437462000).format("X") // "1437462000"moment.unix(1437462000).utc().unix() // 1437462000
moment.unix(1437462000).unix() // 1437462000
Для тех, кто приходит и все еще ищет прямые эквиваленты PHP для date () и strtotime (), вот те, которые я в итоге использовал. Совпадение с php в основном означает просто полное игнорирование любого вида информации о местном времени, убедившись, что все в UTC. Эта задача немного отличается между timestamp-> Дата а также Дата-> Отметка времени случаи, так что вы должны быть осторожны.
Дата()
Преобразование метки времени в форматированную дату без какой-либо коррекции часового пояса клиента
var formatted = moment.unix(timestamp).utc().format('h:mm:ss');
StrToTime ()
Преобразование даты в формате UTC обратно в метку времени без ее корректировки на местное время:
var new_timestamp = moment.utc(formatted_utc,'DD/MM/YYYY H:m:s').format('X')
//where 'DD/MM/YYYY H:m:s' is the formatted date's format, and
//'X' outputs a unix timestamp without milliseconds.
Заметки: