Bagaimana saya bisa mengkonversi string ke datetime dengan spesifikasi format dalam JavaScript?

208

Bagaimana saya bisa mengkonversi string ke objek waktu tanggal dalam javascript dengan menentukan string format?

Saya mencari sesuatu seperti:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");
Serhat Ozgel
sumber
2
Titik dan tanda hubung BTW dapat gagal sebagai pemisah tanggal, garis miring tidak apa-apa, jadi (hingga batas pengujian saya) Javascript akan menerima "2011/08/22 10:30:00" tetapi belum (meskipun ISO 8601) "2011-09 -02 15:58:40 "yang - diklaim - didukung dalam Javascript 1.8.5 pada.
Dave Everitt
Fungsi Date.parse mem-parsing string tanggal yang dalam format "mm / hh / tttt". Harap konversi string ke format "mm / hh / tttt" sebelum menerapkan Parse.
Mengapa tidak mencantumkan tanggal dalam format yang diperlukan? Saya suka Date baru ('2012 11 25 18:00:00'); dan itu berhasil!
foxybagga

Jawaban:

88

Saya pikir ini dapat membantu Anda: http://www.mattkruse.com/javascript/date/

Ada getDateFromFormat()fungsi yang bisa Anda sesuaikan sedikit untuk menyelesaikan masalah Anda.

Pembaruan: ada versi terbaru dari sampel yang tersedia di javascripttoolbox.com

Rafael Mueller
sumber
5
TypeError: Object Date has no method 'getDateFromFormat'
Derek 朕 會 功夫
6
Metode getDateFromFormat tersedia dengan doc, pada tautan di atas. Sumber tersedia di sini: mattkruse.com/javascript/date/source.html
Rafael Mueller
1
+1, pustaka yang bagus..pure javascript ... sangat fantastis. terima kasih
Surendra Jnawali
7
Kedua tautan mati
Sytham
1
Jika Anda bisa, perbarui tautannya. Ini tidak membantu lagi.
Tallerlei
98

Gunakan jika string Anda kompatibel dengan . Jika format Anda tidak kompatibel (saya pikir itu adalah), Anda harus mengurai string sendiri (harus mudah dengan ekspresi reguler) dan membuat objek Tanggal baru dengan nilai eksplisit untuk tahun, bulan, tanggal, jam, menit dan detik.new Date(dateString)Date.parse()

Christoph
sumber
1
Date.parse adalah solusi terbaik! Ini mengurai hampir semuanya! +1
ianaz
7
@ianaz: HAMPIR semua yang digunakan di Amerika, tetapi melewatkan format yang digunakan oleh sebagian besar Eropa terlalu besar "hampir". Tetapi Date baru adalah dasar yang baik untuk fungsi kustom.
Pavel V.
Date baru (dateString) bekerja dengan baik untuk saya, Date.parse () alih-alih dikonversi ke milidetik dan karenanya mengembalikan nomor bukan tipe Tanggal.
Reagan Ochora
68

@Christoph Menyebutkan menggunakan regex untuk mengatasi masalah tersebut. Inilah yang saya gunakan:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

Ini sama sekali tidak cerdas, cukup mengkonfigurasi regex dan new Date(blah)sesuai dengan kebutuhan Anda.

Sunting: Mungkin sedikit lebih bisa dipahami dalam ES6 menggunakan penghancuran:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

Tetapi dalam semua kejujuran hari ini saya meraih sesuatu seperti Momen

Organik panda
sumber
19
@ bažmegakapa alih-alih menangis, Anda mungkin bisa mengedit jawaban dan menambahkan 'var sendiri?
OrganicPanda
Mengapa Anda menggunakan /gbendera, hanya untuk mengatur lastIndexke 0sesudahnya? Hanya saja, jangan gunakan pertandingan global.
Ry-
1
@minitech Itu /gadalah copy / paste ceroboh dari proyek yang ada. lastindextelah ditambahkan oleh editor (untuk memerangi \gkurasa?). Saya akan menghapusnya sekarang. Terima kasih telah menunjukkannya.
OrganicPanda
1
jawaban yang sangat bagus .. sangat berguna bagi saya
Jethik
14

Tidak ada rutinitas format tanggal / waktu yang canggih di JavaScript.

Anda harus menggunakan perpustakaan eksternal untuk output tanggal yang diformat, "Format Tanggal JavaScript" dari Flagrant Badassery terlihat sangat menjanjikan.

Untuk konversi input, beberapa saran telah dibuat. :)

Tomalak
sumber
3
"harus" adalah relatif. Tentu saja Anda dapat membangun implementasi Anda sendiri. :)
Tomalak
13

Lihat Moment.js . Ini adalah perpustakaan modern dan kuat yang menggantikan fungsi Tanggal menyedihkan JavaScript (atau kekurangan fungsi).

Aaron Grey
sumber
3
Saya tidak mengundurkan diri, tetapi mungkin akan lebih baik untuk mengetahui persis fungsi mana di Moment. .
Matt
Pelokalan terlihat menjanjikan, pilih lokal-eropa untuk format dot. Namun, saya tidak mengujinya dan format datetime lengkap tidak dalam contoh yang saya lihat.
Pavel V.
Saya tidak mengundurkan diri, tetapi saya hanya ingin mengatakan bahwa ini lambat. Untuk desktop ok, tetapi untuk seluler mungkin terlalu lambat (tergantung kebutuhan Anda).
gabn88
11

