Bagaimana memformat tanggal UTC sebagai string `YYYY-MM-DD hh: mm: ss` menggunakan NodeJS?

242

Menggunakan NodeJS, saya ingin memformat Dateke dalam format string berikut:

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

Bagaimana aku melakukan itu?

Tampa
sumber
4
Agak repot dilakukan tanpa perpustakaan. Saya sarankan menggunakan datejs
Peter Olson
8
atau momentjs
Mustafa
atau Tempus
Dan D.
Tempus bekerja dengan sangat baik. Masalah iklan akan jadi momen.
Tampa
1
Datejs maupun Tempus bukanlah pustaka Node (meskipun pustaka tersebut dapat digunakan dengan Node, Anda tidak dapat menggunakan penginstal pustaka npm). Karena tidak ada yang menempatkan ini sebagai jawaban yang sebenarnya, saya sudah melakukannya sendiri.
Julian Knight

Jawaban:

532

Jika Anda menggunakan Node.js, Anda pasti memiliki EcmaScript 5, dan Date memiliki toISOStringmetode. Anda meminta sedikit modifikasi ISO8601:

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

Jadi hentikan beberapa hal, dan Anda sudah siap:

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

Atau, dalam satu baris: new Date().toISOString().replace(/T/, ' ').replace(/\..+/, '')

ISO8601 harus UTC (juga ditunjukkan oleh tanda Z pada hasil pertama), sehingga Anda mendapatkan UTC secara default (selalu merupakan hal yang baik).

chbrown
sumber
4
Solusi cerdas dan sederhana yang menghindari penggunaan perpustakaan - bagus!
Wingman4l7
11
Jika Anda mendapatkan kesalahan Object has no method 'toISOString',, Anda melewatkannew
allenhwkim
29
Satu hal yang perlu diperhatikan adalah bahwa menggunakan ekspresi reguler dengan cara ini lambat dan Anda bahkan tidak memerlukannya di sini, ini: new Date().toISOString().replace('T', ' ').substr(0, 19)berfungsi dengan baik.
Killah
2
Perhatikan bahwa dengan menghapus zona waktu, sekarang mewakili momen berbeda dalam waktu di setiap zona waktu dengan offset berbeda.
RobG
1
@RobG Anda dapat mengatakan itu tentang representasi waktu tanggal mana pun yang tidak memiliki zona waktu eksplisit.
Phil
105

UPDATE 2017-03-29: Menambahkan date-fns, beberapa catatan tentang Moment dan Datejs
UPDATE 2016-09-14: Menambahkan SugarJS yang tampaknya memiliki beberapa fungsi tanggal / waktu yang sangat baik.


OK, karena tidak ada yang benar-benar memberikan jawaban yang sebenarnya, ini milik saya.

Perpustakaan tentu saja merupakan cara terbaik untuk menangani tanggal dan waktu dengan cara standar. Ada banyak kasus tepi dalam perhitungan tanggal / waktu sehingga berguna untuk dapat menyerahkan pengembangan ke perpustakaan.

Berikut adalah daftar pustaka pemformatan waktu Node utama yang kompatibel:

  • Moment.js [ terima kasih kepada Mustafa ] "Pustaka tanggal javascript ringan (4.3k) untuk menguraikan, memanipulasi, dan memformat tanggal" - Termasuk internasionalisasi, perhitungan, dan format tanggal relatif - Pembaruan 2017-03-29 : Tidak terlalu ringan lagi tetapi masih merupakan solusi paling komprehensif, terutama jika Anda membutuhkan dukungan zona waktu.
  • date-fns [ ditambahkan 2017-03-29, terima kasih kepada Fractalf ] Kecil, cepat, berfungsi dengan objek tanggal JS standar. Alternatif yang bagus untuk Momen jika Anda tidak memerlukan dukungan zona waktu.
  • SugarJS - Pustaka pembantu umum menambahkan fitur yang sangat dibutuhkan untuk tipe objek JavaScripts. Termasuk beberapa kemampuan tanggal / waktu yang sangat baik.
  • strftime - Hanya apa yang dikatakannya, bagus dan sederhana
  • dateutil - Ini adalah yang saya gunakan sebelum MomentJS
  • node-formatdate
  • TimeTraveller - "Time Traveler menyediakan seperangkat metode utilitas untuk menangani tanggal. Dari menambah dan mengurangi, hingga memformat. Time Traveler hanya memperluas objek tanggal yang dibuatnya, tanpa mencemari namespace global."
  • Tempus [terima kasih kepada Dan D] - PEMBARUAN: ini juga dapat digunakan dengan Node dan digunakan dengan npm, lihat dokumen

