Dapatkan String dalam format YYYYMMDD dari objek tanggal JS?

398

Saya mencoba menggunakan JS untuk mengubah date objectstring menjadi YYYYMMDDformat. Apakah ada cara yang lebih mudah daripada concatenating Date.getYear(), Date.getMonth()dan Date.getDay()?

Pembalas IVR
sumber
4
Menggabungkan ketiga adalah cara untuk pergi
Juan Cortés
5
jika Anda ingin string yang akan diuraikan pada tanggal yang sama, jangan lupa untuk menambahkan bulan. Untuk mencocokkan spec Anda, Anda juga perlu memasukkan satu digit di bulan dan tanggal dengan '0'
kennebec

Jawaban:

621

Bagian kode yang diubah yang sering saya gunakan:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();
oo
sumber
16
Anda harus mengganti [1]dengan .length===2, karena pengindeks pada string tidak sepenuhnya didukung. Lihat jawaban ini untuk alasan mengapa.
Aidiakapi
6
var mm = (this.getMonth () + 101) .toStrung (). substring (0, 2);
9dan
7
Bagi siapa pun yang ingin contoh praktis perbaikan @Aidiakapi, saya membuat biola di sini: jsfiddle.net/pcr8xbt5/1
killercowuk
1
Jika Anda ingin memiliki titik pemisah:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski
3
@ 9dan seharusnya tidakvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer
318

Saya tidak suka menambahkan prototipe. Alternatifnya adalah:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;

Pierre Guilbert
sumber
51
Jika Anda tidak membutuhkan rightNowvariabel di sekitar, Anda dapat membungkus new Datedan mengembalikan semuanya dalam satu baris:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat
5
Aku ingin YYYYMMDDHHmmSSsss, jadi saya melakukan ini: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Cukup sederhana, tetapi harus dikemas.
Jess
65
Ini tidak akan berfungsi secara umum karena Date.toISOString () membuat tanggal berformat UTC dan karenanya dapat melompati batas tanggal tergantung pada zona waktu. Misalnya dalam GMT + 1: (Tanggal baru (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste
26
Ini akan gagal jika seseorang pada tahun 10000 akan menggunakan kode 'nostalgia' Anda.
Trevi Awater
10
Saran perbaikan untuk mengatasi zona waktu. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas
182

Anda dapat menggunakan toISOStringfungsi ini:

var today = new Date();
today.toISOString().substring(0, 10);

Ini akan memberi Anda format "yyyy-mm-dd".

Ramzi SAYAGH
sumber
24
Dalam beberapa kasus ini tidak akan termasuk hari yang tepat, karena zona waktu siang hari dll ...
Miguel
1
Mungkin kreativitas saya rusak @Miguel, tapi saya tidak bisa memikirkan kasus di mana itu akan terjadi. Maukah Anda memberikan contoh?
cloudworks
35
Jika Anda berada dalam zona waktu +1, dan ada tanggal [2015-09-01 00:00:00 GMT + 1], maka metode toISOString () akan mengembalikan string '2015-08-31T23: 00: 00.000Z 'karena tanggal dikonversi ke UTC / 0-offset sebelum diubah.
Luke Baulch
Sedikit lebih pendek ... hari ini = (Tanggal baru ()). ToISOString (). Substring (0, 10);
teawithfruit
Gagal dengan GMT yang berbeda
Tobia
133

Moment.js bisa menjadi temanmu

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');
H6.
sumber
18
Yah itu TIDAK menambah 40kb (minified, non gZip) ke app.js saya, tapi saya pergi untuk itu, terima kasih :).
Bart
jawaban terbaik sejauh ini!
TrulyXax
9
Saya bahkan tidak repot menunggu sampai saya pasti membutuhkan waktu lagi, saya hanya menambahkannya pada awal proyek :)
martinedwards
1
Anda dapat membuatnya lebih mudah:var formattedDate = moment().format('YYYYMMDD');
ns16
37

Jika Anda tidak memerlukan solusi JS murni, Anda dapat menggunakan jQuery UI untuk melakukan pekerjaan seperti ini:

$.datepicker.formatDate('yymmdd', new Date());

