Javascript menambah nol terkemuka sampai saat ini

437

Saya telah membuat skrip ini untuk menghitung tanggal 10 hari sebelumnya dalam format dd / mm / yyyy:

var MyDate = new Date();
var MyDateString = new Date();
MyDate.setDate(MyDate.getDate()+10);
MyDateString = MyDate.getDate() + '/' + (MyDate.getMonth()+1) + '/' + MyDate.getFullYear();

Saya perlu tanggal muncul dengan nol terkemuka pada komponen hari dan bulan dengan cara menambahkan aturan ini ke skrip. Sepertinya saya tidak bisa membuatnya bekerja.

if (MyDate.getMonth < 10)getMonth = '0' + getMonth;

dan

if (MyDate.getDate <10)get.Date = '0' + getDate;

Jika seseorang bisa menunjukkan di mana saya harus memasukkan ini ke dalam skrip saya akan sangat menghargai

Julian Coates
sumber
6
Sebagai konvensi yang baik, Anda harus mengurangi huruf pertama dalam nama variabel Anda dan memesan casing unta untuk objek / prototipe.
zykadelic
Jika format YYYY-MM-DD dapat diterima, ini akan menjadi jawaban yang sangat baik: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert

Jawaban:

1353

Coba ini: http://jsfiddle.net/xA5B7/

var MyDate = new Date();
var MyDateString;

MyDate.setDate(MyDate.getDate() + 20);

MyDateString = ('0' + MyDate.getDate()).slice(-2) + '/'
             + ('0' + (MyDate.getMonth()+1)).slice(-2) + '/'
             + MyDate.getFullYear();

EDIT:

Untuk menjelaskan, .slice(-2)beri kami dua karakter terakhir dari string.

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

Jadi jika MyDate.getMonth()pengembaliannya 9adalah:

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

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

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

Tetapi jika MyDate.getMonth()kembali 10, itu akan menjadi:

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

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

("0" + "10").slice(-2)
"10"
pengguna113716
sumber
27
Forked - format tanggal YYYY-MM-DD jsfiddle.net/j6qJp/1 Semoga bermanfaat bagi seseorang. Terima kasih
tomexx
3
Adakah yang bisa menjelaskan mengapa ini lebih baik daripada jawaban yang diberikan @Aleross di bawah ini? Tidak segera jelas apa fungsinya versus fungsi pad yang secara eksplisit jelas.
claudio
2
Belum lagi bahwa hari ini contoh ini memberi saya 26/06/2014 bukannya 06/06/2014
DazManCat
3
@DazManCat: Itulah yang seharusnya dilakukan. Kode dimulai dengan menambahkan 20 hari ke tanggal saat ini. MyDate.setDate(MyDate.getDate() + 20);
monster kue
3
@ n00b dan @ Phil Cooper, tanpa terpaku pada diskusi tentang seluk beluk waktu JavaScript rutin, saya menemukan bahwa slice()teknik dalam jawaban yang diterima adalah sekitar 1/10 detik lebih cepat dari pad()pada teknik @Aleross pada 1 juta iterasi. jsFiddle . "bayar uangmu, pilih sendiri".
Karl
105

Berikut adalah contoh dari dokumen objek Date di Mozilla Developer Network menggunakan fungsi "pad" kustom, tanpa harus memperpanjang prototipe Number Javascript. Fungsi praktis yang mereka berikan sebagai contoh adalah

function pad(n){return n<10 ? '0'+n : n}

Dan di bawah ini digunakan dalam konteks.

/* use a function for the exact format desired... */
function ISODateString(d){
    function pad(n){return n<10 ? '0'+n : n}
    return d.getUTCFullYear()+'-'
    + pad(d.getUTCMonth()+1)+'-'
    + pad(d.getUTCDate())+'T'
    + pad(d.getUTCHours())+':'
    + pad(d.getUTCMinutes())+':'
    + pad(d.getUTCSeconds())+'Z'
}

