Как преобразовать временную метку unix в календарную дату moment.js

150

У меня есть временная метка unix, и я пытаюсь преобразовать ее в календарную дату, например MM/DD/YYYY. Пока у меня есть это:

$(document).ready(function() {
  var value = $("#unixtime").val(); //this retrieves the unix timestamp
  var dateString = moment(value).calendar(); 
  alert(dateString);
});

Когда я пытаюсь распечатать календарную дату, в окне появляется сообщение «Недействительная дата». Может кто-нибудь мне помочь?

Андрей
источник

Ответы:

391

Используя moment.js, как вы просили, есть unixметод, который принимает временные метки unix в секундах:

var dateString = moment.unix(value).format("MM/DD/YYYY");
Мэтт Джонсон-Пинт
источник
3
Это не календарная дата.
Ян Уорбертон,
1
@IanWarburton - это не так ??
Мэтт Джонсон-Пинт,
Я полагаю, это в соответствии с вопросом. Но я думаю, что календарная дата в moment.js выглядит так .... moment (new Date (item.date)). Calendar ()
Ян Уорбертон,
5
@IanWarburton - вам не понадобится новый объект даты. calendarФункция хорошие ( документы здесь ), но не в том формате , что ОП просили.
Мэтт Джонсон-Пинт,
3
Стоит отметить, почему вопрос не работает, но это работает. Причина заключается в том, потому что monent(number) ожидает отметку времени UNIX в милли секунд (что согласуется с Dateобъектом), в то время как временная метка Unix в секундах по умолчанию. Так что вы также можете сделать moment(value*1000)вместо moment.unix(value), но использование unixболее понятное.
icc97,
39

Временная метка UNIX - это количество секунд с 1970 года, поэтому вам нужно преобразовать ее в объект JS Date:

var date = new Date(unixTimestamp*1000);
Крис
источник
Да, это было решение с последней версией момента, или, по крайней мере, с той, которую я недавно получил от npm. хотя я получил .unix () с того момента, когда мне пришлось * 1000 при повторном создании экземпляра. например: moment (moment (). unix () * 1000)
kroe
Лучший ответ по сравнению с логикой moment.js
Андрис
21

Moment.js предоставляет локализованные форматы, которые можно использовать.

Вот пример:

const moment = require('moment');

const timestamp = 1519482900000;
const formatted = moment(timestamp).format('L');

console.log(formatted); // "02/24/2018"
Бенни Нойгебауэр
источник
4
new moment(timeStamp,'yyyyMMddHHmmssfff').toDate()
Мохамед Абдо
источник
10
Хотя этот код может ответить на вопрос, было бы лучше включить некоторый контекст, объяснить, как он работает, и описать, когда его использовать. Ответы, содержащие только код, в конечном итоге бесполезны. Кроме того, ваш код неправильно отформатирован.
ryanyuyu
4

Может быть, немного поздно, но для новых проблем, подобных этой, я использую этот код:

moment(timestamp, 'X').format('lll');

Вы можете изменить формат в соответствии со своими потребностями, а также добавить часовой пояс следующим образом:

moment(timestamp, 'X').tz(timezone).format('lll');
Эдуардо Санчес Дж.
источник
1
Это лучший метод, который я видел здесь.
LukeVenter
1
Просто чтобы добавить к этому ответу (это самый правильный ответ здесь). Используйте строчные буквы xдля отметки времени ms unix. Документация здесь
JonTroncoso
4

Только его,

moment.unix(date).toDate();
Данилло Леау Лопес
источник
2
moment(1454521239279).toDate()
moment(1454521239279).format()
Винсент
источник
0

Я исправил это как в этом примере.

$scope.myCalendar = new Date(myUnixDate*1000);
<input date-time ng-model="myCalendar" format="DD/MM/YYYY" />
Хачорнчит Сонгсаен
источник
0
$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment(value, 'MM/DD/YYYY', false).calendar(); 
    alert(dateString);
});

Есть строгий режим и режим прощения .

Хотя строгий режим работает лучше в большинстве ситуаций, режим прощения может быть очень полезен, когда формат строки, передаваемой в момент, может отличаться.

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

Типичный сценарий, в котором режим прощения полезен, - это ситуации, когда сторонний API предоставляет дату, и формат даты для этого API может измениться. Предположим, что API начинает с отправки дат в формате «ГГГГ-ММ-ДД», а затем переходит в формат «ММ / ДД / ГГГГ».

В строгом режиме следующий код приводит к отображению «Invalid Date»:

moment('01/12/2016', 'YYYY-MM-DD', true).format()
"Invalid date"

В режиме прощения с использованием строки формата вы получаете неправильную дату:

moment('01/12/2016', 'YYYY-MM-DD').format()
"2001-12-20T00:00:00-06:00"

другой способ был бы

$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment.unix(value).calendar(); 
    alert(dateString);
});

Девон Кассиан
источник
0

Эта функция создает дату из отметки времени:

    function formatDateTime(dateString) {
        const parsed = moment(new Date(dateString))

        if (!parsed.isValid()) {
            return dateString
        }

        return parsed.format('MMM D, YYYY, HH:mmA')
    }
Билл Зеленко
источник
0
moment(timestamp).format('''any format''')
Ришаб Мехротра
источник
3
Хотя этот код может решить проблему OP, лучше всего включить объяснение того, как ваш код решает проблему OP. Таким образом, будущие посетители могут узнать из вашего сообщения и применить его к своему собственному коду. SO - это не сервис кодирования, а ресурс знаний. Кроме того, больше шансов получить качественные и полные ответы. Эти функции, наряду с требованием, чтобы все сообщения были автономными, являются одними из сильных сторон SO как платформы, которые отличает ее от форумов. Вы можете редактировать, чтобы добавить дополнительную информацию и / или дополнить свои пояснения исходной документацией.
ysf