Saya biasanya tidak suka mengimpor terlalu banyak perpustakaan. Tapi jQuery UI sangat berguna, Anda mungkin akan menggunakannya di tempat lain di proyek Anda.

Kunjungi http://api.jqueryui.com/datepicker/ untuk contoh lebih lanjut

NLemay
sumber
37

Ini adalah satu baris kode yang dapat Anda gunakan untuk membuat YYYY-MM-DDstring tanggal hari ini.

var d = new Date().toISOString().slice(0,10);
Brian Powell
sumber
^ ini! FTW! +1 .. perlu diuji sedikit.
Gogol
21
Peringatan sulit, jika tanggal Anda 2016-01-01 00:00:00 GMT +2, itu akan kembali 2015-12-31 karena toISOString()akan memberikan 2015-12-31T22: 00: 00 GMT +0 (dua jam sebelumnya).
Jérôme Gillard
29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'
gongqj
sumber
5
Soultion terbaik.
زياد
Untuk beberapa alasan, perlu menambah waktu (bahkan jika 00:00) agar konversi tidak melewati sehari, ketika saya menjalankan rumus di sini, pantai timur AS. Setelah saya melakukannya, itu mulai bekerja dengan andal. Yang saya sukai dari ini adalah dapat mengambil tanggal input dalam berbagai format, jadi saya tidak perlu khawatir tentang itu lagi. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea
24

Selain jawaban oo saya ingin merekomendasikan memisahkan operasi logika dari kembali dan menempatkan mereka sebagai variabel dalam variabel sebagai gantinya.

Juga, gunakan concat()untuk memastikan gabungan variabel yang aman

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>

Eric Herlitz
sumber
Jika seseorang suka menggunakannya, saya sarankan KERING di sini, gunakan kembali fungsi yang sudah dibuat alih-alih melakukan hal yang sama lagi.
RiZKiT
@RiZKiT KERING adalah prinsip dan bukan pola tetapi tentu saja, ini dapat ditingkatkan banyak. Jika saya harus menggunakan ini sendiri, saya mungkin akan menggunakan pola lain dan memindahkan metode dari prototipe. Saya terutama menulis contoh untuk menunjukkan di mana ada cara lain untuk menyelesaikan masalah. Di mana orang mengambilnya dari sana adalah untuk diri mereka sendiri
Eric Herlitz
Bagus! Saya gunakan ("00" + (this.getDate())).slice(-2)untuk mendapatkan angka berdasarkan dua digit. Tidak ada pernyataan "jika" atau "?:", Dan lebih sedikit panggilan ke fungsi .getX (). Jika tidak sedikit lebih cepat, setidaknya lebih mudah dibaca.
le hollandais volant
22

Saya tidak suka memodifikasi objek asli, dan saya pikir perkalian lebih jelas daripada string padding solusi yang diterima.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Fiddle: http://jsfiddle.net/gbdarren/Ew7Y4/

Darren Griffith
sumber
4
Jawaban ini diturunkan, dan saya tidak tahu mengapa. Saya merasa matematika lebih cepat dan lebih jelas daripada manipulasi string. Jika ada yang tahu mengapa ini adalah jawaban yang buruk, beri tahu saya.
Darren Griffith
4
Multiplicator 10000 ada untuk menggeser YYYY sebanyak 4 tempat (digit bulan dan hari masing-masing membutuhkan 2 digit) dan tidak ada hubungannya dengan bug Y10K. Saya suka jawaban ini dan patut dihormati!
A. Masson
1
Terima kasih atas jawaban ini, saya membuat biola di sini jsfiddle.net/amwebexpert/L6j0omb4
A. Masson
1
Saya tidak membutuhkan multiplikasi sama sekali dan saya tidak mengerti mengapa itu ada. jsfiddle.net/navyjax2/gbqmv0t5 Kalau tidak, tinggalkan itu, dan ini adalah jawaban yang bagus dan banyak membantu saya.
vapcguy
1
@ D-Money Ah, saya tahu apa yang Anda maksud - Anda sedang melakukan penggabungan dari jenis yang berbeda dengan menambahkan angka bersama untuk menghindari mereka melakukan operasi matematika yang berbeda satu sama lain - operasi untuk melarang yang normal yang akan ' Kalau tidak, akan mengacaukan mereka. Kerja bagus! Milik saya bekerja karena saya menggunakan pemisah (yang harus saya lakukan .replace('-', '')untuk membuatnya menjawab pertanyaan OP), sedangkan Anda benar dengan pertanyaan asli OP dan itu tidak akan memerlukan langkah ekstra. Luar biasa!
vapcguy
15