Ada juga pustaka non-Node:

  • Datejs [terima kasih kepada Peter Olson] - tidak dikemas dalam npm atau GitHub sehingga tidak begitu mudah digunakan dengan Node - tidak benar-benar direkomendasikan karena tidak diperbarui sejak 2007!
Julian Knight
sumber
2
Ini juga sangat relevan date-fns.org ( github.com/date-fns/date-fns )
Fractalf
Orang-orang di belakang Moment melakukan percobaan yang disebut Luxon pada Februari 2018 moment.github.io/luxon/index.html
alxndr
Terima kasih @alxndr, sepertinya reboot yang berguna.
Julian Knight
Momen + toISOString () di RunKit: runkit.com/shanekenyon87/5b845b0a64ab3f0012c9c607
Shane
70

Ada perpustakaan untuk konversi:

npm install dateformat

Kemudian tulis persyaratan Anda:

var dateFormat = require('dateformat');

Kemudian ikat nilainya:

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

lihat format tanggal

Onder OZCAN
sumber
14
Apa result.request_date?
Dan Dascalescu
45

Saya tidak menentang perpustakaan secara umum. Dalam hal ini perpustakaan tujuan umum tampaknya berlebihan, kecuali bagian lain dari proses aplikasi tanggal berat.

Menulis fungsi utilitas kecil seperti ini juga merupakan latihan yang berguna bagi programmer pemula maupun yang sudah berpengalaman dan dapat menjadi pengalaman belajar bagi para pemula di antara kita.

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
sumber
25
Walaupun ini memang berguna untuk pembelajaran, saya harus tidak setuju bahwa ini adalah hasil yang lebih baik daripada menggunakan perpustakaan kecil yang dibangun dengan baik. Perpustakaan akan dipertahankan dan lebih mungkin untuk menutupi kasus-kasus tepi dalam desain yang mungkin tidak jelas bagi Anda pada pandangan pertama tetapi dapat dengan mudah menggigit pada beberapa titik - perhitungan tanggal / waktu sangat rentan terhadap masalah ini karena kompleksitas yang melekat.
Julian Knight
8
Ini adalah penggunaan metode String.replace () yang sangat baik, +1 untuk kreativitas
JamieJag
5
Tidak. Benar-benar menggunakan perpustakaan dalam hal ini. Format dapat berubah. Bahkan jika itu tidak berubah, ini menambah kompleksitas kode. Orang lain yang menjaga kode Anda harus menghabiskan waktu, mencoba memahami fungsi ini dan memastikan bahwa itu benar. Latihan adalah untuk sekolah; pertanyaannya adalah tentang penggunaan kehidupan nyata. Kecuali, tentu saja, ini adalah proyek "nyata" pertama atau kedua Anda; maka mungkin itu baik untuk melakukan sesuatu seperti itu, sehingga Anda dapat belajar mengapa Anda tidak harus melakukannya di masa depan.
Osa
3
Saya menghargai sentimen umum menggunakan perpustakaan sebagai kode yang terbukti / diperangi pertempuran tetapi mereka juga dapat menambah kompleksitas penggunaan. Kode ini mendelegasikan semua seluk-beluk terkait kalender ke objek Tanggal yang mendasarinya dan hanya memanggil mis., Metode getUTCDate () di tempat yang sesuai. Selain itu, jika ada yang menemukan bug dalam kode ini, mereka dapat melaporkannya di sini di stackoverflow.com, yang pada dasarnya cocok dengan aspek banyak-mata / dangkal-bug dari perpustakaan lain. +1
steamer25
11

Cara mudah dibaca dan dapat disesuaikan untuk mendapatkan cap waktu dalam format yang Anda inginkan, tanpa menggunakan perpustakaan apa pun:

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

