Javascript bugüne kadar önde gelen sıfırlar ekle


437

Bu komut dosyasını, gg / aa / yyyy biçiminde 10 gün önceden hesaplamak için oluşturdum:

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

Ben bu kurallar betiğe ekleyerek tarih ve ay bileşeni önde gelen sıfırlar ile görünmesi gerekir. Getţe yarayacak gibi gözükmüyorum.

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

ve

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

Birisi bana bunları senaryoya nereye ekleyebileceğimi gösterebilirse gerçekten minnettar olurum.


6
İyi bir kural olarak, değişken adlarınızdaki ilk karakteri küçük harflerle yazmanız ve nesneler / prototipler için deve kılıfını ayırmanız gerekir.
zykadelic

YYYY-AA-GG biçimi kabul edilebilirse, bu çok iyi bir cevap olacaktır: stackoverflow.com/a/28431880/1717535
Fabien Snauwaert

Yanıtlar:


1352

Bunu deneyin: 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();

DÜZENLE:

Açıklamak için .slice(-2)bize dizenin son iki karakterini verir .

Ne olursa olsun, "0"güne veya aya ekleyebiliriz ve sadece son ikisini isteyebiliriz, çünkü bunlar her zaman istediğimiz ikidir.

Eğer MyDate.getMonth()dönerse 9, öyle olacak:

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

bunu eklemek .slice(-2)bize son iki karakteri verir:

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

Ama eğer MyDate.getMonth()geri dönerse 10, olacak:

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

ekleme işlemi .slice(-2)bize son iki karakteri verir veya:

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

27
Çatallı - tarih formatı YYYY-AA-GG jsfiddle.net/j6qJp/1 Birisi için yararlı olabilir. Teşekkürler
tomexx

3
Birisi bunun neden @Aleross'un verdiği cevaptan daha iyi olduğunu açıklayabilir mi? Açıkça anlaşılan pad işlevine karşı ne yaptığını hemen belli değil.
claudio

2
Bugün bu örneğin bana 06/06/2014 yerine 26/06/2014 verdiğinden bahsetmiyorum
DazManCat

3
@DazManCat: Yapması gereken şey bu. Kod, geçerli tarihe 20 gün ekleyerek başlar. MyDate.setDate(MyDate.getDate() + 20);
çerez canavarı

3
@ n00b ve @Phil Cooper, zamanlama JavaScript rutinlerinin giriş ve çıkışları hakkında bir tartışma yapmadan slice(), kabul edilen cevaptaki pad()tekniğin @Aleross'un tekniğinden 1 milyon yineleme. jsFiddle . "Paranı öde, seçimini yap".
Karl

105

Javascript'in Number prototipini genişletmek zorunda kalmadan özel bir "pad" işlevini kullanan Mozilla Developer Network'teki Date nesnesi belgelerinden bir örnek . Örnek olarak verdikleri kullanışlı fonksiyon

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

Ve aşağıda bağlam içinde kullanılıyor.