Hanya untuk jawaban yang diperbarui di sini, ada js lib yang bagus di http://www.datejs.com/

Datejs adalah pustaka Date JavaScript sumber terbuka untuk parsing, pemformatan, dan pemrosesan.

Alexis Abril
sumber
Rolled edit itu, meskipun sangat membantu itu harus ditambahkan sebagai komentar atau jawaban terpisah.
Alexis Abril
Lagipula terlalu panjang untuk berkomentar, dan menambahkan jawaban yang digandakan itu salah. Pertanyaan ini memiliki lebih dari 155.000 tampilan - mari berikan informasi sebanyak mungkin kepada orang-orang ini! (Ngomong-ngomong - sangat umum di Stack Overflow untuk mengedit jawaban yang ada - Anda mungkin akan merasa lebih buruk jika saya hanya menyalin jawaban Anda ...)
Kobi
1
Lagi pula, jika Anda tidak menyukai hasil edit saya itu baik-baik saja, tetapi perluas jawaban Anda - "Hanya untuk jawaban yang diperbarui di sini" adalah pengisi, dan tidak ada detail. Ngomong-ngomong, pertanyaan ini mendapat perhatian saat ini, yang merupakan alasan Anda tiba-tiba mendapat 5 suara.
Kobi
7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}
navin
sumber
5

Pustaka eksternal adalah kerja keras untuk mengurai satu atau dua tanggal, jadi saya membuat fungsi saya sendiri menggunakan solusi Oli dan Christoph . Di sini, di Eropa Tengah, kami jarang menggunakan aything selain format OP, jadi ini sudah cukup untuk aplikasi sederhana yang digunakan di sini.

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}
Pavel V.
sumber
4

Date.parse() cukup cerdas tetapi saya tidak dapat menjamin bahwa format akan diurai dengan benar.

Jika tidak, Anda harus menemukan sesuatu untuk menjembatani keduanya. Contoh Anda cukup sederhana (menjadi angka murni) sehingga sentuhan REGEX (atau bahkan string.split()- mungkin lebih cepat) dipasangkan dengan beberapaparseInt() akan memungkinkan Anda untuk dengan cepat membuat kencan.

Oli
sumber
4
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec
puneet18
sumber
ditambah 1 setelah memanggil fungsi getmonth () tampaknya salah
Arjunsingh
t.getMonth () + 1 benar karena Date.getMonth () mengembalikan nilai berdasarkan 0.
Jussi Palo
3

Hanya untuk memberikan 5 sen saya.

Format tanggal saya adalah dd.mm.yyyy (format UK) dan tidak ada contoh di atas yang berfungsi untuk saya. Semua parser mempertimbangkan mm sebagai hari dan dd sebagai bulan.

Saya telah menemukan perpustakaan ini: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ dan berhasil, karena Anda dapat mengatakan urutan bidang seperti ini:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

Saya harap itu membantu seseorang.

Anton Valqk
sumber
Tautan sekarang mati!
Baiklah ... quick archive.org menunjukkan: bitbucket.org/mazzarelli/js-date/downloads adalah url proyek.
Anton Valqk
1

Moment.js akan menangani ini:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;
Chintsu
sumber
1
Meskipun moment.js bagus, ada sejumlah besar kasus penggunaan di mana Anda harus menggunakan Javascript asli. Kasus penggunaan saya saat ini adalah fungsi Peta di CouchDB
Zach Smith
1

Anda dapat menggunakan perpustakaan moment.js untuk ini. Saya hanya menggunakan untuk mendapatkan keluaran spesifik waktu tetapi Anda dapat memilih format apa yang ingin Anda pilih.

Referensi:

1. perpustakaan sesaat: https://momentjs.com/

2. fungsi spesifik waktu dan tanggal: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

dan Anda dapat memanggil metode ini seperti:

this.convertDate('2020-05-01T10:31:18.837Z');

Saya harap ini membantu. Nikmati pengkodean.

amit pandya
sumber
0

Untuk sepenuhnya memenuhi string konversi Date.parse ke format dd-mm-YYYY seperti yang ditentukan dalam RFC822, jika Anda menggunakan parse yyyy-mm-dd dapat melakukan kesalahan.

Valentin Rusk
sumber
FYI, Dari RFC 822 (halaman: 25. Sebagian dibersihkan untuk memenuhi panjang teks untuk komentar): 13 Agustus 1982 - 25 - RFC # 822 5. SPESIFIKASI TANGGAL DAN WAKTU 5.1. SYNTAX date-time = [day ","] tanggal waktu; dd mm yy jj: mm: ss zzz day = "Sen" / "Sel" / "Rabu" / "Kam" / "Jumat" / "Sabtu" / "Sabtu" / "Matahari" tanggal = 1 * 2DIGIT bulan 2DIGIT; hari bulan tahun mis. 20 Jun 82 bulan = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Agu" / "Sep" / "Okt" / " Nov "/" Des "
Valentin Rusk
0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }
Abhishek Kanrar
sumber
Querist meminta untuk menentukan string format .
Armali
@Armali Input parameter seperti "/ Tanggal (1552415400000) /" dalam format string
Abhishek Kanrar