Jak sformatować datę UTC jako ciąg `RRRR-MM-DD gg: mm: ss` przy użyciu NodeJS?


242

Za pomocą NodeJS chcę sformatować plik Date następujący format ciągu:

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

W jaki sposób mogę to zrobić?


4
To trochę kłopotliwe, aby obejść się bez bibliotek. Polecam używanie datejs
Peter Olson



Tempus działał świetnie. Pojawią się problemy z reklamą.
Tampa,

1
Ani Datejs, ani Tempus nie są bibliotekami Node (chociaż można ich używać z Node, nie można użyć instalatora biblioteki npm). Ponieważ nikt nie podał ich jako rzeczywistych odpowiedzi, sam to zrobiłem.
Julian Knight

Odpowiedzi:


532

Jeśli używasz Node.js, na pewno masz EcmaScript 5, więc Date ma toISOStringmetodę. Pytasz o niewielką modyfikację ISO8601:

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

Po prostu wytnij kilka rzeczy i gotowe:

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

Lub w jednym wierszu: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 jest koniecznie UTC (wskazany również przez końcowe Z na pierwszym wyniku), więc domyślnie dostajesz UTC (zawsze dobra rzecz).


4
Sprytne i proste rozwiązanie, które pozwala uniknąć korzystania z bibliotek - fajnie!
Wingman4l7 19.04.13

11
W przypadku, masz błąd Object has no method 'toISOString', to brakowałonew
allenhwkim

29
Należy zauważyć, że używanie wyrażeń regularnych w ten sposób jest powolne i nawet ich tutaj nie potrzebujesz, to: new Date().toISOString().replace('T', ' ').substr(0, 19)działa dobrze.
Killah

2
Pamiętaj, że usunięcie strefy czasowej oznacza teraz inny moment w każdej strefie czasowej z innym przesunięciem.
RobG

1
@RobG Można to powiedzieć o każdej reprezentacji daty i godziny, która nie ma wyraźnej strefy czasowej.
Phil

105

AKTUALIZACJA 29.03.2017: Dodano date-fns, kilka uwag na temat Moment i Datejs.
AKTUALIZACJA 14.09.2016 : Dodano SugarJS, który wydaje się mieć doskonałe funkcje daty / godziny.


OK, ponieważ nikt tak naprawdę nie udzielił prawdziwej odpowiedzi, oto moja.

Biblioteka jest z pewnością najlepszym rozwiązaniem do obsługi dat i godzin w standardowy sposób. Istnieje wiele przypadków brzegowych w obliczeniach daty / godziny, więc przydatne jest przekazanie rozwoju do biblioteki.

Oto lista głównych bibliotek formatowania czasu zgodnych z Węzłem:

  • Moment.js [ podziękowania dla Mustafy ] „Lekka biblioteka dat javascript (4,3 tys.) Do analizowania, manipulowania i formatowania dat” - Obejmuje internacjonalizację, obliczenia i względne formaty dat - Aktualizacja 2017-03-29 : Niezbyt lekka już teraz, ale wciąż najbardziej kompleksowe rozwiązanie, szczególnie jeśli potrzebujesz wsparcia strefy czasowej.
  • date-fns [ dodano 2017-03-29, dzięki Fractalf ] Mały, szybki, współpracuje ze standardowymi obiektami daty JS. Świetna alternatywa dla Moment, jeśli nie potrzebujesz obsługi strefy czasowej.
  • SugarJS - ogólna biblioteka pomocnicza dodająca bardzo potrzebne funkcje do wbudowanych typów obiektów JavaScript. Zawiera kilka świetnie wyglądających funkcji daty / godziny.
  • strftime - Po prostu to, co mówi, ładne i proste
  • dateutil - tego użyłem przed MomentJS
  • data-formatu-węzła
  • TimeTraveller - „Time Traveler zapewnia zestaw narzędzi użyteczności do radzenia sobie z datami. Od dodawania i odejmowania do formatowania. Time Traveler rozszerza tylko utworzone przez siebie obiekty daty, nie zanieczyszczając globalnej przestrzeni nazw”.
  • Tempus [dzięki Danowi D] - AKTUALIZACJA: można go również używać z Węzłem i wdrażać z npm, zobacz dokumenty

Istnieją również biblioteki inne niż węzły:

  • Datejs [dzięki Peter Olson] - nie jest pakowany w npm lub GitHub, więc nie jest tak łatwy w użyciu z Node - tak naprawdę nie polecany, ponieważ nie jest aktualizowany od 2007 roku!

2
Jest to również bardzo istotne date-fns.org ( github.com/date-fns/date-fns )
Fractalf,

Ludzie stojący za Moment mają eksperyment o nazwie Luxon od lutego 2018 moment.github.io/luxon/index.html
alxndr

Dzięki @alxndr, wygląda na użyteczny restart.
Julian Knight

Moment + toISOString () w RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane

70

Istnieje biblioteka do konwersji:

npm install dateformat

Następnie wpisz swoje wymaganie:

var dateFormat = require('dateformat');

Następnie powiąż wartość:

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

patrz dataformat


14
Co to jest result.request_date?
Dan Dascalescu,

45

Ogólnie nie mam nic przeciwko bibliotekom. W tym przypadku biblioteka ogólnego przeznaczenia wydaje się przesadna, chyba że inne części procesu aplikacyjnego datują się w znacznym stopniu.

