JS tarih nesnesinden YYYYMMDD biçiminde dize al?


398

Biçiminde date objectbir dize açmak için JS kullanmaya çalışıyorum YYYYMMDD. Artarda daha kolay bir yolu var mı Date.getYear(), Date.getMonth()ve Date.getDay()?


4
Bu üçü birleştirmek gitmek için bir yoldur
Juan Cortés

5
aynı tarihe ayrıştırılacak bir dize istiyorsanız, ayı artırmayı unutmayın. Teknik özelliklerinize uygun olması için ay ve tarihte tek rakamları '0' ile
doldurmanız gerekir

Yanıtlar:


621

Sık sık kullandığım kod parçası:

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

16
Sen değiştirmelisiniz [1]ile .length===2bir dize üzerinde bir dizin tam desteklenmediği için. Nedeni için bu cevaba bakınız.
Aidiakapi

6
var mm = (this.getMonth () + 101) .toStrung (). alt dize (0, 2);
9dan

7
@Aidiakapi'nin düzeltmesi için pratik bir örnek isteyen herkes için burada bir keman oluşturuyorum: jsfiddle.net/pcr8xbt5/1
killercowuk

1
Nokta ayırıcısı istiyorsanız:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski

3
@ 9dan olmamalıvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar Sbi Wer

317

Prototife eklemeyi sevmedim. Bir alternatif:

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;


51
rightNowDeğişkenin etrafında ihtiyacınız yoksa, new Datehepsini tek bir satırda (new Date()).toISOString().slice(0,10).replace(/-/g,"")
sarıp

5
İstediğim YYYYMMDDHHmmSSsssBunu yapan, böylece: var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Oldukça basit, ancak kapsüllenmelidir.
Jess

65
Date.toISOString (), UTC ile biçimlendirilmiş bir tarih oluşturduğundan ve bu nedenle saat dilimine bağlı olarak tarih sınırlarını atlayabildiğinden, bu genel olarak çalışmaz. Örneğin GMT + 1'de: (yeni Tarih (2013,13, 25)). ToISOString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Eğer 10000 yılında birisi 'nostaljik' kodunuzu kullanırsa bu başarısız olur.
Trevi Awater

9
Zaman dilimleri ile başa çıkmak için önerilen bir gelişme. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas

182

toISOStringİşlevi kullanabilirsiniz :

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

Size bir "yyyy-aa-gg" biçimi verecektir.


24
Bazı durumlarda, saat dilimi gün ışığı
Miguel

1
Belki de yaratıcılığım kırıldı @Miguel, ama bunun olacağı bir durum düşünemiyorum. Bir örnek vermek ister misiniz?
cloudworks

35
+1 saat dilimindeyseniz ve bir tarihiniz varsa [2015-09-01 00:00:00 GMT + 1], toISOString () yöntemi '2015-08-31T23: 00: 00.000Z dizesini döndürür çünkü tarih dizgilenmeden önce UTC / 0-ofsetine dönüştürülür.
Luke Baulch

Biraz daha kısa ... var bugün = (yeni Tarih ()). ToISOString (). Substring (0, 10);
teawithfruit

Farklı GMT ile başarısız
Tobia

132

Moment.js arkadaşın olabilir

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
Eh benim app.js 40kb (küçültülmüş, olmayan gZip) eklemek DID, ama bunun için gittim, teşekkürler :).
Bart

şimdiye kadarki en iyi cevap!
TrulyXax

9
Artık kaçınılmaz olarak ana ihtiyacım olana kadar beklemekten rahatsız olmuyorum, sadece bir projenin başında ekliyorum :)
martinedwards

1
Bunu kolaylaştırabilirsiniz:var formattedDate = moment().format('YYYYMMDD');
ns16

37

Saf bir JS çözümüne ihtiyacınız yoksa, işi bu şekilde yapmak için jQuery UI kullanabilirsiniz:

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

Genellikle çok fazla kütüphane almak istemiyorum. Ancak jQuery kullanıcı arayüzü çok kullanışlı, muhtemelen projenizde başka bir yerde kullanacaksınız.

Daha fazla örnek için http://api.jqueryui.com/datepicker/ adresini ziyaret edin


37

Bu, YYYY-MM-DDbugünün tarihinin bir dizesini oluşturmak için kullanabileceğiniz tek bir kod satırıdır .

var d = new Date().toISOString().slice(0,10);

^ Bu! FTW! +1 .. gerçi biraz test etmek gerekiyor.
Gogol

21
Uyarı zor, eğer tarihiniz 2016-01-01 00:00:00 GMT +2 ise, 2015-12-31 dönecektir, çünkü toISOString()2015-12-31T22: 00: 00 GMT +0 (iki saat önce) verecektir.
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'

5
En iyi ruh.
زياد

