Come formattare una data UTC come una stringa `AAAA-MM-GG hh: mm: ss` usando NodeJS?


242

Usando NodeJS, voglio formattare un Datenel seguente formato di stringa:

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

Come lo faccio?


4
È una seccatura fare a meno delle biblioteche. Consiglio di usare datejs
Peter Olson,



Tempus ha funzionato alla grande. I problemi con l'annuncio avverranno.
Tampa,

1
Né Datejs né Tempus sono librerie Node (sebbene possano essere utilizzate con Node non è possibile utilizzare il programma di installazione della libreria npm). Dato che nessuno ha inserito queste come risposte effettive, l'ho fatto da solo.
Julian Knight

Risposte:


532

Se stai usando Node.js, sei sicuro di avere EcmaScript 5, quindi Date ha un toISOStringmetodo. Stai chiedendo una leggera modifica di ISO8601:

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

Quindi basta tagliare alcune cose e sei pronto:

new Date().toISOString().
  replace(/T/, ' ').      // replace T with a space
  replace(/\..+/, '')     // delete the dot and everything after
> '2012-11-04 14:55:45'

Oppure, in una riga: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 è necessariamente UTC (indicato anche dalla Z finale sul primo risultato), quindi ottieni UTC per impostazione predefinita (sempre una buona cosa).


4
Soluzione intelligente e semplice che evita l'uso delle librerie - bello!
Wingman4l7,

11
In caso di errore, Object has no method 'toISOString'hai personew
allenhwkim

29
Una cosa da notare è che usare le espressioni regolari in questo modo è lento e non ne hai nemmeno bisogno qui, questo: new Date().toISOString().replace('T', ' ').substr(0, 19)funziona bene.
Killah,

2
Notando che rimuovendo il fuso orario, ora rappresenta un diverso momento nel tempo in ogni fuso orario con un diverso offset.
RobG

1
@RobG Puoi dire che su qualsiasi rappresentazione di data e ora che non ha un fuso orario esplicito.
Phil

105

AGGIORNAMENTO 2017-03-29: Aggiunti date-fns, alcune note su Moment e Datejs
AGGIORNAMENTO 2016-09-14: Aggiunto SugarJS che sembra avere alcune eccellenti funzioni data / ora.


OK, poiché nessuno ha effettivamente fornito una risposta effettiva, ecco la mia.

Una libreria è sicuramente la migliore scommessa per gestire le date e gli orari in modo standard. Esistono molti casi limite nei calcoli di data / ora, quindi è utile poter trasferire lo sviluppo a una libreria.

Ecco un elenco delle principali librerie di formattazione ora compatibili con Node:

  • Moment.js [ grazie a Mustafa ] "Una libreria di date javascript leggera (4.3k) per l'analisi, la manipolazione e la formattazione delle date" - Include internazionalizzazione, calcoli e relativi formati di data - Aggiornamento 29-03-2017 : Non così leggero non più ma comunque la soluzione più completa, soprattutto se hai bisogno del supporto del fuso orario.
  • date-fns [ aggiunto il 29-03-2017, grazie a Fractalf ] Piccolo, veloce, funziona con oggetti data JS standard. Ottima alternativa a Moment se non hai bisogno del supporto del fuso orario.
  • SugarJS - Una libreria di supporto generale che aggiunge le funzionalità necessarie ai tipi di oggetti incorporati in JavaScripts. Include alcune funzionalità di data / ora dall'aspetto eccellente.
  • strftime - Proprio quello che dice, carino e semplice
  • dateutil - Questo è quello che usavo prima di MomentJS
  • node-FormatoData
  • TimeTraveller - "Time Traveler fornisce una serie di metodi di utilità per gestire le date. Dall'aggiunta e sottrazione, alla formattazione. Time Traveler estende solo gli oggetti data che crea, senza inquinare lo spazio dei nomi globale."
  • Tempus [grazie a Dan D] - AGGIORNAMENTO: può essere utilizzato anche con Node e distribuito con npm, consultare la documentazione

Esistono anche librerie non Node:

  • Datejs [grazie a Peter Olson] - non impacchettato in npm o GitHub, quindi non abbastanza facile da usare con Node - non è davvero raccomandato in quanto non aggiornato dal 2007!

2
Questo è anche molto rilevante date-fns.org ( github.com/date-fns/date-fns )
Fractalf

Le persone dietro Moment hanno un esperimento chiamato Luxon a partire da febbraio 2018 moment.github.io/luxon/index.html
alxndr

Grazie @alxndr, sembra un utile riavvio.
Julian Knight,

Momento + toISOString () su RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane

70

C'è una libreria per la conversione:

npm install dateformat

Quindi scrivi il tuo requisito:

var dateFormat = require('dateformat');

Quindi associare il valore:

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

vedi dataformat


14
Che cosa è result.request_date?
Dan Dascalescu,

45

Non ho nulla contro le biblioteche in generale. In questo caso una libreria per scopi generici sembra eccessiva, a meno che altre parti del processo di candidatura non siano molto datate.

Scrivere piccole funzioni di utilità come questa è anche un esercizio utile sia per i programmatori principianti che per quelli esperti e può essere un'esperienza di apprendimento per i principianti tra noi.

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

