Converter um carimbo de data / hora do Unix em JavaScript


1159

Estou armazenando tempo em um banco de dados MySQL como um carimbo de data / hora Unix e que é enviado para algum código JavaScript. Como eu tiraria esse tempo?

Por exemplo, no formato HH / MM / SS.


5
Apenas multiplique por 1000, pois os carimbos de data e hora JS estão em milissegundos e o PHP entrega em segundos.
Ankr

Aqui está um link muito útil com formato de data diferente: timestamp.online/article/… Combine com a multiplicação por 1000 e ele fará o trabalho!
Kevin Lemaire

Respostas:


1735

let unix_timestamp = 1549312452
// Create a new JavaScript Date object based on the timestamp
// multiplied by 1000 so that the argument is in milliseconds, not seconds.
var date = new Date(unix_timestamp * 1000);
// Hours part from the timestamp
var hours = date.getHours();
// Minutes part from the timestamp
var minutes = "0" + date.getMinutes();
// Seconds part from the timestamp
var seconds = "0" + date.getSeconds();

// Will display time in 10:30:23 format
var formattedTime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);

console.log(formattedTime);

Para obter mais informações sobre o objeto Data, consulte a especificação MDN ou ECMAScript 5 .


114
As multiplicações do @nickf são triviais nas CPUs modernas - a concatenação de strings exigirá muito mais trabalho!
Alnitak

4
A concatenação deve consistir na leitura da memória e na escrita da memória ... como alguém poderia projetar algo que requer algo simples, como acrescentar e torná-lo mais complicado do que a multiplicação ... peça para uma criança concatenar e pode ... a multiplicação é mais difícil ... além disso, a memória é projetada para funcionar linearmente de qualquer maneira ... Alguém pode fornecer uma referência ao comentário @nickf?

29
Na verdade ele irá exibir o tempo em '10: 2: formato de 2' , uma vez que não adicionar um extra de 0 antes de valores abaixo de 10.
Fireblaze

16
@ user656925 - A multiplicação envolve números, a concatenação envolve seqüências de caracteres. Os computadores lidam com números de maneira muito mais eficiente que as strings. Quando a concatenação de cadeias é concluída, há muito gerenciamento de memória em segundo plano. (No entanto, se você já está fazendo uma concatenação de cadeias de caracteres de qualquer maneira, incluir alguns caracteres extras em uma das cadeias pode, na verdade, ser menos caro, em média, do que a operação de um processador necessário para multiplicar dois números.)
Brilliand

6
A computação numérica @Stallman é a coisa mais fundamental que os computadores fazem e são extremamente eficientes, tanto na memória quanto no tempo de execução. O comentário de Brilliand acima é relevante, embora IMHO a parte final de seu comentário seja completamente falsa.
Alnitak

298

function timeConverter(UNIX_timestamp){
  var a = new Date(UNIX_timestamp * 1000);
  var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  var year = a.getFullYear();
  var month = months[a.getMonth()];
  var date = a.getDate();
  var hour = a.getHours();
  var min = a.getMinutes();
  var sec = a.getSeconds();
  var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
  return time;
}
console.log(timeConverter(0));


para HH / MM / SS, basta usar as três últimas variáveis ​​e este será o horário local, mas se você quiser obter o horário UTC, use os métodos getUTC. Aqui está o código.
shomrat 21/05

36
Eu usei essa solução, mas tweaked-lo para que minutos e segundos iria aparecer como: 03 ou: 09 em vez de 3 ou: 9, assim:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189

3
Bug: getMonth()retorna um número de mês entre 0 e 11, portanto a.getMonth() - 1está errado.
precisa saber é o seguinte

195

O JavaScript funciona em milissegundos, portanto, primeiro você terá que converter o carimbo de data e hora do UNIX de segundos para milissegundos.

var date = new Date(UNIX_Timestamp * 1000);
// Manipulate JavaScript Date object here...

80

Sou parcial na Date.format()biblioteca de Jacob Wright , que implementa a formatação de data JavaScript no estilo da date()função do PHP .

new Date(unix_timestamp * 1000).format('h:i:s')