/* 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

3
Bunu yapmanın çok güzel bir yolu. Kabul edilen cevabın gerçekten güzel olduğunu düşünüyorum, ama bence bu daha da temiz
Binke

1
bu beklenmedik hatalara yol açabilir, çünkü <10 için bir dize ve> = 10 için bir sayı
çıkarır

@DavidFregoli, dize işlevleri için tüm bu tarih bir dize döndürür, bu nedenle bir dize girerseniz, padyalnızca dize verir.
Rohmer

56

Bunu yapmanın yeni modern yolu kullanmaktır toLocaleDateString, çünkü sadece bir tarihi doğru yerelleştirmeyle biçimlendirmenize izin vermekle kalmaz, aynı zamanda istenen sonucu arşivlemek için biçim seçeneklerini de geçebilirsiniz:

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

İlk argümanı atladığınızda bunun yerine tarayıcı dili algılanır. Alternatif olarak, 2-digityıl seçeneğini de kullanabilirsiniz.

IE10 gibi eski tarayıcıları desteklemeniz gerekmiyorsa, bu işi yapmanın en temiz yoludur. IE10 ve önceki sürümleri seçenekler argümanını anlamaz.

Not: Ayrıca, toLocaleTimeStringbir tarihin saatini yerelleştirmek veya biçimlendirmek istiyorsanız da vardır .


3
Tam da aradığım şey bu, teşekkürler. ToLocaleDateString için mevcut seçenekler hakkında daha fazla bilgi için: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
JoseLinares

1
@JoseLinares Merhaba, bu bağlantıyı birkaç gün içinde tekrar eklediğiniz için teşekkürler. İlk argümanı atlayabildiğinizden ve IE10 artık alakalı olmadığından çözümü yaygın senaryolar için daha cazip hale getirmek için cevabımı geliştirmeye karar verdim. Bunu akılda tutarak, bağlantımı cevabıma dahil ettim.
Martin Braun

@modiX, üzgünüm kodunda benim hataydı ve yanlış şekilde açıklama aldı Evet yerel ayarlar (ilk değişken) 'dir Opsiyonel .
Kanhaiya lal

@Kanhaiyalal Merak etme, hatalar olabilir. Sadece 3 yorumcular 2 yanlış düzenleme de onayladı şaşırdı.
Martin Braun

51

Bir "str_pad" işlevi tanımlayabilirsiniz (php'de olduğu gibi):

function str_pad(n) {
    return String("00" + n).slice(-2);
}

9
"00" yerine "0" yeterlidir
David Fregoli

Şimdiye kadar en iyi cevap.
Lucas Andrade

30

Gelecekten insanlar için (ECMAScript 2017 ve sonrası)

Çözüm

"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

Açıklama

String.prototype.padStart(targetLength[, padString])Mümkün olduğunca çok sayıda ekler padStringde String.prototypehedefin yeni uzunluk olacak şekilde hedefe targetLength.

Misal

"use strict"

let month = "9"

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

let byte = "00000100"

byte = byte.padStart(8, "0") // "00000100"

4
Bu ES2017 veya ES8'in bir parçasıdır. Bu nedenle, ES6 ve ES7'nin bir parçası olmadığı için "ES6 +" demek yanlış.
Noel Llevares

1
Bu teknik olarak olması gerektiği .padStart(2, '0')ikinci parametresi bir dize olduğundan muhtemelen olsun typescript kullandığınız olmaz sürece rağmen
bmaupin

Haklısın, cevabımı düzenleyeceğim.
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;
}

//kullanımda:

(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
*/

10

Bunu yapmanın en kısa yolunu buldum:

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

tüm yalnız, tek basamaklara önde gelen sıfırlar ekleyecek


Bu çözümü seviyorum, belki orada ne olduğunu biraz açıklığa kavuşturabilir misiniz?
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();

5

Üçlü operatörü, tarihi "if" ifadesi gibi biçimlendirmek için kullanabilirsiniz.

Örneğin:

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

Yani

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

bir if ifadesine benzer; burada getDate () değeri 10'dan küçük bir değer döndürürse, '0' + Tarih değerini döndürür veya 10'dan büyükse tarihi döndürür (satır başını eklememiz gerekmediğinden) 0). Aynı ay için.

Düzenleme: getMonth'un 0 ile başladığını unutma, bu nedenle hesaba +1 ekledi. Tabii ki sadece d.getMonth () <9: diyebilirsiniz, ancak +1 kullanmanın anlaşılmasını kolaylaştıracağını düşündüm.


+ 1'i açıkladığınız için teşekkürler
Bryan A

5

sliceJavaScript kullanarak bu sorunu çözmek için başka bir yaklaşım var .

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

datestringsenin kadar formatıyla dönüş tarihi bekliyoruz: 2019/09/01