var d = new Date();
console.log(ISODateString(d)); // prints something like 2009-09-28T19:03:12Z
Alex Ross
sumber
3
Cara yang sangat bagus untuk melakukannya. Saya pikir jawaban yang diterima benar-benar bagus, tetapi ini bahkan lebih bersih menurut saya
Binke
1
ini dapat menyebabkan bug yang tidak terduga karena menghasilkan string untuk <10 dan angka untuk> = 10
David Fregoli
@ DavidFregoli, semua fungsi tanggal ke string mengembalikan string, jadi jika Anda memasukkan string, padapakah hanya menghasilkan string.
Rohmer
56

Cara modern baru untuk melakukan ini adalah dengan menggunakan toLocaleDateString, karena itu tidak hanya memungkinkan Anda untuk memformat tanggal dengan lokalisasi yang tepat, Anda bahkan dapat melewati opsi format untuk mengarsipkan hasil yang diinginkan:

var date = new Date(2018, 2, 1);
var result = date.toLocaleDateString("en-GB", { // you can skip the first argument
  year: "numeric",
  month: "2-digit",
  day: "2-digit",
});
console.log(result);

Saat Anda melewatkan argumen pertama, itu akan mendeteksi bahasa browser. Atau, Anda dapat menggunakan 2-digitopsi tahun juga.

Jika Anda tidak perlu mendukung browser lama seperti IE10, ini adalah cara paling bersih untuk melakukan pekerjaan itu. IE10 dan versi yang lebih rendah tidak akan mengerti argumen opsi.

Catatan: Selain itu, ada juga toLocaleTimeString, jika Anda ingin melokalkan atau memformat waktu kencan.

Martin Braun
sumber
3
Ini persis apa yang saya cari, terima kasih. Info lebih lanjut tentang opsi yang tersedia untuk toLocaleDateString di sini: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares
1
@ JoseLinares Hai, terima kasih telah mengembalikan tautan ini pada hari-hari ini. Saya baru saja memutuskan untuk meningkatkan jawaban saya untuk membuat solusi lebih menarik untuk skenario umum, karena Anda dapat melewatkan argumen pertama dan IE10 tidak relevan lagi. Dengan mengingat hal itu, saya memasukkan tautan Anda ke dalam jawaban saya.
Martin Braun
@modiX, maaf itu adalah kesalahan saya dalam kode dan saya mengambil salah deskripsi, Ya lokal (variabel pertama) adalah Opsional .
Kanhaiya lal
@ Kanhaiyalal Jangan khawatir, kesalahan bisa terjadi. Saya hanya terkejut bahwa 2 dari 3 pengulas menyetujui pengeditan yang salah juga.
Martin Braun
51

Anda dapat mendefinisikan fungsi "str_pad" (seperti dalam php):

function str_pad(n) {
    return String("00" + n).slice(-2);
}
joan16v
sumber
9
"0" bukannya "00" sudah cukup
David Fregoli
Jawaban terbaik sejauh ini.
Lucas Andrade
30

Untuk Anda orang-orang dari masa depan (ECMAScript 2017 dan seterusnya)

Larutan

"use strict"

const today = new Date()

const year = today.getFullYear()

const month = `${today.getMonth() + 1}`.padStart(2, "0")

const day = `${today.getDate()}`.padStart(2, "0")

const stringDate = [day, month, year].join("/") // 13/12/2017

Penjelasan

yang String.prototype.padStart(targetLength[, padString])menambahkan sebanyak mungkin padStringdalam String.prototypetarget sehingga panjang baru target targetLength.

Contoh

"use strict"

let month = "9"

month = month.padStart(2, "0") // "09"

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"
Amin NAIRI
sumber
4
Ini adalah bagian dari ES2017 atau ES8. Jadi tidak benar untuk mengatakan "ES6 +" karena ini bukan bagian dari ES6 dan ES7.
Noel Llevares
1
Ini seharusnya secara teknis .padStart(2, '0')karena parameter kedua adalah string, meskipun mungkin tidak masalah kecuali jika Anda menggunakan TypeScript
bmaupin
Anda benar, saya akan mengedit jawaban saya.
Amin NAIRI
11
Number.prototype.padZero= function(len){
 var s= String(this), c= '0';
 len= len || 2;
 while(s.length < len) s= c + s;
 return s;
}

