Wie formatiere ich ein UTC-Datum mit NodeJS als `JJJJ-MM-TT hh: mm: ss` Zeichenfolge?

242

Mit NodeJS möchte ich a Datein das folgende Zeichenfolgenformat formatieren:

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

Wie mache ich das?

Tampa
quelle
4
Es ist eine Art Mühe, auf Bibliotheken zu verzichten. Ich empfehle Datejs
Peter Olson
8
oder momentjs
Mustafa
oder Tempus
Dan D.
Tempus hat großartig funktioniert. Anzeigenprobleme werden Moment.
Tampa
1
Weder Datejs noch Tempus sind Knotenbibliotheken (obwohl sie mit Node verwendet werden können, können Sie das Installationsprogramm für die npm-Bibliothek nicht verwenden). Da niemand diese als tatsächliche Antworten angegeben hat, habe ich es selbst getan.
Julian Knight

Antworten:

530

Wenn Sie Node.js verwenden, verfügen Sie sicher über EcmaScript 5, und daher verfügt Date über eine toISOStringMethode. Sie fordern eine geringfügige Änderung von ISO8601:

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

Schneiden Sie einfach ein paar Dinge aus und schon sind Sie fertig:

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

Oder in einer Zeile: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 ist notwendigerweise UTC (wird auch durch das nachfolgende Z im ersten Ergebnis angezeigt), daher erhalten Sie standardmäßig UTC (immer eine gute Sache).

chbrown
quelle
4
Clevere und einfache Lösung, die die Verwendung von Bibliotheken vermeidet - schön!
Wingman4l7
11
Falls Sie Fehler erhalten, Object has no method 'toISOString'haben Sie verpasstnew
Allenhwkim
29
Eine Sache zu beachten ist, dass die Verwendung von regulären Ausdrücken auf diese Weise langsam ist und Sie sie hier nicht einmal benötigen. Dies new Date().toISOString().replace('T', ' ').substr(0, 19)funktioniert einwandfrei.
Killah
2
Beachten Sie, dass durch Entfernen der Zeitzone jetzt in jeder Zeitzone ein anderer Zeitpunkt mit einem anderen Versatz dargestellt wird.
RobG
1
@RobG Das kann man über jede Datums- / Uhrzeitdarstellung sagen, die keine explizite Zeitzone hat.
Phil
105

UPDATE 2017-03-29: Datum-fns hinzugefügt, einige Hinweise zu Moment und Datejs
UPDATE 2016-09-14: SugarJS hinzugefügt, das einige ausgezeichnete Datums- / Zeitfunktionen zu haben scheint.


OK, da niemand tatsächlich eine Antwort gegeben hat, ist hier meine.

Eine Bibliothek ist sicherlich die beste Wahl, um Datums- und Uhrzeitangaben auf übliche Weise zu behandeln. Es gibt viele Randfälle bei Datums- / Zeitberechnungen, daher ist es nützlich, die Entwicklung an eine Bibliothek übergeben zu können.

Hier ist eine Liste der wichtigsten knotenkompatiblen Zeitformatierungsbibliotheken:

  • Moment.js [ danke an Mustafa ] "Eine leichte (4,3 KB) Javascript-Datumsbibliothek zum Parsen, Bearbeiten und Formatieren von Datumsangaben" - Enthält Internationalisierung, Berechnungen und relative Datumsformate - Update 29.03.2017 : Nicht ganz so leicht mehr, aber immer noch die umfassendste Lösung, insbesondere wenn Sie Zeitzonenunterstützung benötigen.
  • date-fns [ hinzugefügt am 29.03.2017 dank Fractalf ] Klein, schnell, funktioniert mit Standard-JS -Datumsobjekten . Tolle Alternative zu Moment, wenn Sie keine Zeitzonenunterstützung benötigen.
  • SugarJS - Eine allgemeine Hilfsbibliothek, die den in JavaScripts integrierten Objekttypen dringend benötigte Funktionen hinzufügt. Enthält einige hervorragend aussehende Datums- / Uhrzeitfunktionen.
  • strftime - Genau das, was es sagt, nett und einfach
  • dateutil - Dies ist das, was ich vor MomentJS verwendet habe
  • Knotenformatdatum
  • TimeTraveller - "Time Traveller bietet eine Reihe von Dienstprogrammmethoden für den Umgang mit Datumsangaben. Vom Hinzufügen und Subtrahieren bis zur Formatierung. Time Traveller erweitert nur die von ihm erstellten Datumsobjekte, ohne den globalen Namespace zu verschmutzen."
  • Tempus [danke an Dan D] - UPDATE: Dies kann auch mit Node verwendet und mit npm bereitgestellt werden, siehe Dokumentation