Nedense, ben burada, doğu kıyısında ABD formülü çalıştırdığınızda dönüşüm bir gün geri atlamak için zaman (00:00 bile) eklemek gerekiyordu. Bunu yaptıktan sonra güvenilir bir şekilde çalışmaya başladı. Bu konuda sevdiğim şey, giriş tarihini birden fazla formatta alabilmesi, bu yüzden artık bunun için endişelenmem gerekmiyor. 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

Oo'nun cevabına ek olarak, mantık işlemlerini dönüşten ayırmayı ve bunları değişkenlere üçlü olarak koymayı tavsiye ederim.

Ayrıca, concat()değişkenlerin güvenli birleştirmesini sağlamak için kullanın

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>


Birisi bunu kullanmayı seviyorsa, burada KURU öneriyorum, aynı şeyi tekrar yapmak yerine zaten oluşturulmuş işlevleri yeniden kullanın.
RiZKiT

@RiZKiT DRY bir model değil, bir prensiptir, ancak elbette bu çok geliştirilebilir. Bunu kendim nerede kullanacak olursam, muhtemelen başka bir model kullanır ve yöntemleri prototipten uzaklaştırırdım. Ben esas olarak sorunu çözmek için başka yollar nerede göstermek için örnek yazdı. İnsanların oradan aldığı yer kendilerine kalmış
Eric Herlitz

Güzel! ("00" + (this.getDate())).slice(-2)İki basamaklı sayıları elde etmek için kullanıyorum . "İf" veya "?:" İfadesi ve .getX () işlevine daha az çağrı yoktur. Biraz daha hızlı değilse, en azından daha okunabilir.
le hollandais volant

22

Yerel nesneleri değiştirmeyi sevmiyorum ve çarpmanın kabul edilen çözümü doldurma dizesinden daha net olduğunu düşünüyorum.

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

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


4
Bu cevap reddedildi ve nedenini bilmiyorum. Matematiğin dize manipülasyonundan daha hızlı ve daha net olduğunu hissettim. Bunun neden kötü bir cevap olduğunu bilen biri varsa, lütfen bana bildirin.
Darren Griffith

4
10000 çarpma aracı YYYY'yi 4 basamak sola kaydırmak için oradadır (ay ve gün basamaklarının her biri 2 basamak gerekir) ve Y10K hatasıyla ilgisi yoktur. Bu cevabı seviyorum ve saygıyı hak ediyor!
A.Masson

1
Bu cevap için teşekkürler ben burada keman oluşturdu jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

1
Çarpmaya hiç ihtiyacım yoktu ve neden orada olduğunu anlamıyorum. jsfiddle.net/navyjax2/gbqmv0t5 Aksi takdirde, bunu dışarıda bırakın ve bu harika bir cevap ve bana çok yardımcı oldu.
vapcguy

