Ubah tanggal ISO ke format tanggal tttt-bb-hh di JavaScript

109

Bagaimana saya bisa mendapatkan tanggal dengan format yyyy-mm-dd dari tanggal ISO 8601 ?

Tanggal 8601 saya adalah

2013-03-10T02:00:00Z

Bagaimana saya bisa mendapatkan yang berikut ini?

2013-03-10
neeraj
sumber
2
Apakah Anda benar-benar mencoba melakukannya? Ini bukan pertanyaan baru yang telah dijawab beberapa kali.
bPratik
14
date.split("T")[0]akan dilakukan
Aravindh Gopi

Jawaban:

100

Coba ini

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

Memperbarui:-

Seperti yang ditunjukkan dalam komentar, saya memperbarui jawaban untuk mencetak angka nol di depan untuk tanggal dan bulan jika diperlukan.

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

Mritunjay
sumber
17
Catatan, saya tidak berpikir ini akan mencetak nol di depan untuk hari atau bulan
pengguna3413723
2
Setuju dengan @ user3413723 ini tidak menjawab pertanyaan karena menghapus awalan 0 sehingga tidak memenuhi persyaratan format TTTT-BB-HH
James Murphy
Bekerja dengan baik @Mritunjay
Ravi Delixan
Ini lebih panjang dan lebih rentan salah ketik dibandingkan dengan jawaban oleh DriveByPoster. Tapi saya tidak akan memberikan suara negatif karena lebih banyak bahasa-agnostik. Itu hanya tidak menggunakan alat sederhana yang kami miliki.
RoboticRenaissance
Pak bisakah Anda memberi tahu saya cara lulus 2013 3 1 format ini tanggal di Tanggal baru (tanggal)
Kapil soni
143

Pangkas saja stringnya:

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

Atau jika Anda hanya membutuhkan tanggal keluar dari string.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);
DriveByPoster
sumber
3
Saya pikir ini adalah solusi termudah dan paling elegan dari semuanya tetapi apakah di sini ada kekurangan untuk ini?
Aida_Aida
30
@Aida_Aida Satu-satunya masalah yang dapat saya pikirkan adalah jika kode Anda berkaitan dengan waktu skala geologis setidaknya 8000 tahun ke depan, kode Anda dapat rusak karena formatnya akan berada YYYYY-MM-DDdi tahun 10000. Untuk menghindari hal ini, Anda dapat membagi di Tkarakter sebagai gantinya. (Lihat en.wikipedia.org/wiki/Year_10,000_problem )
apsillers
9
Cara ini tidak akan menangani zona waktu dengan benar karena ISOString adalah UTC tetapi objek Tanggal bersifat lokal. Anda harus mempertimbangkan ini.
Guillaume F.
3
@Tokopedia pertimbangan penting tetapi memenuhi persyaratan OP
jamesjansson
Saya tidak mengerti mengapa string harus diurai menjadi Tanggal. The substring pilihan tampaknya menjadi jawaban yang paling sederhana.
RobG
46

Anda dapat memeriksa Moment.js , Luxon , date-fns atau Day.js untuk manipulasi tanggal yang bagus.

Atau ekstrak saja bagian pertama dari string ISO Anda, itu sudah berisi apa yang Anda inginkan. Berikut adalah contoh dengan membelah pada T:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"
antoine129
sumber
15

Moment.js akan menangani pemformatan tanggal untuk Anda. Berikut adalah cara memasukkannya melalui tag JavaScript, dan kemudian contoh cara menggunakan Moment.js untuk memformat tanggal.

<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"
Harris
sumber
Meskipun cuplikan kode ini dapat menyelesaikan pertanyaan, menyertakan penjelasan sangat membantu meningkatkan kualitas posting Anda. Ingatlah bahwa Anda menjawab pertanyaan untuk pembaca di masa mendatang, dan orang-orang itu mungkin tidak tahu alasan saran kode Anda. Harap juga mencoba untuk tidak memenuhi kode Anda dengan komentar penjelasan, karena ini mengurangi keterbacaan kode dan penjelasannya!
Selamat tinggal StackExchange
2
momentadalah pustaka yang cukup besar untuk digunakan hanya untuk pemformatan. Lebih baik gunakan date-fns yang ukurannya jauh lebih kecil dan memberikan fungsi yang sama.
Hozefa
@ Hozefa, lalu jawab pertanyaan OP dengan solusi Anda.
Harris
1
@Harris - melakukan pekerjaan dengan lancar!
HadidAli
Saya berharap momen memiliki beberapa fungsi seperti .toISODateString(), karena ini kasus yang sangat sering ...
Lev Lukomsky
12

