Como formatar uma data UTC como uma string `YYYY-MM-DD hh: mm: ss` usando o NodeJS?

242

Usando o NodeJS, desejo formatar um Dateno seguinte formato de sequência:

var ts_hms = new Date(UTC);
ts_hms.format("%Y-%m-%d %H:%M:%S");

Como faço isso?

Tampa
fonte
4
É meio que incomodar sem bibliotecas. Eu recomendo usar datejs
Peter Olson
8
ou momentjs
Mustafa
ou Tempus
Dan D.
Tempus funcionou muito bem. Os problemas com anúncios serão momentâneos.
Tampa
1
Nem o Datejs nem o Tempus são bibliotecas do Node (embora possam ser usadas com o Node, você não pode usar o instalador da biblioteca npm). Como ninguém as colocou como respostas reais, eu mesmo fiz isso.
Julian Knight

Respostas:

531

Se você estiver usando o Node.js, certamente terá o EcmaScript 5 e, portanto, o Date terá um toISOStringmétodo. Você está solicitando uma ligeira modificação da ISO8601:

new Date().toISOString()
> '2012-11-04T14:51:06.157Z'

Então, basta cortar algumas coisas e 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 à direita no primeiro resultado), portanto, você obtém o UTC por padrão (sempre uma coisa boa).

chbrown
fonte
4
Solução inteligente e simples que evita o uso de bibliotecas - ótimo!
precisa saber é o seguinte
11
Caso você receba um erro, Object has no method 'toISOString'você perdeu #new
allenhwkim
29
Uma coisa a notar é que o uso de expressões regulares dessa maneira é lento e você nem precisa delas aqui, isto: new Date().toISOString().replace('T', ' ').substr(0, 19)funciona muito bem.
Killah
2
Observe que, ao remover o fuso horário, ele agora representa um momento diferente em cada fuso horário com um deslocamento diferente.
RobG
1
@RobG Você pode dizer isso sobre qualquer representação de data e hora que não tenha um fuso horário explícito.
26416 Phil
105

ATUALIZAÇÃO 29-03-2017: Adicionado data-fns, algumas notas sobre Moment e Datejs
ATUALIZAÇÃO 14-09-2016 : Adicionado SugarJS que parece ter excelentes funções de data / hora.


OK, já que ninguém realmente forneceu uma resposta real, aqui está a minha.

Uma biblioteca é certamente a melhor aposta para lidar com datas e horas de maneira padrão. Existem muitos casos extremos nos cálculos de data / hora, portanto, é útil poder transferir o desenvolvimento para uma biblioteca.

Aqui está uma lista das principais bibliotecas de formatação de hora compatíveis com o Nó:

  • Moment.js [ graças a Mustafa ] "Uma biblioteca de datas javascript leve (4,3k) para analisar, manipular e formatar datas" - Inclui internacionalização, cálculos e formatos de datas relativas - Atualização 2017-03-29 : não é tão leve mais, mas ainda assim, a solução mais abrangente, especialmente se você precisar de suporte para fuso horário.
  • date-fns [ adicionado em 29-03-2017, graças ao Fractalf ] Pequeno e rápido, trabalha com objetos de data JS padrão. Ótima alternativa ao Moment se você não precisar de suporte de fuso horário.
  • SugarJS - Uma biblioteca auxiliar geral que adiciona recursos muito necessários aos tipos de objetos internos do JavaScripts. Inclui alguns recursos excelentes de data / hora.
  • strftime - Exatamente o que diz, legal e simples
  • dateutil - Esse é o que eu costumava usar antes do MomentJS
  • data do formato do nó
  • TimeTraveller - "O Time Traveler fornece um conjunto de métodos utilitários para lidar com datas. Da adição e subtração, à formatação. O Time Traveler apenas estende os objetos de data que ele cria, sem poluir o espaço para nome global."
  • Tempus [graças a Dan D] - UPDATE: isso também pode ser usado com o Node e implantado com o npm, consulte os documentos

Também existem bibliotecas que não são de nós:

  • Datejs [graças a Peter Olson] - não empacotado no npm ou no GitHub, portanto, não é tão fácil de usar com o Node - não é realmente recomendado, pois não é atualizado desde 2007!
Julian Knight
fonte
2
Isso também é altamente relevante date-fns.org ( github.com/date-fns/date-fns )
Fractalf 12/12/16
Os populares (s) por detrás do momento têm um experimento chamado Luxon como de fevereiro 2018 moment.github.io/luxon/index.html
alxndr
Obrigado @alxndr, parece uma reinicialização útil.
Julian Knight
Momento + toISOString () no runkit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane
70

Há uma biblioteca para conversão:

npm install dateformat