(Jika Anda memerlukan waktu dalam format UTC, maka ubah saja pemanggilan fungsi. Misalnya "getMonth" menjadi "getUTCMonth")

Mtl Dev
sumber
9

Perpustakaan javascript sugar.js ( http://sugarjs.com/ ) memiliki fungsi untuk memformat tanggal

Contoh:

Date.create().format('{dd}/{MM}/{yyyy} {hh}:{mm}:{ss}.{fff}')
David Miró
sumber
3
Sepertinya perpustakaan yang sangat mengagumkan. Pemformatan mereka cukup apik, dan dokumen mereka menunjukkan solusi elegan untuk seratus hal lain yang membuat saya frustrasi dalam JavaScript. Akan mencoba ini.
eimajenthat
6

Gunakan metode yang disediakan dalam objek Tanggal sebagai berikut:

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

Ini terlihat sangat kotor, tetapi harus bekerja dengan baik dengan metode inti JavaScript

jpmonette
sumber
2
Saya setuju bahwa Anda perlu menambahkan 1 ke getMonth () sejak Januari kembali sebagai 0, tetapi saya tidak berpikir Anda ingin menambahkan 1 ke getDate ().
Steve Onorato
5

Saya menggunakan dateformat di Nodejs dan angularjs, begitu baik

Install

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

//=> 2015-02-03 15:30:00
gest
sumber
Selamat datang di StackOverflow. Harap edit jawaban Anda, atau Anda dapat terpilih. Seperti sekarang, itu hanya saran tanpa konteks. Silakan lihat di sini untuk Cara Menulis Jawaban yang Baik .
jacefarm
Ini terjadi dengan de-locale (maka toLocaleString):3.2.2015, 15:30:00
alwe
2

Alternatif # 6233 ....

Tambahkan offset UTC ke waktu lokal lalu konversikan ke format yang diinginkan dengan toLocaleDateString()metode Dateobjek:

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

Saya membuat objek tanggal default ke waktu lokal. Saya menambahkan UTC off-set untuk itu. Saya membuat objek format tanggal. Saya menampilkan tanggal / waktu UTC dalam format yang diinginkan:

masukkan deskripsi gambar di sini

Adam
sumber
1

Gunakan x-datemodul yang merupakan salah satu sub-modul perpustakaan 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'
Abdennour TOUMI
sumber
1
new Date().toString("yyyyMMddHHmmss").
      replace(/T/, ' ').  
      replace(/\..+/, '') 

dengan .toString (), ini menjadi dalam format

ganti (/ T /, ''). // ganti T ke '' 2017-01-15T ...

ganti (/..+/, '') // untuk ... 13: 50: 16.1271

contoh, lihat var datedan 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
sumber
1
Bisakah Anda memberikan penjelasan sebagai konteks di balik jawaban Anda?
T-Heron
Selamat datang di StackOverflow. Harap edit jawaban Anda, atau Anda dapat terpilih. Seperti sekarang, itu hanya saran tanpa konteks. Silakan lihat di sini untuk Cara Menulis Jawaban yang Baik .
jacefarm
@ user7396942 - sekarang dipilih, untuk menambahkan konteks / penjelasan ke dalam jawaban Anda. Penafian: Saya bukan orang yang sebelumnya memilih, seperti yang sekarang terlihat jauh lebih baik.
T-Heron
3
Mengapa .toString("yyyyMMddHHmmss")?
Arjan
1

Untuk format tanggal cara yang paling mudah adalah menggunakan lib saat. https://momentjs.com/

const moment = require('moment')
const current = moment().utc().format('Y-M-D H:M:S')
Jazeb_007
sumber
Terima kasih, @ Jazeb_007 ini bekerja untuk saya walaupun saya tidak membutuhkan toISOString()dantoUTCString()
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
sumber
0

Periksa kode di bawah ini dan tautan ke 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())

kunci data
sumber
-1

Saya pikir ini sebenarnya menjawab pertanyaan Anda.

Sangat menjengkelkan bekerja dengan tanggal / waktu dalam javascript. Setelah beberapa rambut beruban saya menemukan bahwa sebenarnya cukup sederhana.

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

Ini biola

J-Roel
sumber
Anda perlu menambahkan 1 ke bulan yang berbasis nol.
Mistic