Es gibt auch Nicht-Knoten-Bibliotheken:

  • Datejs [danke an Peter Olson] - nicht in npm oder GitHub verpackt, daher nicht ganz so einfach mit Node zu verwenden - nicht wirklich empfohlen, da seit 2007 nicht aktualisiert!
Julian Knight
quelle
2
Dies ist auch sehr relevant date-fns.org ( github.com/date-fns/date-fns )
Fractalf
Die Leute hinter Moment haben ein Experiment namens Luxon ab Februar 2018 moment.github.io/luxon/index.html
alxndr
Danke @alxndr, sieht nach einem nützlichen Neustart aus.
Julian Knight
Moment + toISOString () auf RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane
70

Es gibt eine Bibliothek zur Konvertierung:

npm install dateformat

Dann schreiben Sie Ihre Anforderung:

var dateFormat = require('dateformat');

Binden Sie dann den Wert:

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

siehe Datumsformat

Onder OZCAN
quelle
14
Was ist result.request_date?
Dan Dascalescu
45

Ich habe nichts gegen Bibliotheken im Allgemeinen. In diesem Fall scheint eine Allzweckbibliothek übertrieben zu sein, es sei denn, andere Teile des Bewerbungsprozesses sind stark datiert.

Das Schreiben kleiner Dienstprogrammfunktionen wie diese ist sowohl für Anfänger als auch für erfahrene Programmierer eine nützliche Übung und kann für Anfänger unter uns eine Lernerfahrung sein.

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
quelle
25
Dies mag zwar zum Lernen nützlich sein, aber ich muss nicht zustimmen, dass dies ein besseres Ergebnis ist als die Verwendung einer kleinen, gut aufgebauten Bibliothek. Eine Bibliothek würde gepflegt und würde eher Randfälle im Design abdecken, die für Sie auf den ersten Blick nicht offensichtlich sind, aber irgendwann leicht beißen könnten - Datums- / Zeitberechnungen sind aufgrund ihrer inhärenten Komplexität besonders anfällig für diese Probleme.
Julian Knight
8
Dies ist eine sehr gute Verwendung der String.replace () -Methode, +1 für Kreativität
JamieJag
5
Verwenden Sie in diesem Fall unbedingt eine Bibliothek. Das Format kann sich ändern. Auch wenn es sich nicht ändert, erhöht dies die Komplexität des Codes. Andere Personen, die Ihren Code pflegen, müssten Zeit damit verbringen, diese Funktion zu verstehen und sicherzustellen, dass sie korrekt ist. Übungen sind für die Schule; Die Frage betraf den realen Gebrauch. Es sei denn natürlich, dies ist Ihr erstes oder zweites "echtes" Projekt. dann kann es gut sein, so etwas zu tun, damit Sie lernen können, warum Sie es in Zukunft nicht tun sollten.
osa
3
Ich schätze die allgemeine Meinung, Bibliotheken als bewährten / kampferprobten Code zu verwenden, aber sie können auch die Komplexität der Bereitstellung erhöhen. Dieser Code delegiert alle kalenderbezogenen Feinheiten an das zugrunde liegende Date-Objekt und ruft z. B. die Methode getUTCDate () an der entsprechenden Stelle auf. Wenn jemand einen Fehler in diesem Code findet, kann er ihn hier auf stackoverflow.com melden, was im Wesentlichen dem Aspekt der vielen Augen / flachen Fehler einer anderen Bibliothek entspricht. +1
Dampfer25
11

Leicht lesbare und anpassbare Möglichkeit, einen Zeitstempel in Ihrem gewünschten Format ohne Verwendung einer Bibliothek zu erhalten:

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

(Wenn Sie Zeit im UTC-Format benötigen, ändern Sie einfach die Funktionsaufrufe. Beispielsweise wird "getMonth" zu "getUTCMonth".)