Pisanie małych funkcji narzędziowych, takich jak ta, jest również przydatnym ćwiczeniem zarówno dla początkujących, jak i dla doświadczonych programistów i może być doświadczeniem edukacyjnym dla początkujących wśród nas.

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
Chociaż może to być przydatne do nauki, musiałbym się nie zgodzić, że jest to lepszy wynik niż użycie małej, dobrze zbudowanej biblioteki. Biblioteka byłaby utrzymywana i bardziej prawdopodobne jest, że obejmie przypadkowe projekty, które mogą nie być oczywiste na pierwszy rzut oka, ale mogą z łatwością ugryźć w pewnym momencie - obliczenia daty / czasu są szczególnie podatne na te problemy ze względu na ich złożoność.
Julian Knight

8
To bardzo dobre użycie metody String.replace (), +1 za kreatywność
JamieJag,

5
Nie. Absolutnie użyj biblioteki w tym przypadku. Format może ulec zmianie. Nawet jeśli się to nie zmienia, powoduje to złożoność kodu. Inne osoby utrzymujące Twój kod musiałyby spędzać czas, próbując zrozumieć tę funkcję i upewnić się, że jest poprawna. Ćwiczenia są dla szkoły; pytanie dotyczyło rzeczywistego użytkowania. O ile oczywiście nie jest to twój pierwszy lub drugi „prawdziwy” projekt; wtedy może być dobrze zrobić coś takiego, aby dowiedzieć się, dlaczego nie powinieneś tego robić w przyszłości.
osa

3
Doceniam ogólny sentyment do korzystania z bibliotek jako sprawdzonego / zahartowanego w boju kodu, ale mogą one również zwiększyć złożoność wdrażania. Ten kod deleguje wszystkie subtelności związane z kalendarzem do bazowego obiektu Date i po prostu wywołuje np. Metodę getUTCDate () w odpowiednim miejscu. Dodatkowo, jeśli ktoś znajdzie błąd w tym kodzie, może go zgłosić tutaj na stackoverflow.com, zasadniczo pasując do aspektu wielu oczu / płytkich błędów w każdej innej bibliotece. +1
parowiec 25

11

Łatwo czytelny i konfigurowalny sposób na uzyskanie znacznika czasu w żądanym formacie bez użycia biblioteki:

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

(Jeśli potrzebujesz czasu w formacie UTC, po prostu zmień wywołania funkcji. Na przykład „getMonth” staje się „getUTCMonth”)


9

Biblioteka javascript Sugar.js ( http://sugarjs.com/ ) ma funkcje formatowania dat

Przykład:

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

3
Wygląda jak naprawdę niesamowita biblioteka. Ich formatowanie jest dość sprytne, a ich dokumenty pokazują eleganckie rozwiązania dla stu innych rzeczy, które mnie frustrowały w JavaScript. Zamierzam spróbować.
eimajenthat

6

Użyj metody podanej w obiekcie Date w następujący sposób:

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

Wygląda na naprawdę brudny, ale powinien działać dobrze z podstawowymi metodami JavaScript


2
Zgadzam się, że musisz dodać 1 do getMonth (), ponieważ styczeń powraca jako 0, ale nie sądzę, że chcesz dodać 1 do getDate ().
Steve Onorato,

5

Używam dateformat w Nodejs i angularjs, więc dobrze

zainstalować

$ npm install dateformat
$ dateformat --help

próbny

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

Witamy w StackOverflow. Edytuj swoją odpowiedź, w przeciwnym razie możesz zostać odrzucony. Obecnie jest to tylko sugestia bez kontekstu. Zobacz tutaj, jak napisać dobrą odpowiedź .
jacefarm

Dzieje się tak z de-locale (stąd toLocaleString):3.2.2015, 15:30:00
również

2

Alternatywa # 6233 ....

Dodaj przesunięcie UTC do czasu lokalnego, a następnie przekonwertuj je na żądany format za pomocą toLocaleDateString()metody Dateobiektu:

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

Tworzę obiekt daty domyślnie na czas lokalny. Dodam do niej przesunięcie UTC. Tworzę obiekt formatujący datę. Wyświetlam datę / czas UTC w żądanym formacie:

wprowadź opis zdjęcia tutaj


1

Użyj x-datemodułu, który jest jednym z podmodułów biblioteki x-class ;

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(/\..+/, '') 

z .toString (), To staje się w formacie

zamień (/ T /, ''). // zamień T na '' 2017-01-15T ...

zamień (/..+/, '') // na ... 13: 50: 16.1271

przykład zobacz var datei 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
Czy możesz podać jakieś wyjaśnienie jako kontekst swojej odpowiedzi?
T-Heron

Witamy w StackOverflow. Edytuj swoją odpowiedź, w przeciwnym razie możesz zostać odrzucony. Obecnie jest to tylko sugestia bez kontekstu. Zobacz tutaj, jak napisać dobrą odpowiedź .
jacefarm

@ user7396942 - teraz głosowałem za dodaniem kontekstu / wyjaśnienia do swojej odpowiedzi. Oświadczenie: Nie byłem tym, który wcześniej głosował z góry, ponieważ teraz wygląda znacznie lepiej.
T-Heron

3
Dlaczego .toString("yyyyMMddHHmmss")?
Arjan

1

Do formatowania daty najłatwiej jest użyć moment lib. https://momentjs.com/

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

Dzięki, @ Jazeb_007 działa dla mnie nawet ja nie potrzebuję toISOString()itoUTCString()
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

Sprawdź poniższy kod i link do 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

Myślę, że to faktycznie odpowiada na twoje pytanie.

Praca z datą i godziną w javascript jest bardzo denerwująca. Po kilku siwych włosach zorientowałem się, że jest to całkiem proste.

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

Oto skrzypce


Musisz dodać 1 do miesiąca, który jest zerowy.
Mistic
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.