Solusi Plain JS (ES5) tanpa masalah lompatan tanggal yang mungkin disebabkan oleh pencetakan Date.toISOString () di UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

Ini sebagai tanggapan atas komentar @ weberste pada jawaban @Pierre Guilbert.

Orang yg suka tidur
sumber
now.getMonth () akan mengembalikan 0 untuk Januari, seharusnya (now.getMonth () + 1)
Jas
2
Salah. Fungsi UTC tanggal memperkirakan bulan antara 0 dan 11 (tetapi yang lain <0 dan> 11 diizinkan).
Asrama
Mengapa Anda mengganti beberapa tanda hubung dengan satu? Bisakah toISOStringmengembalikan beberapa tanda hubung berurutan?
Michaël Witrant
Michael - dia mengganti setiap tanda hubung yang ditemukan dengan tanda hubung tunggal. Masih tidak tahu mengapa (mungkin string pengganti hanyalah tempat untuk pemisah). 'G' berarti semua kejadian. Pola yang Anda pikirkan adalah / [-] + / g
Gerard ONeill
2
Anda membuat hari saya. Saya telah mencari berhari-hari cara sederhana untuk mem-bypass penanganan TimeZone yang mengerikan di Javascript, dan ini berhasil!
Guillaume F.
10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509

Kus
sumber
Ini jawaban yang saya pakai. Satu liner yang memperhitungkan zona waktu. Untuk menjawab pertanyaan pengirim asli, kita dapat melakukan: (Tanggal baru (Date.now () - (Tanggal baru)). GetTimezoneOffset () * 60000)). ToISOString (). Ganti (/ [^ 0-9] / g, "") .slice (0,8)
tomwoods
thx, untuk mendapatkan YYYY-MM-DD i digunakan: Date baru (Date.now () - (Date baru ()). getTimezoneOffset () * 60000) .toISOString (). slice (0, 10) .replace (/ [ ^ 0-9] / g, "-")
Nick Humphrey
7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);

Tomas Šivickas
sumber
Sangat cerdas. Terima kasih
JMaylin
4
Tidak akan berfungsi karena Date baru () memiliki zona waktu dan Date.toISOString () adalah UTC. Lihat jawaban saya.
Asrama
@ Rumah Sakit bukan sebaliknya? new Date()membuat objek tanggal baru yang hanya membungkus nr. ms sejak 1970/01/01 00: 00: 00.000 UTC. Kemudian toISOStringdicetak di zona waktu lokal.
Stijn de Witt
Tidak, Date.toISOString () mencetak dalam UTC.
Asrama
7

Cara lain adalah menggunakan toLocaleDateStringdengan lokal yang memiliki standar format tanggal big-endian , seperti Swedia, Lithuania, Hongaria, Korea Selatan, ...:

date.toLocaleDateString('se')

Untuk menghapus pembatas ( -) hanya masalah mengganti non-digit:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

Ini tidak memiliki potensi kesalahan yang bisa Anda dapatkan dengan format tanggal UTC: tanggal UTC mungkin satu hari libur dibandingkan dengan tanggal di zona waktu lokal.

trincot
sumber
6

Anda cukup menggunakan kode satu baris ini untuk mendapatkan tanggal dalam setahun

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();
Muhammad Ahsan
sumber
5

Versi sedikit disederhanakan untuk jawaban paling populer di utas ini https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}
Pahlawan Qu
sumber
5

dateformat adalah paket yang sangat digunakan.

Cara Penggunaan:

Unduh dan instal dateformatdari NPM. Perlu dalam modul Anda:

const dateFormat = require('dateformat');

dan kemudian format saja barang-barang Anda:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');

Milkncookiez
sumber
4

Orang ini di sini => http://blog.stevenlevithan.com/archives/date-time-format menulis format()fungsi untuk JavascriptDate , sehingga dapat digunakan dengan format literal yang sudah dikenal.