//digunakan:

(function(){
 var myDate= new Date(), myDateString;
 myDate.setDate(myDate.getDate()+10);

 myDateString= [myDate.getDate().padZero(),
 (myDate.getMonth()+1).padZero(),
 myDate.getFullYear()].join('/');

 alert(myDateString);
})()

/*  value: (String)
09/09/2010
*/
kennebec
sumber
10

Saya menemukan cara pintas untuk melakukan ini:

 MyDateString.replace(/(^|\D)(\d)(?!\d)/g, '$10$2');

akan menambahkan nol di depan ke semua digit tunggal yang sepi

Povesma Dmytro
sumber
Saya suka solusi ini, dapatkah Anda sedikit menjelaskan apa yang terjadi di sana?
Gobliins
7
var MyDate = new Date();
var MyDateString = '';
MyDate.setDate(MyDate.getDate());
var tempoMonth = (MyDate.getMonth()+1);
var tempoDate = (MyDate.getDate());
if (tempoMonth < 10) tempoMonth = '0' + tempoMonth;
if (tempoDate < 10) tempoDate = '0' + tempoDate;
MyDateString = tempoDate + '/' + tempoMonth + '/' + MyDate.getFullYear();
meaa
sumber
5

Anda dapat menggunakan operator ternary untuk memformat tanggal seperti pernyataan "jika".

Sebagai contoh:

var MyDate = new Date();
MyDate.setDate(MyDate.getDate()+10);
var MyDateString = (MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate()) + '/' + ((d.getMonth()+1) < 10 ? '0' + (d.getMonth()+1) : (d.getMonth()+1)) + '/' + MyDate.getFullYear();

Begitu

(MyDate.getDate() < 10 ? '0' + MyDate.getDate() : MyDate.getDate())

akan mirip dengan pernyataan if, di mana jika getDate () mengembalikan nilai kurang dari 10, maka kembalikan '0' + Tanggal, atau kembalikan tanggal jika lebih besar dari 10 (karena kita tidak perlu menambahkan yang memimpin 0). Sama untuk bulan ini.

Sunting: Lupa bahwa getMonth dimulai dengan 0, jadi tambahkan +1 ke akun untuk itu. Tentu saja Anda juga bisa mengatakan d.getMonth () <9:, tapi saya pikir menggunakan +1 akan membantu membuatnya lebih mudah untuk dipahami.

Hellojeffy
sumber
terima kasih telah menjelaskan +1
Bryan A
5

Ada pendekatan lain untuk mengatasi masalah ini, menggunakan sliceJavaScript.

var d = new Date();
var datestring = d.getFullYear() + "-" + ("0"+(d.getMonth()+1)).slice(-2) +"-"+("0" + d.getDate()).slice(-2);

yang datestringtanggal kembali dengan format yang seperti yang Anda harapkan: 2019/09/01

pendekatan lain menggunakan dateformatpustaka: https://github.com/felixge/node-dateformat

behnam shateri
sumber
Berhati-hatilah dalam mengeja "JavaScript".
Basil Bourque
3

Jadikan hidup Anda lebih mudah dan gunakan Moment.js beberapa kode contoh:

var beginDateTime = moment()
  .format('DD-MM-YYYY HH:mm')
  .toString();

// Now will print 30-06-2015 17:55
console.log(beginDateTime);
Gonzalo Bahamondez
sumber
4
moment.js -> bukan solusi yang baik karena kode 19.8k dibandingkan dengan solusi berukuran 0.3k di sini.
MarcoZen
3
function formatDate(jsDate){
  // add leading zeroes to jsDate when days or months are < 10.. 
  // i.e.
  //     formatDate(new Date("1/3/2013")); 
  // returns
  //    "01/03/2103"
  ////////////////////
  return (jsDate.getDate()<10?("0"+jsDate.getDate()):jsDate.getDate()) + "/" + 
      ((jsDate.getMonth()+1)<10?("0"+(jsDate.getMonth()+1)):(jsDate.getMonth()+1)) + "/" + 
      jsDate.getFullYear();
}
Alex
sumber
3