Em seguida, escreva sua exigência:

var dateFormat = require('dateformat');

Em seguida, vincule o valor:

var day=dateFormat(new Date(), "yyyy-mm-dd h:MM:ss");

veja dateformat

Onder OZCAN
fonte
14
O que é result.request_date?
Dan Dascalescu 01/09/16
45

Não tenho nada contra bibliotecas em geral. Nesse caso, uma biblioteca de uso geral parece um exagero, a menos que outras partes do processo de aplicação tenham grandes datas.

Escrever pequenas funções utilitárias como essa também é um exercício útil para programadores iniciantes e talentosos 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"  */
HBP
fonte
25
Embora isso possa realmente ser útil para o aprendizado, eu teria que discordar de que esse é um resultado melhor do que usar uma biblioteca pequena e bem construída. Uma biblioteca seria mantida e teria mais chances de cobrir casos extremos no design que talvez não sejam óbvios para você à primeira vista, mas que possam ser facilmente mordidos em algum momento - os cálculos de data / hora são particularmente propensos a esses problemas devido à sua complexidade inerente.
Julian Knight
8
Isso é muito bom uso do método String.replace (), um para a criatividade
JamieJag
5
Não. Absolutamente use uma biblioteca neste caso. O formato pode mudar. Mesmo que não mude, isso está adicionando complexidade ao código. Outras pessoas que mantêm seu código precisam gastar tempo, tentando entender essa função e certificando-se de que esteja correta. Os exercícios são para a escola; a pergunta era sobre o uso na vida real. A menos que, é claro, este seja seu primeiro ou segundo projeto "real"; pode ser bom fazer algo assim, para que você saiba por que não deve fazê-lo no futuro.
osa
3
Aprecio o sentimento geral de usar bibliotecas como código comprovado / reforçado para batalha, mas elas também podem adicionar complexidade de implantação. Este código delega todas as sutilezas relacionadas ao calendário para o objeto Date subjacente e apenas chama, por exemplo, o método getUTCDate () no local apropriado. Além disso, se alguém encontrar um bug nesse código, poderá relatá-lo aqui no stackoverflow.com, correspondendo essencialmente ao aspecto de muitos olhos / erros rasos de qualquer outra biblioteca. +1
steamer25
11

Maneira facilmente legível e personalizável para obter um registro de data e hora 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")

Mtl Dev
fonte
9

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}')
David Miró
fonte
3
Parece uma biblioteca realmente incrível. A formatação deles é bem lisa e os documentos mostram soluções elegantes para centenas de outras coisas pelas quais eu tenho me frustrado no JavaScript. Vai tentar isso.
eimajenthat
6

Use o método fornecido no objeto Date da seguinte maneira:

var ts_hms = new Date();

console.log(
    ts_hms.getFullYear() + '-' + 
    ("0" + (ts_hms.getMonth() + 1)).slice(-2) + '-' + 
    ("0" + (ts_hms.getDate())).slice(-2) + ' ' +
    ("0" + ts_hms.getHours()).slice(-2) + ':' +
    ("0" + ts_hms.getMinutes()).slice(-2) + ':' +
    ("0" + ts_hms.getSeconds()).slice(-2));

Parece realmente sujo, mas deve funcionar bem com os métodos principais do JavaScript

jpmonette
fonte
2
Concordo que você precisa adicionar 1 ao getMonth () desde janeiro volta como 0, mas não acho que você queira adicionar 1 ao getDate ().
Steve Onorato
5

Estou usando o dateformat em Nodejs e angularjs, tão bom

instalar

$ npm install dateformat
$ dateformat --help

demonstração

var dateFormat = require('dateformat');
var now = new Date();

// Basic usage
dateFormat(now, "dddd, mmmm dS, yyyy, h:MM:ss TT");
// Saturday, June 9th, 2007, 5:46:21 PM

// You can use one of several named masks
dateFormat(now, "isoDateTime");
// 2007-06-09T17:46:21

// ...Or add your own
dateFormat.masks.hammerTime = 'HH:MM! "Can\'t touch this!"';
dateFormat(now, "hammerTime");
// 17:46! Can't touch this!

// You can also provide the date as a string
dateFormat("Jun 9 2007", "fullDate");
// Saturday, June 9, 2007
...
Tính Ngô Quang
fonte
3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00
gest
fonte
Bem-vindo ao StackOverflow. Edite sua resposta ou poderá receber votos negativos. Como é agora, é apenas uma sugestão sem contexto. Veja aqui como escrever uma boa resposta .
jacefarm
Isso acontece com a des-localidade (daí a toLocaleString):3.2.2015, 15:30:00
alwe
2

Alternativa # 6233 ....