başka bir yaklaşım dateformatkütüphane kullanmaktır : https://github.com/felixge/node-dateformat


"JavaScript" yazımına dikkat edin.
Basil Bourque

3

Hayatınızı kolaylaştırın ve Moment.js'yi bazı örnek kodlar kullanın :

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

// Now will print 30-06-2015 17:55
console.log(beginDateTime);

4
moment.js -> buradaki 0.3k büyüklüğündeki çözümlere kıyasla 19.8k koduyla iyi bir çözüm değil.
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();
}

3

Tarihi biçimlendirmek için bir parametre olarak seçenekler sunabilirsiniz. İlk parametre ihtiyacınız olmayan yerel ayarlar için, ikinci parametre ise seçenekler içindir. Daha fazla bilgi için https://developer.mozilla.org/tr-TR/docs/Web/JavaScript/Reference/Global_Objects/Date/toLocaleDateString adresini ziyaret edin.

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

1
Önerileriniz için teşekkür ederiz.
MJ55

2

Bu sorunun doğru cevabını birden fazla önde gelen sıfır ekleyebilen ancak 1 sıfır eklemeye varsayılan olarak ekleyen bir fonksiyonda tamamladım.

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

sadece 2 rakamdan fazla olmayan sayılarla çalışmak için de bu bir yaklaşımdır:

function zeroFill(i) {
    return (i < 10 ? '0' : '') + i
  }

1

Dolgu yapmak için yerleşik bir işlev kullanan başka bir seçenek (ancak oldukça uzun bir kodla sonuçlanır!):

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

// '12/06/2017'

Ve başka bir, düzenli ifadelerle manipüle dizeleri:

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

// '2017/06/12'

Ancak, yılın başında ve sonunda günü göstereceğini unutmayın .


Bunu en çok beğendim: myDate.getDate (). toLocaleString ('en-US', {minimumIntegerDigits: 2})
Max Alexander Hanna

1

ModiX cevabına ek olarak, bu işe yarıyor ... BUNU boş olarak BIRAKMAYIN

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

1

İşte bu durumu nasıl ele alabileceğinize dair çok basit bir örnek.

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


0

Aşağıdakiler yapılandırmayı çıkarmayı, yapılandırmayı takmayı Date.protoypeve yapılandırmayı amaçlamaktadır .

ArrayZaman parçalarını saklamak için bir kullandım ve push() thisbir Datenesne olarak, yinelemem için bana geri dönüyor. İşim bitince, ben kullanabilirsiniz joinüzerinde returndeğer.

Bu oldukça hızlı çalışıyor gibi görünüyor: 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/


0

Ne yapacağım, şöyle görünüyor kendi özel Tarih yardımcı oluşturmak:

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

(ayrıca bu Fiddle'a bakın )


0

Baştaki sıfıra (gerektiğinde) izin vermek için biraz dolgu ekleyin ve seçim sınırlayıcınızı dize olarak kullanarak birleştirin.

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

0

@John Henckel'in önerdiği gibi, toISOString () yöntemini kullanmaya başlamak işleri kolaylaştırır

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


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
  }

ne denediğinizi kısaca açıklayabilirsiniz.
Shiv Kumar Baghel

0

bunu temel bir işlev için deneyin, kütüphaneye gerek yok

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

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

2
Bu kod soruyu cevaplayabilirken, sorunun nasıl ve / veya neden çözüldüğüne dair ek bağlam sağlamak yanıtlayıcının uzun vadeli değerini artıracaktır.
leopar

0

Bir dizenin bir bölümünü ayıklayan ve orijinal dizeyi değiştirmeden yeni bir dize olarak döndüren String.slice () öğesini kullanabilirsiniz :

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

Veya tarihi biçimlendirmek için Moment.js gibi bir lib de kullanabilirsiniz :

const moment = require("moment")
const currentDate = moment().format("YYYY-MM-DD") // 2020-04-16
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.