Anda dapat memberikan opsi sebagai parameter untuk memformat tanggal. Parameter pertama untuk lokal yang mungkin tidak Anda perlukan dan yang kedua untuk opsi. Untuk informasi lebih lanjut, kunjungi https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString

var date = new Date(Date.UTC(2012, 1, 1, 3, 0, 0));
var options = { year: 'numeric', month: '2-digit', day: '2-digit' };
console.log(date.toLocaleDateString(undefined,options));
MJ55
sumber
1
Terima kasih atas sarannya.
MJ55
2

Saya membungkus jawaban yang benar dari pertanyaan ini dalam suatu fungsi yang dapat menambahkan beberapa nol di awal tetapi secara default menambahkan 1 nol.

function zeroFill(nr, depth){
  depth = (depth === undefined)? 1 : depth;

  var zero = "0";
  for (var i = 0; i < depth; ++i) {
    zero += "0";
  }

  return (zero + nr).slice(-(depth + 1));
}

untuk bekerja dengan angka saja dan tidak lebih dari 2 digit, ini juga merupakan pendekatan:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }
Robbie Bardijn
sumber
1

Pilihan lain, menggunakan fungsi bawaan untuk melakukan padding (tetapi menghasilkan kode yang cukup panjang!):

myDateString = myDate.getDate().toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + (myDate.getMonth()+1).toLocaleString('en-US', {minimumIntegerDigits: 2})
  + '/' + myDate.getFullYear();

// '12/06/2017'

Dan lainnya, memanipulasi string dengan ekspresi reguler:

var myDateString = myDate.toISOString().replace(/T.*/, '').replace(/-/g, '/');

// '2017/06/12'

Tetapi ketahuilah bahwa seseorang akan menunjukkan tahun di awal dan hari di akhir .

joeytwiddle
sumber
paling suka ini: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Max Alexander Hanna
1

Menambahkan ke jawaban @modiX, inilah yang berfungsi ... JANGAN TINGGALKAN yang kosong

today.toLocaleDateString("default", {year: "numeric", month: "2-digit", day: "2-digit"})
francis
sumber
1

Berikut adalah contoh yang sangat sederhana bagaimana Anda dapat menangani situasi ini.

var mydate = new Date();

var month = (mydate.getMonth().toString().length < 2 ? "0"+mydate.getMonth().toString() :mydate.getMonth());

var date = (mydate.getDate().toString().length < 2 ? "0"+mydate.getDate().toString() :mydate.getDate());

var year = mydate.getFullYear();

console.log("Format Y-m-d : ",year+"-"+month+"-" + date);

console.log("Format Y/m/d : ",year+"/"+month+"/" + date);

Vikas Kandari
sumber
0

Berikut ini bertujuan untuk mengekstrak konfigurasi, menghubungkan ke Date.protoypedan menerapkan konfigurasi.

Saya telah menggunakan Arrayuntuk menyimpan potongan waktu dan ketika saya push() thissebagai Dateobjek, itu mengembalikan saya panjang untuk beralih. Ketika saya selesai, saya dapat menggunakan joinpada returnnilai.

Ini tampaknya bekerja sangat cepat: 0,016 ms

// Date protoype
Date.prototype.formatTime = function (options) {
    var i = 0,
        time = [],
        len = time.push(this.getHours(), this.getMinutes(), this.getSeconds());

    for (; i < len; i += 1) {
        var tick = time[i];
        time[i] = tick < 10 ? options.pad + tick : tick;
    }

    return time.join(options.separator);
};

// Setup output
var cfg = {
    fieldClock: "#fieldClock",
    options: {
        pad: "0",
        separator: ":",
        tick: 1000
    }
};

// Define functionality
function startTime() {
    var clock = $(cfg.fieldClock),
        now = new Date().formatTime(cfg.options);

    clock.val(now);
    setTimeout(startTime, cfg.options.tick);
}