Jika Anda membutuhkan pemformatan Tanggal berfitur lengkap di Javascript aplikasi Anda, gunakan itu. Kalau tidak, jika yang ingin Anda lakukan adalah salah satu, maka gabungkan getYear (), getMonth (), getDay () mungkin paling mudah.

Strelok
sumber
4

Bekerja dari jawaban @ oo, ini akan memberi Anda kembali string tanggal sesuai dengan string format. Anda dapat dengan mudah menambahkan regex tahun 2 digit untuk tahun & milidetik dan sejenisnya jika Anda membutuhkannya.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

Saya tidak tahu seberapa efisien itu, terutama karena ia menggunakan banyak regex. Mungkin bisa menggunakan beberapa pekerjaan yang tidak saya kuasai js murni.

Tom Tom
sumber
4

Kode ini diperbaiki untuk jawaban Pierre Guilbert:

(Ia bekerja bahkan setelah 10.000 tahun)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")
anmml
sumber
3

Saya biasanya menggunakan kode di bawah ini ketika saya perlu melakukan ini.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Untuk menjelaskan, .slice (-2) memberi kita dua karakter terakhir dari string.

Jadi, apa pun yang terjadi, kita dapat menambahkan "0" pada hari atau bulan, dan hanya meminta dua terakhir karena mereka selalu dua yang kita inginkan.

Jadi jika MyDate.getMonth () mengembalikan 9, itu akan menjadi:

("0" + "9") // Giving us "09"

jadi menambahkan .slice (-2) pada yang memberi kita dua karakter terakhir yaitu:

("0" + "9").slice(-2)

"09"

Tetapi jika date.getMonth () mengembalikan 10, itu akan menjadi:

("0" + "10") // Giving us "010"

jadi menambahkan .slice (-2) memberi kita dua karakter terakhir, atau:

("0" + "10").slice(-2)

"10"
Ogglas
sumber
3

Jika menggunakan AngularJs (hingga 1,5) Anda dapat menggunakan filter tanggal :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')
sarin
sumber
3

Menjawab orang lain untuk Kesederhanaan & keterbacaan.
Juga, mengedit anggota kelas yang sudah ada sebelumnya dengan metode baru tidak dianjurkan:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);
Manohar Reddy Poreddy
sumber
2

Jika Anda tidak keberatan menyertakan perpustakaan tambahan (tapi kecil), Sugar.js menyediakan banyak fungsionalitas yang bagus untuk bekerja dengan tanggal dalam JavaScript. Untuk memformat tanggal, gunakan fungsi format :

new Date().format("{yyyy}{MM}{dd}")
andersh
sumber
2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));

Enam
sumber
1
menambahkan beberapa deskripsi pada jawaban Anda akan membuat Anda upvotes mencoba untuk menggambarkan sedikit apa yang Anda lakukan dalam kode ini sehingga orang lain dapat memahaminya dengan lebih jelas.
Muhammad Omer Aslam
Dalam mode ketat atau gunakan naskah "biarkan f, yyyymmdd = x => ..." sebagai gantinya. Fungsi yyyymmdd dan f dinyatakan tidak terdefinisi.
Maks
2

kode tanggal untuk penyelamatan!

const dateShortcode = require('date-shortcode')
dateShortcode.parse('{YYYYMMDD}', new Date())
//=> '20180304'
Kodie Grantham
sumber
2

Gunakan padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};
yajuliv
sumber
1

Berikut ini adalah pendekatan yang lebih umum yang memungkinkan komponen tanggal dan waktu dan dapat diurutkan secara identik sebagai angka atau string.

Berdasarkan urutan nomor format ISO Tanggal, konversikan ke zona waktu lokal dan hapus non-digit. yaitu:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

Pemakaian

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"
chriskelly
sumber
1

Javascript Asli:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');
Lonnie Best
sumber
1
Ini bukan pad bulan dengan 0 untuk memastikan bulan menjadi 2 digit.
Attila Szeremi
Kamu benar. Saya kemudian memperhatikan ini sendiri. Anda harus berhati-hati menguji format tanggal pada bulan dan hari dua digit.
Lonnie Best