JavaScript'te bir ISO tarihini yyyy-aa-gg tarih biçimine dönüştürme


Yanıtlar:


102

Bunu dene

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

Güncelleme:-

Yorumlarda belirtildiği gibi, gerekirse tarih ve ay için önde gelen sıfırları yazdırmak için yanıtı güncelliyorum.

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);


17
Not, bunun gün veya ay başına sıfır yazdıracağını sanmıyorum
user3413723

2
@ User3413723 ile aynı fikirde olun, bu soruya yanıt vermiyor çünkü baştaki 0'ı kaldırıyor, bu nedenle YYYY-AA-GG biçiminin gereksinimlerini karşılamıyor
James Murphy

İyi çalışıyor @Mritunjay
Ravi Delixan

Bu, DriveByPoster'ın cevabına kıyasla daha uzun ve yazım hatasına daha yatkın. Ancak olumsuz oy vermeyeceğim çünkü bu daha dilden bağımsızdır. Elimizdeki basit araçları kullanmıyor.
RoboticRenaissance

efendim lütfen bana 2013 3 1 bu formatta tarihi yeni olarak nasıl geçeceğimi söyler misiniz Tarih (tarih)
Kapil soni

148

Sadece dizeyi kırpın:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

Veya sadece dizinin dışında bir tarihe ihtiyacınız varsa.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

3
Bence bu hepsinden en kolay ve en zarif çözüm ama burada bunun için herhangi bir düşüş var mı?
Aida_Aida

30
@Aida_Aida Aklıma gelen tek sorun, kodunuz gelecekte en az 8000 yıl jeolojik ölçekli zamanla ilgilenirse, kodunuz bozulabilir çünkü format YYYYY-MM-DD10000 yılında olacaktır . Bunu önlemek için, Tonun yerine karakter. (Bkz en.wikipedia.org/wiki/Year_10,000_problem )
apsillers

9
ISOString UTC olduğundan ancak Date nesnesi yerel olduğundan bu şekilde saat dilimlerini doğru şekilde işlemez. Bunu dikkate almalısın.
Guillaume F.

4
@Bayram o OP'ın gereksinimlerine uygun mu önemli husus ama
jamesjansson

Dizenin neden bir Tarihe ayrıştırılması gerektiğini anlayamıyorum. Alt dize seçeneği en basit cevap gibi görünüyor.
RobG


15

Moment.js sizin için tarih biçimlendirmesini halledecektir. Bunu bir JavaScript etiketi aracılığıyla nasıl ekleyeceğiniz ve ardından bir tarihi biçimlendirmek için Moment.js'nin nasıl kullanılacağına dair bir örnek.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

Bu kod parçacığı soruyu çözebilirken, bir açıklama eklemek, yayınınızın kalitesini artırmaya gerçekten yardımcı olur. Gelecekte okuyucular için soruyu yanıtladığınızı ve bu kişilerin kod önerinizin nedenlerini bilmeyebileceklerini unutmayın. Lütfen kodunuzu açıklayıcı yorumlarla doldurmamaya çalışın, çünkü bu hem kodun hem de açıklamaların okunabilirliğini azaltır!
Hoşçakal StackExchange

2
momentsadece biçimlendirme için kullanılacak oldukça büyük bir kitaplıktır. Bunun yerine , boyut olarak çok daha küçük olan ve aynı işlevselliği sağlayan tarih-fns kullanın .
Hozefa

@Hozefa, ardından çözümünüzle OP sorusunu yanıtlayın.
Harris

1
@Harris - işi sorunsuz yaptı!
HadidAli

Keşke anın bir işlevi olsaydı .toISODateString(), çünkü bu çok sık rastlanan bir durumdur ...
Lev Lukomsky

13

Sadece buluşmak için yaptığım şey bu:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);


2
Bu, anlayabildiğim kadarıyla split () fikrini cevap olarak önermenin ilk cevabıdır ve moment () 'i elimden geldiğince her yerde kullansam da çabaya karşı güvenilirliğe karşı etkili faktör için bu çözümü seviyorum.
rainabba

1
toISOString, gece yarısından itibaren yerel saat dilimi uzaklığı dönemi için yanlış yerel tarih üretecek olan UTC'yi kullanır. - RobG
Michael Dimmitt

10

Moment.js , tek kullanımlık bir durumda kullanmak için oldukça büyük bir kitaplıktır. Onun date-fnsyerine kullanmanızı tavsiye ederim . Temelde Moment.js'nin en işlevselliğini çok daha küçük paket boyutu ve daha fazlasıyla sunar formatting options.

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

Unutulmaması gereken bir nokta, ISO 8601 saat formatı olduğundan, tarayıcının genellikle UTC saatinden yerel saat dilimine dönüştürülmesidir. Bu, muhtemelen yapabileceğiniz basit bir kullanım durumu olsa da'2013-03-10T02:00:00Z'.substring(0, 10); .

Daha karmaşık dönüşümler date-fnsiçin gidilecek yoldur.


7

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy


1
d.toLocaleDateString ('en-GB'); tıkır tıkır çalışıyor. Mükemmel cevap!
Donald Shahini

5

Kullanım:

new Date().toISOString().substring(0, 10);

4

Bu, tarihi YYYY-AA-GG formatında verir:

let date = new Date();
date = date.toISOString().slice(0,10);

Bunun neden daha fazla oy almadığını bilmiyorum, mükemmel çalıştı ve soruyu asgari çabayla yanıtladı
Wolfiebae

4

Tarih nesnesine tarihinizi yazın:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

1
toLocaleDateString () "/" formatında verecektir. "-" biçimi değil.
TechCrunch

Yukarıdakileri "/" yerine "-" ile kullanabilirsiniz. ToLocaleDateString hiç değişirse en zarif değil
James Murphy

ToLocaleDateString'in sonucu tüm kullanıcılar için tutarlı değildir, bu nedenle OP'nin gerektirdiği sonucu pekala üretmeyebilir.
RobG

4

Tarihi elde etmek için bölme, dilim ve diğer dizgeye dayalı girişimleri kullanan herkes için, saat dilimiyle ilgili başarısızlıklar için kendinizi ayarlayabilirsiniz!

Bir ISO-String, Zulu-Timezone'a ve bu saat dilimine göre bir tarihe sahiptir, yani dönüşüm zincirinizde hesaba katmanız gereken gerçek saat diliminden bir gün önceki veya sonraki bir tarihi kullanabilir.

Bu örneğe bakın:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"

3

Bir tarih nesneniz varsa:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

veya

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)


1
toISOString , gece yarısından itibaren yerel saat dilimi farkı için yanlış yerel tarih üretecek olan UTC'yi kullanır.
RobG

1

Rk rk çözümünü genişletmek için : Formatın saati de içermesini istiyorsanız, dizenize ekleyebilir toTimeString()ve ardından GMT bölümünü aşağıdaki gibi ayırabilirsiniz :

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

1

@Hozefa tarafından yanıtın daha iyi bir versiyonu .

Eğer varsa date-fnsyüklü şunu kullanabilirsiniz formatISO işlevi

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

0

Bunu kullandım:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

Kaynak: http://gooplus.fr/en/2017/07/13/angular2-typescript-isodate-to-html-date/


0

    var d = new Date("Wed Mar 25 2015 05:30:00 GMT+0530 (India Standard Time)");
    alert(d.toLocaleDateString());


0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

-4

Aşağıdaki kodu kullanın. Senin için faydalıdır.

let currentDate = new Date()
currentDate.toISOString()
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.