// Run once
startTime();

demo: http://jsfiddle.net/tive/U4MZ3/

Tim Vermaelen
sumber
0

Apa yang akan saya lakukan, adalah membuat pembantu Tanggal kustom saya sendiri yang terlihat seperti ini:

var DateHelper = {
    addDays : function(aDate, numberOfDays) {
        aDate.setDate(aDate.getDate() + numberOfDays); // Add numberOfDays
        return aDate;                                  // Return the date
    },
    format : function format(date) {
        return [
           ("0" + date.getDate()).slice(-2),           // Get day and pad it with zeroes
           ("0" + (date.getMonth()+1)).slice(-2),      // Get month and pad it with zeroes
           date.getFullYear()                          // Get full year
        ].join('/');                                   // Glue the pieces together
    }
}

// With this helper, you can now just use one line of readable code to :
// ---------------------------------------------------------------------
// 1. Get the current date
// 2. Add 20 days
// 3. Format it
// 4. Output it
// ---------------------------------------------------------------------
document.body.innerHTML = DateHelper.format(DateHelper.addDays(new Date(), 20));

(Lihat juga Fiddle ini )

John Slegers
sumber
0

Tambahkan beberapa padding untuk memungkinkan nol di depan - di mana diperlukan - dan menggabungkan menggunakan pembatas pilihan Anda sebagai string.

Number.prototype.padLeft = function(base,chr){
        var  len = (String(base || 10).length - String(this).length)+1;
        return len > 0? new Array(len).join(chr || '0')+this : this;
    }

var d = new Date(my_date);
var dformatted = [(d.getMonth()+1).padLeft(), d.getDate().padLeft(), d.getFullYear()].join('/');
TV-C-15
sumber
0

Seperti yang disarankan @John Henckel, mulai menggunakan metode toISOString () membuat segalanya lebih mudah

const dateString = new Date().toISOString().split('-');
const year = dateString[0];
const month = dateString[1];
const day = dateString[2].split('T')[0];

console.log(`${year}-${month}-${day}`);

Mario
sumber
0
 let date = new Date();
 let dd = date.getDate();//day of month

 let mm = date.getMonth();// month
 let yyyy = date.getFullYear();//day of week
 if (dd < 10) {//if less then 10 add a leading zero
     dd = "0" + dd;
   }
 if (mm < 10) {
    mm = "0" + mm;//if less then 10 add a leading zero
  }
Dekan
sumber
Anda juga dapat menjelaskan secara singkat apa yang Anda coba.
Shiv Kumar Baghel
0

coba ini untuk fungsi dasar, tidak ada perpustakaan yang diperlukan

Date.prototype.CustomformatDate = function() {
 var tmp = new Date(this.valueOf());
 var mm = tmp.getMonth() + 1;
 if (mm < 10) mm = "0" + mm;
 var dd = tmp.getDate();
 if (dd < 10) dd = "0" + dd;
 return mm + "/" + dd + "/" + tmp.getFullYear();
};
vishu2124
sumber
0
function pad(value) {
    return value.tostring().padstart(2, 0);
}

let d = new date();
console.log(d);
console.log(`${d.getfullyear()}-${pad(d.getmonth() + 1)}-${pad(d.getdate())}t${pad(d.gethours())}:${pad(d.getminutes())}:${pad(d.getseconds())}`);
Guilherme Oliveira
sumber
2
Sementara kode ini dapat menjawab pertanyaan, memberikan konteks tambahan tentang bagaimana dan / atau mengapa memecahkan masalah akan meningkatkan nilai jangka panjang jawaban.
leopal
0

Anda bisa menggunakan String.slice () yang mengekstraksi bagian string dan mengembalikannya sebagai string baru, tanpa mengubah string asli:

const currentDate = new Date().toISOString().slice(0, 10) // 2020-04-16

Atau Anda juga dapat menggunakan lib seperti Moment.js untuk memformat tanggal:

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Julia Ramos
sumber