12
Eu sei que foi uma boa resposta em alguns dias, mas hoje em dia a extensão de objetos js nativos é um anti-padrão.
Peter

3
Ele não funciona (mais?) No nó js format is not a function. Mas isso aparentemente funciona: stackoverflow.com/a/34015511/7550772
ibodi

71

Usar:

var s = new Date(1504095567183).toLocaleDateString("en-US")
console.log(s)
// expected output "8/30/2017"  

e por tempo:

var s = new Date(1504095567183).toLocaleTimeString("en-US")
console.log(s)
// expected output "3:19:27 PM"

consulte Date.prototype.toLocaleDateString ()


Este é um comando para obter a data (M / D / AAAA), não a hora (HH / MM / SS), conforme solicitado.
Wolfgang

2
apenas uma observação, o número "1504095567183" é unix_timestamp * 1000
camillo777 28/02

1
Além disso, toLocaleStringinclui data e hora.
Sean

56

Aqui está a solução de uma linha mais curta para formatar segundos como hh:mm:ss:

/**
 * Convert seconds to time string (hh:mm:ss).
 *
 * @param Number s
 *
 * @return String
 */
function time(s) {
    return new Date(s * 1e3).toISOString().slice(-13, -5);
}

console.log( time(12345) );  // "03:25:45"

O método Date.prototype.toISOString()retorna o tempo no formato ISO 8601 estendido simplificado , que sempre possui 24 ou 27 caracteres ( YYYY-MM-DDTHH:mm:ss.sssZou seja, ±YYYYYY-MM-DDTHH:mm:ss.sssZrespectivamente). O fuso horário é sempre zero deslocamento UTC.

Nota: esta solução não requer bibliotecas de terceiros e é suportada em todos os navegadores modernos e mecanismos JavaScript.


Estou colando sua função no console do Chrome: / Mesmo no seu violino está sendo exibido 01:02:00 para mim! Tentei no Firefox, mesmos resultados. Muito estranho ... Eu tenho certeza que é porque eu sou GMT + 1!
21417 Steve Steveillill

Ofereci uma edição para sua resposta que ignora qualquer fuso horário, para que ela sempre mostre o valor formatado correto!
21417 Steve Chamaillard

1
@SteveChamaillard Obrigado, Steve. Você estava certo, toTimeStringnão estava funcionando bem com fusos horários. Infelizmente, sua edição foi rejeitada antes que eu a visse. No entanto, eu sugiro usar toISOString, pois toGMTStringestá obsoleto e pode retornar resultados diferentes em plataformas diferentes.
VisioN

Ainda mais curto com ES6: deixar o tempo = S => new Date (s * 1e3) .toISOString slice () (-13, -5).
SamGoody

28

Eu pensaria em usar uma biblioteca como momentjs.com , que torna isso realmente simples:

Com base em um carimbo de data / hora Unix:

var timestamp = moment.unix(1293683278);
console.log( timestamp.format("HH/mm/ss") );

Com base em uma string de data do MySQL:

var now = moment("2010-10-10 12:03:15");
console.log( now.format("HH/mm/ss") );

3
Outra vantagem do moment.js (ou bibliotecas similares) seria o suporte a tempo relativo , para mensagens como "6 horas atrás".
martin

Nos seus console.logexemplos, fiquei confuso com o formato devido ao arquivo /, mas isso me ajudou muito.
NetOperator Wibby

Meu registro de data e hora está no formato UTC. Alguma mudança que eu precise fazer aqui para isso? Como posso ter am / pm?
codec

O moment.js é um exagero para uma coisa tão pequena e afetará seu desempenho. Use métodos nativos, cf. Resposta de Dan Alboteanu
Robin Métral 10/03/19

22

O carimbo de data e hora do UNIX é o número de segundos desde 00:00:00 UTC em 1 de janeiro de 1970 (de acordo com a Wikipedia ).

O argumento Data do objeto em Javascript é o número de milissegundos desde 00:00:00 UTC em 1 de janeiro de 1970 (de acordo com a documentação do W3Schools Javascript ).

