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?

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");

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);

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"

4
new moment(timeStamp,'yyyyMMddHHmmssfff').toDate()

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


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');

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" />

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);
});

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')
    }

0
moment(1454521239279).toDate()
moment(1454521239279).format()

0
moment(timestamp).format('''any format''')

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.