Adicione o deslocamento UTC à hora local e depois converta-o para o formato desejado com o toLocaleDateString()método do Dateobjeto:

// Using the current date/time
let now_local = new Date();
let now_utc = new Date();

// Adding the UTC offset to create the UTC date/time
now_utc.setMinutes(now_utc.getMinutes() + now_utc.getTimezoneOffset())

// Specify the format you want
let date_format = {};
date_format.year = 'numeric';
date_format.month = 'numeric';
date_format.day = '2-digit';
date_format.hour = 'numeric';
date_format.minute = 'numeric';
date_format.second = 'numeric';

// Printing the date/time in UTC then local format
console.log('Date in UTC: ', now_utc.toLocaleDateString('us-EN', date_format));
console.log('Date in LOC: ', now_local.toLocaleDateString('us-EN', date_format));

Estou criando um objeto de data padrão para a hora local. Estou adicionando o UTC compensado. Estou criando um objeto de formatação de data. Estou exibindo a data / hora UTC no formato desejado:

insira a descrição da imagem aqui

Adão
fonte
1

Use x-datemodule, que é um dos submódulos da biblioteca da classe x ;

require('x-date') ; 
  //---
 new Date().format('yyyy-mm-dd HH:MM:ss')
  //'2016-07-17 18:12:37'
 new Date().format('ddd , yyyy-mm-dd HH:MM:ss')
  // 'Sun , 2016-07-17 18:12:51'
 new Date().format('dddd , yyyy-mm-dd HH:MM:ss')
 //'Sunday , 2016-07-17 18:12:58'
 new Date().format('dddd ddSS of mmm , yy')
  // 'Sunday 17thth +0300f Jul , 16'
 new Date().format('dddd ddS  mmm , yy')
 //'Sunday 17th  Jul , 16'
Abdennour TOUMI
fonte
1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

com .toString (), isso fica no formato

substituir (/ T /, ''). // substitui T por '' 2017-01-15T ...

substituir (/..+/, '') // para ... 13: 50: 16.1271

exemplo, veja var datee hour:

var date="2017-01-15T13:50:16.1271".toString("yyyyMMddHHmmss").
                    replace(/T/, ' ').      
                    replace(/\..+/, '');
    
                    var auxCopia=date.split(" ");
                    date=auxCopia[0];
                    var hour=auxCopia[1];

console.log(date);
console.log(hour);

x-rw
fonte
1
Você pode fornecer alguma explicação como contexto por trás de sua resposta?
T-Heron
Bem-vindo ao StackOverflow. Edite sua resposta ou poderá receber votos negativos. Como é agora, é apenas uma sugestão sem contexto. Veja aqui como escrever uma boa resposta .
jacefarm
@ user7396942 - agora com o voto positivo, por adicionar contexto / explicação à sua resposta. Exoneração de responsabilidade: não fui eu quem menos votou anteriormente, como está agora, parece muito melhor.
T-Heron
3
Por que o .toString("yyyyMMddHHmmss")?
Arjan #
1

Para formatação de data, a maneira mais fácil é usar moment lib. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')
Jazeb_007
fonte
Obrigado, @ Jazeb_007, está funcionando para mim, mesmo que eu não precise toISOString()etoUTCString()
Bablu Ahmed
0
appHelper.validateDates = function (start, end) {
    var returnval = false;

    var fd = new Date(start);
    var fdms = fd.getTime();
    var ed = new Date(end);
    var edms = ed.getTime();
    var cd = new Date();
    var cdms = cd.getTime();

    if (fdms >= edms) {
        returnval = false;
        console.log("step 1");
    }
    else if (cdms >= edms) {
        returnval = false;
        console.log("step 2");
    }
    else {
        returnval = true;
        console.log("step 3");
    }
    console.log("vall", returnval)
    return returnval;
}
Benjamin
fonte
-1

Eu acho que isso realmente responde à sua pergunta.

É tão chato trabalhar com data / hora em javascript. Depois de alguns cabelos grisalhos, descobri que era realmente muito simples.

var date = new Date();
var year = date.getUTCFullYear();
var month = date.getUTCMonth();
var day = date.getUTCDate();
var hours = date.getUTCHours();
var min = date.getUTCMinutes();
var sec = date.getUTCSeconds();

var ampm = hours >= 12 ? 'pm' : 'am';
hours = ((hours + 11) % 12 + 1);//for 12 hour format

var str = month + "/" + day + "/" + year + " " + hours + ":" + min + ":" + sec + " " + ampm;
var now_utc =  Date.UTC(str);

Aqui está um violino

J-Roel
fonte
Você precisa adicionar 1 ao mês, que é baseado em zero.
Mistic