javascript - Como formatar uma data UTC como uma string `YYYY-MM-DD hh:mm:ss` usando NodeJS?
Usando NodeJS, quero formatar um Date no seguinte formato de string:
var ts_hms = new Date(UTC);
ts_hms.format("%Y-%m-%d %H:%M:%S");
Como eu faço isso?
Resposta #1
Se você está usando Node.js, com certeza terá EcmaScript 5, e assim Date possui um método toISOString. Você está pedindo uma pequena modificação do ISO8601:
new Date().toISOString()
> '2012-11-04T14:51:06.157Z'
Então, basta cortar algumas coisas, e você está pronto:
new Date().toISOString().
replace(/T/, ' '). // replace T with a space
replace(/\..+/, '') // delete the dot and everything after
> '2012-11-04 14:55:45'
Ou, em uma linha: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')
ISO8601 é necessariamente UTC (também indicado pelo Z no final do primeiro resultado), então você obtém UTC por padrão (sempre uma coisa boa).
Resposta #2
ATUALIZAÇÃO 2021-10-06: Adicionado Day.js e removida edição espúria por @ashleedawg
ATUALIZAÇÃO 2021-04-07: Luxon adicionado por @Tampa.
ATUALIZAÇÃO 2021-02-28: Agora deve-se notar que Moment.js não está mais sendo desenvolvido ativamente. Ele não desaparecerá rapidamente porque está incorporado em muitas outras coisas. O site tem algumas recomendações de alternativas e uma explicação do motivo.
ATUALIZAÇÃO 2017-03-29: Adicionado date-fns, algumas notas sobre Moment e Datejs
ATUALIZAÇÃO 2016-09-14: Adicionado SugarJS, que parece ter algumas funções de data/hora excelentes.
OK, já que ninguém realmente forneceu uma resposta de verdade, aqui está a minha.
Uma biblioteca é certamente a melhor opção para lidar com datas e horários de maneira padrão. Existem muitos casos especiais nos cálculos de data/horário, então é útil poder delegar o desenvolvimento a uma biblioteca.
Aqui está uma lista das principais bibliotecas de formatação de tempo compatíveis com Node:
- Day.js [adicionado em 2021-10-06] "Alternativa rápida de 2kB ao Moment.js com a mesma API moderna"
- Luxon [adicionado em 29-03-2017, graças a Tampa] "Um wrapper poderoso, moderno e amigável para datas e horários em JavaScript." - MomentJS reconstruído do zero com tipos imutáveis, encadeamento e muito mais.
- Moment.js [graças a Mustafa] "Uma biblioteca de datas em javascript leve (4,3k) para analisar, manipular e formatar datas" - Inclui internacionalização, cálculos e formatos de datas relativos - Atualização 29-03-2017: Não tão leve assim, mas ainda a solução mais abrangente, especialmente se você precisar de suporte a fusos horários. - Atualização 28-02-2021: Não está mais em desenvolvimento ativo.
- date-fns [adicionado em 29-03-2017, graças a Fractalf] Pequeno, rápido, funciona com objetos de data padrão do JS. Ótima alternativa ao Moment se você não precisa de suporte a fuso horário.
- SugarJS - Uma biblioteca auxiliar geral que adiciona recursos muito necessários aos tipos de objetos nativos do JavaScript. Inclui algumas capacidades de data/hora com excelente aparência.
- strftime - Exatamente o que diz, simples e direto
- dateutil - Este é o que eu costumava usar antes do MomentJS
- node-formatdate
- TimeTraveller - "Time Traveller fornece um conjunto de métodos utilitários para lidar com datas. Desde adicionar e subtrair, até formatar. Time Traveller apenas estende objetos de data que cria, sem poluir o namespace global."
- Tempus [graças a Dan D] - ATUALIZAÇÃO: isso também pode ser usado com Node e implantado com npm, veja a documentação
Existem também bibliotecas não-Node:
- Datejs [graças a Peter Olson] - não está disponível em pacotes npm ou GitHub, então não é tão fácil de usar com Node - não é realmente recomendado, já que não é atualizado desde 2007!
Resposta #3
Há uma biblioteca para conversão:
npm install dateformat
Então escreva seu requisito:
var dateFormat = require('dateformat');
Então vincule o valor:
var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");
ver formato de data
Resposta #4
Eu não tenho nada contra bibliotecas em geral. Neste caso, uma biblioteca de uso geral parece exagerada, a menos que outras partes da aplicação processem datas intensamente.
Escrever pequenas funções utilitárias como esta também é um exercício útil tanto para programadores iniciantes quanto para experientes e pode ser uma experiência de aprendizado para os novatos entre nós.
function dateFormat (date, fstr, utc) {
utc = utc ? 'getUTC' : 'get';
return fstr.replace (/%[YmdHMS]/g, function (m) {
switch (m) {
case '%Y': return date[utc + 'FullYear'] (); // no leading zeros required
case '%m': m = 1 + date[utc + 'Month'] (); break;
case '%d': m = date[utc + 'Date'] (); break;
case '%H': m = date[utc + 'Hours'] (); break;
case '%M': m = date[utc + 'Minutes'] (); break;
case '%S': m = date[utc + 'Seconds'] (); break;
default: return m.slice (1); // unknown code, remove %
}
// add leading zero if required
return ('0' + m).slice (-2);
});
}
/* dateFormat (new Date (), "%Y-%m-%d %H:%M:%S", true) returns
"2012-05-18 05:37:21" */
Resposta #5
Confira o código abaixo e o link para o Objeto Date, Intl.DateTimeFormat
// var ts_hms = new Date(UTC);
// ts_hms.format("%Y-%m-%d %H:%M:%S")
// exact format
console.log(new Date().toISOString().replace('T', ' ').substring(0, 19))
// other formats
console.log(new Date().toUTCString())
console.log(new Date().toLocaleString('en-US'))
console.log(new Date().toString())
// log format
const parts = new Date().toString().split(' ')
console.log([parts[1], parts[2], parts[4]].join(' '))
// intl
console.log(new Intl.DateTimeFormat('en-US', {dateStyle: 'long', timeStyle: 'long'}).format(new Date()))Resposta #6
Forma facilmente legível e personalizável de obter um timestamp no formato desejado, sem o uso de qualquer biblioteca:
function timestamp(){
function pad(n) {return n<10 ? "0"+n : n}
d=new Date()
dash="-"
colon=":"
return d.getFullYear()+dash+
pad(d.getMonth()+1)+dash+
pad(d.getDate())+" "+
pad(d.getHours())+colon+
pad(d.getMinutes())+colon+
pad(d.getSeconds())
}
(Se você precisar de tempo no formato UTC, basta alterar as chamadas de função. Por exemplo, "getMonth" se torna "getUTCMonth")
Resposta #7
A biblioteca JavaScript sugar.js (http://sugarjs.com/) possui funções para formatar datas
Exemplo :
Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')