Veja o código abaixo, por exemplo:

    function tm(unix_tm) {
        var dt = new Date(unix_tm*1000);
        document.writeln(dt.getHours() + '/' + dt.getMinutes() + '/' + dt.getSeconds() + ' -- ' + dt + '<br>');

    }

tm(60);
tm(86400);

dá:

1/1/0 -- Thu Jan 01 1970 01:01:00 GMT+0100 (Central European Standard Time)
1/0/0 -- Fri Jan 02 1970 01:00:00 GMT+0100 (Central European Standard Time)

19

solução one-liner mais curta para formatar segundos como hh: mm: ss: variante:

console.log(new Date(1549312452 * 1000).toISOString().slice(0, 19).replace('T', ' '));
// "2019-02-04 20:34:12"


1
ao usar isso com registros de data e hora unix do PHP, recebo + 5h do que o tempo real por algum motivo: /
keanu_reeves

2
@keanu_reeves - parece que você está no fuso horário do leste dos EUA e os carimbos de hora são UTC. Tente remover o .slice (0,19) e acho que você verá que o fuso horário do resultado é Z (Zulu).
bitfiddler

17

Usando Moment.js , você pode obter data e hora assim:

var dateTimeString = moment(1439198499).format("DD-MM-YYYY HH:mm:ss");

E você pode obter apenas tempo usando isso:

var timeString = moment(1439198499).format("HH:mm:ss");

Você sabe como fazer isso ao contrário, como converter este formato DD-MM-AAAA HH: mm: ss para algo como este 1439198499 ??
Kemat Rochi

Oi Kemat, Você pode fazê-lo através deste momento declaração ( '2009-07-15 00:00:00') unix ().
Peter T.

Meu registro de data e hora está no formato UTC. Alguma diferença que eu precise fazer aqui para isso? Como posso ter am / pm?
codec

Você pode facilmente converter o registro de data e hora em data de momento momentJS, faça o check-out deste coderszine.com/convert-timestamp-to-date-using-javascript
Laeeq

15

O problema com as soluções acima mencionadas é que, se hora, minuto ou segundo, tiver apenas um dígito (ou seja, 0-9), o horário estará errado, por exemplo, pode ser 2: 3: 9, mas deve ser 02: 03:09.

De acordo com esta página , parece ser uma solução melhor para usar o método "toLocaleTimeString" da Date.


5
para a maioria das soluções da web, essa é a resposta mais correta, pois usa a localidade do cliente, por exemplo, formato 24h vs. 12h am / pm. Para uma sequência de tempo, você usaria:date.toLocaleTimeString()
Bachi

1
Isso não vai acontecer com o toTimeStringmétodo Verifique aqui: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Outra maneira - a partir de uma data ISO 8601 .

var timestamp = 1293683278;
var date = new Date(timestamp * 1000);
var iso = date.toISOString().match(/(\d{2}:\d{2}:\d{2})/)
alert(iso[1]);


Recebo "Objeto ... não tem método 'toISOString'"
Aviram Netanel

Meu registro de data e hora está no formato UTC. Alguma diferença que eu precise fazer aqui para isso? Como posso ter am / pm?
codec

13

No momento, você deve usar o carimbo de data / hora unix:

var dateTimeString = moment.unix(1466760005).format("DD-MM-YYYY HH:mm:ss");

10

Com base na resposta do @ shomrat, aqui está um trecho que grava automaticamente a data e hora dessa maneira (um pouco semelhante à data de respostas do StackOverflow:) answered Nov 6 '16 at 11:51:

today, 11:23

ou

yersterday, 11:23

ou (se diferente, mas no mesmo ano que hoje)

6 Nov, 11:23

ou (se outro ano que hoje)

6 Nov 2016, 11:23

function timeConverter(t) {     
    var a = new Date(t * 1000);
    var today = new Date();
    var yesterday = new Date(Date.now() - 86400000);
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var year = a.getFullYear();
    var month = months[a.getMonth()];
    var date = a.getDate();
    var hour = a.getHours();
    var min = a.getMinutes();
    if (a.setHours(0,0,0,0) == today.setHours(0,0,0,0))
        return 'today, ' + hour + ':' + min;
    else if (a.setHours(0,0,0,0) == yesterday.setHours(0,0,0,0))
        return 'yesterday, ' + hour + ':' + min;
    else if (year == today.getFullYear())
        return date + ' ' + month + ', ' + hour + ':' + min;
    else
        return date + ' ' + month + ' ' + year + ', ' + hour + ':' + min;
}

