Cómo convertir la marca de tiempo de Unix a la fecha del calendario moment.js

141

Tengo una marca de tiempo de Unix, y estoy tratando de convertirla en una fecha de calendario como MM/DD/YYYY. Hasta ahora, tengo esto:

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

Cuando intento imprimir la fecha del calendario, la ventana dice "Fecha inválida". ¿Puede alguien ayudarme?

Andrés
fuente

Respuestas:

364

Usando moment.js como lo solicitó, hay un unixmétodo que acepta marcas de tiempo de Unix en segundos:

var dateString = moment.unix(value).format("MM/DD/YYYY");
Matt Johnson-Pint
fuente
3
Esa no es una fecha calendario.
Ian Warburton
1
@IanWarburton: ¿no es así?
Matt Johnson-Pint
Supongo que está de acuerdo con la pregunta. Pero creo que una fecha de calendario en moment.js se ve así ... momento (nueva Fecha (item.date)). Calendar ()
Ian Warburton
55
@IanWarburton: no necesitaría el nuevo objeto de fecha allí. La calendarfunción es agradable ( documentos aquí ), pero no en el formato que solicitó el OP.
Matt Johnson-Pint
1
Vale la pena señalar por qué falla la pregunta, pero esto funciona. La razón es porque monent(number) espera una marca de tiempo Unix en mili segundos (que es consistente con el Dateobjeto), mientras que la marca de tiempo Unix es en cuestión de segundos por defecto. Por lo tanto, también podría hacerlo en moment(value*1000)lugar de hacerlo moment.unix(value), pero usarlo unixes más claro.
icc97
39

La marca de tiempo UNIX es un recuento de segundos desde 1970, por lo que debe convertirlo al objeto JS Date:

var date = new Date(unixTimestamp*1000);
Cris
fuente
Sí, esa fue la solución con la última versión de moment, o al menos la que obtuve de npm recientemente. aunque obtuve el .unix () desde el momento en que tuve que * 1000 al instanciarlo nuevamente. por ejemplo: moment (moment (). unix () * 1000)
kroe
La mejor respuesta en comparación con la lógica de moment.js
Andris
19

Moment.js proporciona formatos localizados que se pueden usar.

Aquí hay un ejemplo:

const moment = require('moment');

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

console.log(formatted); // "02/24/2018"
Benny Neugebauer
fuente
4
new moment(timeStamp,'yyyyMMddHHmmssfff').toDate()
Mohamed.Abdo
fuente
9
Si bien este código puede responder la pregunta, sería mejor incluir algo de contexto, explicar cómo funciona y describir cuándo usarlo. Las respuestas de solo código no son útiles a largo plazo. Además, su código no está formateado correctamente.
ryanyuyu
4

Solo eso

moment.unix(date).toDate();
Danillo Leão Lopes
fuente
3

Puede ser un poco tarde, pero para nuevos problemas como este, uso este código:

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

Puede cambiar el formato para que coincida con sus necesidades y también agregar una zona horaria como esta:

moment(timestamp, 'X').tz(timezone).format('lll');
Eduardo Sanchez G
fuente
1
Este es el mejor método que he visto aquí.
LukeVenter
1
Solo para agregar a esta respuesta (que es la respuesta más correcta aquí). Use minúsculas xpara la marca de tiempo ms unix. Documentación aquí
JonTroncoso
0

Lo arreglé como este ejemplo.

$scope.myCalendar = new Date(myUnixDate*1000);
<input date-time ng-model="myCalendar" format="DD/MM/YYYY" />
Khachornchit Songsaen
fuente
0
$(document).ready(function() {
    var value = $("#unixtime").val(); //this retrieves the unix timestamp
    var dateString = moment(value, 'MM/DD/YYYY', false).calendar(); 
    alert(dateString);
});

Hay un modo estricto y un modo de perdón .

Si bien el modo estricto funciona mejor en la mayoría de las situaciones, el modo de perdón puede ser muy útil cuando el formato de la cadena que se pasa al momento puede variar.

En una versión posterior, el analizador usará de manera predeterminada el modo estricto. El modo estricto requiere que la entrada del momento coincida exactamente con el formato especificado, incluidos los separadores. El modo estricto se establece pasando true como el tercer parámetro a la función de momento.

Un escenario común en el que el modo de perdón es útil es en situaciones en las que una API de terceros proporciona la fecha, y el formato de fecha para esa API podría cambiar. Suponga que una API comienza enviando fechas en formato 'AAAA-MM-DD', y luego cambia al formato 'MM / DD / AAAA'.

En modo estricto, el siguiente código da como resultado que se muestre 'Fecha inválida':

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

En el modo indulgente con una cadena de formato, obtiene una fecha incorrecta:

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

otra forma sería

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

Esta función crea la fecha de la marca de tiempo:

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

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

        return parsed.format('MMM D, YYYY, HH:mmA')
    }
Bill Zelenko
fuente
0
moment(1454521239279).toDate()
moment(1454521239279).format()
Vincent
fuente
0
moment(timestamp).format('''any format''')
Rishabh Mehrotra
fuente
3
Si bien este código puede resolver el problema del OP, es mejor incluir una explicación sobre cómo su código aborda el problema del OP. De esta forma, los futuros visitantes pueden aprender de su publicación y aplicarla a su propio código. SO no es un servicio de codificación, sino un recurso para el conocimiento. Además, es más probable que se voten las respuestas completas de alta calidad. Estas características, junto con el requisito de que todas las publicaciones sean independientes, son algunos de los puntos fuertes de SO como plataforma, que lo diferencia de los foros. Puede editar para agregar información adicional y / o complementar sus explicaciones con la documentación de origen.
ysf