Mtl Dev
quelle
9

Die Javascript-Bibliothek Sugar.js ( http://sugarjs.com/ ) verfügt über Funktionen zum Formatieren von Daten

Beispiel:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')
David Miró
quelle
3
Sieht aus wie eine wirklich tolle Bibliothek. Ihre Formatierung ist ziemlich raffiniert und ihre Dokumente zeigen elegante Lösungen für hundert andere Dinge, mit denen ich in JavaScript frustriert war. Ich werde es versuchen.
Eimajenthat
6

Verwenden Sie die im Date-Objekt angegebene Methode wie folgt:

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

Es sieht wirklich schmutzig aus, sollte aber mit JavaScript-Kernmethoden gut funktionieren

jpmonette
quelle
2
Ich bin damit einverstanden, dass Sie 1 zu getMonth () hinzufügen müssen, da der Januar als 0 zurückkommt, aber ich glaube nicht, dass Sie 1 zu getDate () hinzufügen möchten.
Steve Onorato
5

Ich verwende das Datumsformat bei Nodejs und Angularjs, so gut

Installieren

$ npm install dateformat
$ dateformat --help

Demo

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
quelle
3
new Date(2015,1,3,15,30).toLocaleString()

//=> 2015-02-03 15:30:00
gest
quelle
Willkommen bei StackOverflow. Bitte bearbeiten Sie Ihre Antwort, sonst könnten Sie herabgestimmt werden. So wie es jetzt ist, ist es nur ein Vorschlag ohne Kontext. Hier erfahren Sie, wie Sie eine gute Antwort schreiben .
Jacefarm
Dies geschieht mit De-Locale (daher der toLocaleString):3.2.2015, 15:30:00
Alwe
2

Alternative # 6233 ....

Fügen Sie den UTC-Offset zur Ortszeit hinzu und konvertieren Sie ihn dann mit der toLocaleDateString()Methode des DateObjekts in das gewünschte Format :

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

Ich erstelle ein Datumsobjekt, das standardmäßig die Ortszeit verwendet. Ich füge den UTC-Versatz hinzu. Ich erstelle ein Datumsformatierungsobjekt. Ich zeige das UTC-Datum / die UTC-Uhrzeit im gewünschten Format an:

Geben Sie hier die Bildbeschreibung ein

Adam
quelle
1

Verwendung - x-dateModul , das eine der Submodule ist x-Klassenbibliothek ;

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
quelle
1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

mit .toString () wird dies im Format

ersetzen (/ T /, ''). // T durch '' ersetzen 2017-01-15T ...

Ersetzen Sie (/..+/, '') // durch ... 13: 50: 16.1271

Beispiel siehe var dateund 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
quelle
1
Können Sie eine Erklärung als Kontext für Ihre Antwort liefern?
T-Heron
Willkommen bei StackOverflow. Bitte bearbeiten Sie Ihre Antwort, sonst könnten Sie herabgestimmt werden. So wie es jetzt ist, ist es nur ein Vorschlag ohne Kontext. Hier erfahren Sie, wie Sie eine gute Antwort schreiben .
Jacefarm
@ user7396942 - jetzt hochgestimmt, um Ihrer Antwort Kontext / Erklärung hinzuzufügen. Haftungsausschluss: Ich war nicht derjenige, der zuvor herabgestimmt hatte, da es jetzt viel besser aussieht .
T-Heron
3
Warum das .toString("yyyyMMddHHmmss")?
Arjan
1

Für die Datumsformatierung ist die Verwendung von moment lib am einfachsten. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')
Jazeb_007
quelle
Danke, @ Jazeb_007 es funktioniert für mich, auch wenn ich es nicht brauche toISOString()undtoUTCString()
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
quelle
-1

Ich denke, das beantwortet tatsächlich Ihre Frage.

Es ist so ärgerlich, mit Datum / Uhrzeit in Javascript zu arbeiten. Nach ein paar grauen Haaren stellte ich fest, dass das eigentlich ziemlich einfach war.

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

Hier ist eine Geige

J-Roel
quelle
Sie müssen dem auf Null basierenden Monat 1 hinzufügen.
Mistic