9

A solução moderna que não precisa de uma biblioteca de 40 KB:

Intl.DateTimeFormat é a maneira não culturalmente imperialista de formatar uma data / hora.

// Setup once
var options = {
    //weekday: 'long',
    //month: 'short',
    //year: 'numeric',
    //day: 'numeric',
    hour: 'numeric',
    minute: 'numeric',
    second: 'numeric'
},
intlDate = new Intl.DateTimeFormat( undefined, options );

// Reusable formatter
var timeStamp = 1412743273;
console.log( intlDate.format( new Date( 1000 * timeStamp ) ) );

Quanto ao "caminho não culturalmente imperialista" : você não quer dizer "o caminho não cultural e não imperialista" ?
Peter Mortensen

Infelizmente esse método não é compatível com o Safari.
Stephen S.

9

Meu registro de data e hora está sendo buscado em um back-end do PHP. Eu tentei todos os métodos acima e não funcionou. Encontrei um tutorial que funcionava:

var d =val.timestamp;
var date=new Date(+d); //NB: use + before variable name

console.log(d);
console.log(date.toDateString());
console.log(date.getFullYear());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getHours());
console.log(date.toLocaleTimeString());

os métodos acima irão gerar esses resultados

1541415288860
Mon Nov 05 2018 
2018 
54 
48 
13
1:54:48 PM

Existem vários métodos que funcionam perfeitamente com registros de data e hora. Não posso listá-los todos


8
function getTIMESTAMP() {
  var date = new Date();
  var year = date.getFullYear();
  var month = ("0" + (date.getMonth() + 1)).substr(-2);
  var day = ("0" + date.getDate()).substr(-2);
  var hour = ("0" + date.getHours()).substr(-2);
  var minutes = ("0" + date.getMinutes()).substr(-2);
  var seconds = ("0" + date.getSeconds()).substr(-2);

  return year + "-" + month + "-" + day + " " + hour + ":" + minutes + ":" + seconds;
}

//2016-01-14 02:40:01

Funciona bem. Obrigado
Vlad

6

Preste atenção ao problema zero com algumas das respostas. Por exemplo, o registro de data 1439329773e hora seria convertido por engano em12/08/2015 0:49 .

Eu sugeriria usar o seguinte para superar esse problema:

var timestamp = 1439329773; // replace your timestamp
var date = new Date(timestamp * 1000);
var formattedDate = ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
console.log(formattedDate);

Agora resulta em:

12/08/2015 00:49

5
// Format value as two digits 0 => 00, 1 => 01
function twoDigits(value) {
   if(value < 10) {
    return '0' + value;
   }
   return value;
}

var date = new Date(unix_timestamp*1000);
// display in format HH:MM:SS
var formattedTime = twoDigits(date.getHours()) 
      + ':' + twoDigits(date.getMinutes()) 
      + ':' + twoDigits(date.getSeconds());

Não acho que você precise de uma função extra e separada para obter um número com zero à direita, sempre que necessário - veja minha resposta na parte inferior.
Trejder

2
@trejder, no seu exemplo, você DUPLICA a lógica, enquanto com a função extra você a tem em um só lugar. Você também aciona a função date (por exemplo, getHours ()) sempre duas vezes enquanto estiver aqui - é uma chamada única. Você nunca pode saber o quão pesada é alguma função da biblioteca a ser reexecutada (no entanto, eu acredito que seja leve para datas).
walv

4
function timeConverter(UNIX_timestamp){
 var a = new Date(UNIX_timestamp*1000);
     var hour = a.getUTCHours();
     var min = a.getUTCMinutes();
     var sec = a.getUTCSeconds();
     var time = hour+':'+min+':'+sec ;
     return time;
 }

4

Consulte Conversor de Data / Época .

Você precisa ParseInt, caso contrário não funcionaria:


if (!window.a)
    window.a = new Date();

var mEpoch = parseInt(UNIX_timestamp);

if (mEpoch < 10000000000)
    mEpoch *= 1000;

------
a.setTime(mEpoch);
var year = a.getFullYear();
...
return time;

4

Você pode usar a seguinte função para converter seu carimbo de data / hora em HH:MM:SSformato:

var convertTime = function(timestamp, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    var date = timestamp ? new Date(timestamp * 1000) : new Date();
    return [
        pad(date.getHours()),
        pad(date.getMinutes()),
        pad(date.getSeconds())
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

Sem passar um separador, ele usa :como separador (padrão):

time = convertTime(1061351153); // --> OUTPUT = 05:45:53

Se você deseja usar /como separador, apenas passe-o como o segundo parâmetro:

time = convertTime(920535115, '/'); // --> OUTPUT = 09/11/55

Demo

var convertTime = function(timestamp, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    var date = timestamp ? new Date(timestamp * 1000) : new Date();
    return [
        pad(date.getHours()),
        pad(date.getMinutes()),
        pad(date.getSeconds())
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

document.body.innerHTML = '<pre>' + JSON.stringify({
    920535115 : convertTime(920535115, '/'),
    1061351153 : convertTime(1061351153, ':'),
    1435651350 : convertTime(1435651350, '-'),
    1487938926 : convertTime(1487938926),
    1555135551 : convertTime(1555135551, '.')
}, null, '\t') +  '</pre>';

Veja também este violino .


3

 function getDateTimeFromTimestamp(unixTimeStamp) {
        var date = new Date(unixTimeStamp);
        return ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
      }

    var myTime = getDateTimeFromTimestamp(1435986900000);
    console.log(myTime); // output 01/05/2000 11:00


Este não é um carimbo de data / hora do Unix: 1435986900000 / Este é um carimbo de data / hora do Unix: 1435986900
Orici

esta solução funciona para mim, mas como posso aproveitar o mês como fevereiro e março em vez do número?
abidinberkay 31/03

2

Se você deseja converter a duração do tempo Unix em horas, minutos e segundos reais, use o seguinte código:

var hours = Math.floor(timestamp / 60 / 60);
var minutes = Math.floor((timestamp - hours * 60 * 60) / 60);
var seconds = Math.floor(timestamp - hours * 60 * 60 - minutes * 60 );
var duration = hours + ':' + minutes + ':' + seconds;

1
function getDateTime(unixTimeStamp) {

    var d = new Date(unixTimeStamp);
    var h = (d.getHours().toString().length == 1) ? ('0' + d.getHours()) : d.getHours();
    var m = (d.getMinutes().toString().length == 1) ? ('0' + d.getMinutes()) : d.getMinutes();
    var s = (d.getSeconds().toString().length == 1) ? ('0' + d.getSeconds()) : d.getSeconds();

    var time = h + '/' + m + '/' + s;

    return time;
}

var myTime = getDateTime(1435986900000);
console.log(myTime); // output 01/15/00

1

O código abaixo também fornece milissegundos de três dígitos, ideal para prefixos de log do console:

const timeStrGet = date => {
    const milliSecsStr = date.getMilliseconds().toString().padStart(3, '0') ;
    return `${date.toLocaleTimeString('it-US')}.${milliSecsStr}`;
};

setInterval(() => console.log(timeStrGet(new Date())), 299);



1

A resposta dada pelo @Aron funciona, mas não funcionou para mim, pois eu estava tentando converter o carimbo de data / hora a partir de 1980. Portanto, fiz algumas alterações da seguinte maneira

function ConvertUnixTimeToDateForLeap(UNIX_Timestamp) {
    var dateObj = new Date(1980, 0, 1, 0, 0, 0, 0);
    dateObj.setSeconds(dateObj.getSeconds() + UNIX_Timestamp);
    return dateObj;  
}

document.body.innerHTML = 'TimeStamp : ' + ConvertUnixTimeToDateForLeap(1269700200);

Portanto, se você tiver um registro de data e hora a partir de mais uma década, use-o. Isso salvou muita dor de cabeça para mim.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.