25
Anche se questo può davvero essere utile per l'apprendimento, dovrei essere in disaccordo sul fatto che si tratta di un risultato migliore rispetto all'utilizzo di una piccola biblioteca ben costruita. Una libreria verrebbe mantenuta ed avrebbe maggiori probabilità di coprire casi limite nella progettazione che potrebbero non essere ovvi a prima vista ma potrebbero facilmente mordere ad un certo punto - i calcoli di data / ora sono particolarmente inclini a questi problemi a causa della loro intrinseca complessità.
Julian Knight,

8
Questo è un ottimo uso del metodo String.replace (), +1 per la creatività
JamieJag

5
No. Assolutamente usare una libreria in questo caso. Il formato potrebbe cambiare. Anche se non cambia, questo sta aggiungendo complessità al codice. Altre persone che gestiscono il tuo codice dovrebbero passare del tempo, cercando di capire questa funzione e assicurandosi che sia corretta. Gli esercizi sono per la scuola; la domanda riguardava l'uso nella vita reale. A meno che, ovviamente, questo non sia il tuo primo o il secondo progetto "reale"; allora potrebbe essere utile fare qualcosa del genere, così puoi imparare perché non dovresti farlo in futuro.
osa,

3
Apprezzo il sentimento generale dell'utilizzo delle librerie come codice comprovato / temprato dalle battaglie, ma possono anche aggiungere complessità di distribuzione. Questo codice delega tutte le sottigliezze relative al calendario all'oggetto Date sottostante e chiama semplicemente il metodo getUTCDate () nella posizione appropriata. Inoltre, se qualcuno trova un bug in questo codice, può segnalarlo qui su stackoverflow.com, essenzialmente abbinando l'aspetto molti occhi / superficiali di qualsiasi altra libreria. +1
piroscafo25

11

Modo facilmente leggibile e personalizzabile per ottenere un timestamp nel formato desiderato, senza l'uso di alcuna libreria:

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 hai bisogno di tempo in formato UTC, modifica semplicemente le chiamate di funzione. Ad esempio "getMonth" diventa "getUTCMonth")


9

La libreria javascript sugar.js ( http://sugarjs.com/ ) ha funzioni per formattare le date

Esempio:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')

3
Sembra una libreria davvero fantastica. La loro formattazione è piuttosto semplice e i loro documenti mostrano soluzioni eleganti per centinaia di altre cose di cui sono stato frustrato in JavaScript. Ci provo.
eimajenthat,

6

Utilizzare il metodo fornito nell'oggetto Date come segue:

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

Sembra davvero sporco, ma dovrebbe funzionare bene con i metodi di base JavaScript


2
Sono d'accordo che è necessario aggiungere 1 a getMonth () da gennaio, come 0, ma non credo che si desideri aggiungere 1 a getDate ().
Steve Onorato,

5

Sto usando dateformat su Nodejs e angularjs, così bene

installare

$ npm install dateformat
$ dateformat --help

dimostrazione

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
...

3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00

Benvenuto in StackOverflow. Modifica la tua risposta o potresti essere votato verso il basso. Come è ora, è solo un suggerimento senza contesto. Si prega di vedere qui per come scrivere una buona risposta .
jacefarm,

Questo succede con la de-locale (da qui toLocaleString):3.2.2015, 15:30:00
sempre

2

Alternativa # 6233 ....

Aggiungi l'offset UTC all'ora locale, quindi convertilo nel formato desiderato con il toLocaleDateString()metodo Datedell'oggetto:

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

Sto creando un oggetto data predefinito all'ora locale. Sto aggiungendo l'offset UTC ad esso. Sto creando un oggetto di formattazione della data. Sto visualizzando la data / ora UTC nel formato desiderato:

inserisci qui la descrizione dell'immagine


1

Utilizzare il x-datemodulo che è uno dei sottomoduli della libreria di 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'

1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

con .toString (), diventa in formato

sostituire (/ T /, ''). // sostituisci T in '' 2017-01-15T ...

sostituisci (/..+/, '') // per ... 13: 50: 16.1271

esempio, vedi 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);


1
Puoi fornire una spiegazione come contesto alla base della tua risposta?
T-Heron,

Benvenuto in StackOverflow. Modifica la tua risposta o potresti essere votato verso il basso. Come è ora, è solo un suggerimento senza contesto. Si prega di vedere qui per come scrivere una buona risposta .
jacefarm,

@ user7396942 - ora votato, per aggiungere contesto / spiegazione alla tua risposta. Disclaimer: non ero quello che in precedenza aveva votato in negativo, così com'è ora sembra molto meglio.
T-Heron,

3
Perché il .toString("yyyyMMddHHmmss")?
Arjan,

1

Per la formattazione della data il modo più semplice è usare moment lib. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')

Grazie, @ Jazeb_007 funziona per me anche se non ne ho bisogno 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;
}

0

Controlla il codice qui sotto e il collegamento a MDN

// 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())


-1

Penso che questo in realtà risponda alla tua domanda.

È così fastidioso lavorare con data / ora in JavaScript. Dopo alcuni capelli grigi ho capito che in realtà era piuttosto semplice.

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

Ecco un violino


Devi aggiungere 1 al mese a base zero.
Mistic
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.