1
@ D-Money Ah, ne demek istediğini anladım - birbirleri üzerinde farklı bir matematik işlemi yapmasını önlemek için sayıları toplayarak farklı bir tür birleştirme yapıyorsun - normal olana izin vermemek için ' aksi takdirde onları berbat ettim. Aferin! Benimki .replace('-', ''), OP'nin orijinal sorusuna sadık kaldığınızda ve bu ekstra adımı gerektirmeyecek şekilde ayırıcıları kullandığım için ( OP'nin sorusuna cevap vermek için bir şey yapmam gerekirdi ) çalışır. Mükemmel!
vapcguy

15

UTC'de Date.toISOString () baskısının neden olabileceği herhangi bir tarih atlama sorunu olmayan Düz JS (ES5) çözümü:

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

Bu @ weberste'nin @Pierre Guilbert'in cevabı hakkındaki yorumuna yanıt olarak.


now.getMonth () Ocak için 0 döndürür, öyle olmalıdır (now.getMonth () + 1)
Jas

2
Yanlış. Tarihin UTC işlevi ayın 0 ile 11 arasında olmasını bekler (ancak diğer <0 ve> 11'e izin verilir).
Dormouse

Neden birden fazla tireyi tek bir yerle değiştiriyorsunuz? Can toISOStringbirden ardışık tire dönmek?
Michaël Witrant

Michael - Bulunan her tireyi tek bir tireyle değiştiriyor. Hala nedenini bilmiyorum (belki de yedek dize sadece bir ayırıcı için bir yer tutucudur). 'G' tüm oluşumlar anlamına gelir. Düşündüğünüz desen / [-] + / g
Gerard ONeill

2
Günümü gün ettin. Javascript korkunç TimeZone taşıma atlamak için basit bir yol için gün arıyordum ve bu hile yapar!
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


Kullandığım cevap bu. Saat dilimini dikkate alan bir astar. Orijinal posterin sorusunu cevaplamak için şunları yapabiliriz: (new Date (Date.now () - (new Date ()). GetTimezoneOffset () * 60000)). ToISOString (). Replace (/ [^ 0-9] / g, ""). dilim (0,8)
tomwoods

thx, YYYY-AA-GG i elde etmek için: new Date (Date.now () - (new Date ()). getTimezoneOffset () * 60000) .toISOString (). dilim (0, 10) .relace (/ [ ^ 0-9] / g, "-")
Nick Humphrey

7

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

console.log(dateFormated);


Çok zeki. Teşekkür ederim
JMaylin

4
Yeni Date () bir saat dilimi içerdiğinden ve Date.toISOString () UTC olduğundan çalışmaz. Cevabımı gör.
Dormouse

@Dormouse tam tersi değil mi? new Date()yeni bir tarih nesnesi oluşturur. 1970/1/01 00: 00: 00.000 UTC'den beri ms. Ardından toISOStringyerel saat diliminde yazdırılır.
Stijn de Witt

Hayır, Date.toISOString () işlevi UTC olarak yazdırılır.
Dormouse

7

Başka bir yol, İsveç, Litvanya, Macaristan, Güney Kore gibi büyük-endian tarih formatı standardınatoLocaleDateString sahip bir yerel ayarla kullanmaktır :

date.toLocaleDateString('se')

Sınırlayıcıları kaldırmak için (- ) yalnızca rakam olmayanları değiştirmekle ilgilidir:

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

Bu, UTC tarih biçimleriyle alabileceğiniz olası bir hataya sahip değildir: UTC tarihi, yerel saat dilimindeki tarihe göre bir gün kapalı olabilir.


6

Yıl içindeki tarihi almak için bu tek satır kodunu kullanabilirsiniz.

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

5

Bu konudaki en popüler cevap için biraz basitleştirilmiş sürüm 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;
}

5

dateformat çok kullanılan bir pakettir.

Nasıl kullanılır:

dateformatNPM'den indirin ve yükleyin . Modülünüzde gerekli kılın:

const dateFormat = require('dateformat');

ve sonra sadece dosyalarınızı biçimlendirin:

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


4

Buradaki adam => http://blog.stevenlevithan.com/archives/date-time-formatformat() Javascriptler için bir işlev yazdıDate nesnesi , böylece tanıdık değişmez biçimlerle kullanılabilir.

Uygulamanızın Javascript'inde tam özellikli Tarih biçimlendirmesine ihtiyacınız varsa bunu kullanın. Aksi takdirde, yapmak istediğiniz şey bir kapalı ise, getYear (), getMonth (), getDay () 'i bitiştirmek muhtemelen en kolaydır.


4

@ Oo'nun cevabından çalışmak, tarih dizesini bir biçim dizesine göre geri verecektir. Gerekirse yıl ve milisaniye için 2 basamaklı bir yıl regex'i kolayca ekleyebilirsiniz.

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

Ne kadar verimli olduğunu bilmiyorum, özellikle çok akıllıca çünkü regex çok kullanıyor. Muhtemelen saf js usta değilim bazı işleri kullanabilirsiniz.


4

Bu kod Pierre Guilbert'in cevabına yöneliktir:

(10000 yıl sonra bile çalışır)

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


3

Bunu yapmak gerektiğinde genellikle aşağıdaki kodu kullanıyorum.

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

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

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

MyDate.getMonth () 9 döndürürse, şöyle olur:

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

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

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

"09"

Ancak date.getMonth () 10 döndürürse, şöyle olacaktır:

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

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

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

"10"

3

AngularJ'ler (1,5'e kadar) kullanıyorsanız tarih filtresini kullanabilirsiniz :

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

3

Sadelik ve okunabilirlik için bir başkasına cevap vermek.
Ayrıca, önceden tanımlı mevcut sınıf üyelerinin yeni yöntemlerle düzenlenmesi önerilmez:

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



2

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


1
Cevabınıza biraz açıklama ekleyerek size oy verir bu kodda ne yaptığınızı biraz açıklamaya çalışın, böylece diğerleri daha net anlayabilir.
Muhammed Ömer Aslam

Katı modda veya daktiloda "let f, yyyymmdd = x => ..." kullanın. Yyyymmdd ve f işlevleri başka türlü tanımlanmamıştır.
Maksimum


2

PadStart kullanın :

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

1

İşte hem tarih hem de saat bileşenlerine izin veren ve sayı veya dize olarak aynı şekilde sıralanabilir daha genel bir yaklaşım .

Tarih ISO biçiminin sayı sırasına göre, yerel bir saat dilimine dönüştürün ve rakam olmayanları kaldırın. yani:

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

kullanım

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"

1

Yerel Javascript:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

1
Bu, ayın 2 basamak olmasını sağlamak için ayları 0 ile doldurmaz.
Attila Szeremi

Haklısın. Daha sonra bunu kendim fark ettim. Çift haneli ay ve günlerde tarih biçimlendirmesini test etmeye dikkat etmelisiniz.
Lonnie Best
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.