Inilah yang saya lakukan untuk mendapatkan kencan saja:

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

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

Aravindh Gopi
sumber
2
Ini adalah jawaban pertama untuk benar-benar mengusulkan ide split () sebagai jawaban jawaban sejauh yang saya tahu dan saya suka solusi itu untuk faktor upaya vs keandalan vs efektif meskipun saya menggunakan momen () di mana pun saya bisa.
rainabba
1
toISOString menggunakan UTC, yang akan menghasilkan tanggal lokal yang salah untuk periode zona waktu lokal offset dari tengah malam. - RobG
Michael Dimmitt
9

Moment.js adalah pustaka yang cukup besar untuk digunakan pada satu kasus penggunaan. Saya sarankan menggunakan date-fnssebagai gantinya. Ini pada dasarnya menawarkan fungsionalitas paling banyak dari Moment.js dengan ukuran bundel yang jauh lebih kecil dan banyak lagi 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

Satu hal yang perlu diperhatikan adalah, karena ini adalah format waktu ISO 8601 , browser umumnya mengonversi dari waktu UTC ke zona waktu lokal. Padahal ini adalah kasus penggunaan sederhana yang mungkin bisa Anda lakukan'2013-03-10T02:00:00Z'.substring(0, 10); .

Untuk konversi yang lebih kompleks date-fnsadalah caranya.

Hozefa
sumber
6

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

Ammar H Alshaar
sumber
d.toLocaleDateString ('en-GB'); bekerja seperti pesona. Jawaban yang bagus!
Donald Shahini
5

Menggunakan:

new Date().toISOString().substring(0, 10);
Ankita
sumber
4

Ini akan mengeluarkan tanggal dalam format YYYY-MM-DD:

let date = new Date();
date = date.toISOString().slice(0,10);
sebhs
sumber
Saya tidak tahu mengapa ini tidak mendapatkan lebih banyak suara, ini bekerja dengan sempurna, dan menjawab pertanyaan dengan sedikit usaha
Wolfiebae
4

Berikan tanggal Anda di objek tanggal:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');
rk rk
sumber
1
toLocaleDateString () akan memberikan format "/". Bukan format "-".
TechCrunch
Anda dapat menggunakan yang di atas dengan mengganti "/" dengan "-". Bukan yang paling elegan jika toLocaleDateString pernah berubah
James Murphy
Hasil toLocaleDateString tidak konsisten untuk semua pengguna, jadi mungkin saja tidak memberikan hasil yang diminta oleh OP.
RobG
4

Untuk semua yang menggunakan split, slice, dan upaya berbasis string lainnya untuk mendapatkan tanggal, Anda dapat mengatur sendiri untuk kegagalan terkait zona waktu!

ISO-String memiliki Zulu-Timezone dan tanggal menurut zona waktu ini, yang berarti, mungkin menggunakan tanggal sehari sebelum atau setelah zona waktu aktual, yang harus Anda perhitungkan dalam rantai transformasi Anda.

Lihat contoh ini:

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"
Jook
sumber
3

Jika Anda memiliki objek tanggal:

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

console.log(result)

atau

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

console.log(result)

Илья Зеленько
sumber
1
toISOString menggunakan UTC, yang akan menghasilkan tanggal lokal yang salah untuk periode zona waktu lokal offset dari tengah malam.
RobG
1

Untuk memperpanjang solusi rk rk : Jika Anda ingin formatnya menyertakan waktu, Anda dapat menambahkan toTimeString()ke string Anda, lalu menghapus bagian GMT, sebagai berikut:

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

Saya menggunakan ini:

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
}

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

Alan
sumber
0

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

Abilash Raghu
sumber
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;
MemoryLeak
sumber
0

Versi jawaban yang lebih baik oleh @Hozefa .

Jika Anda telah date-fnsmenginstal, Anda dapat menggunakan fungsi formatISO

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

Gunakan kode di bawah ini. Ini berguna untuk Anda.

let currentDate = new Date()
currentDate.toISOString()
Mohammad Bilal
sumber