Ubah string dd-mm-yyyy menjadi tanggal

184

saya mencoba untuk mengubah string dalam format dd-mm-yyyy menjadi objek tanggal dalam JavaScript menggunakan yang berikut ini:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()berisi tanggal dalam format hh-bb-tttt. Ketika saya melakukan hal berikut, saya mendapatkan "Tanggal Tidak Valid":

alert(f);

Apakah ini karena simbol '-'? Bagaimana saya bisa mengatasi ini?

pengguna559142
sumber
Apakah ini terjadi dengan semua tanggal atau satu khususnya?
kasdega

Jawaban:

326

Pisahkan pada "-"

Pisahkan string ke bagian yang Anda butuhkan:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Gunakan regex

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

Mengapa tidak menggunakan regex?

Karena Anda tahu Anda akan mengerjakan string yang terdiri dari tiga bagian, dipisahkan oleh tanda hubung.

Namun, jika Anda mencari string yang sama di dalam string lain, regex akan menjadi cara untuk melakukannya.

Penggunaan kembali

Karena Anda melakukan ini lebih dari sekali dalam kode sampel Anda, dan mungkin di tempat lain dalam basis kode Anda, bungkus dalam sebuah fungsi:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Menggunakan sebagai:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

Atau jika Anda tidak keberatan jQuery dalam fungsi Anda:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Menggunakan sebagai:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

JavaScript modern

Jika Anda dapat menggunakan JS yang lebih modern, perusakan array juga merupakan sentuhan yang bagus:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}
Adrian Lynch
sumber
9
mengalahkan saya untuk itu ... tapi saya masih menggunakan DateJs. Ini tidak sepenuhnya benar karena kesalahan tiang pagar. bulannya 0-11 sehingga Anda perlu mengurangi 1. f = Tanggal baru (dari [2], dari [1] -1, dari [0]);
kasdega
12
Jawaban yang dipilih dengan bug yang menghasilkan tanggal yang salah. Luar biasa!
epascarello
3
Cheers @kasdega - Diedit ... beberapa waktu lalu!
Adrian Lynch
@AdrianLynch Bagaimana mengonversi "Month dd, yyyy" menjadi "MM / dd / yyyy" di javascript?
dilipkumar1007
1
Opsi @Adrian Lynch Modern JavaScript hebat! Terima kasih.
Alexandre Ribeiro
134

contoh ekspresi reguler:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );
epascarello
sumber
8
Sebuah revisi yang juga perlu /adalah pembatas dan satu tahun terbuat dari 2 digit (atau jumlah yang lebih besar dari 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki
1
Mengapa ini menjadi jawaban yang dipilih @AdemirNuno? Mengapa menggunakan RegEx untuk string dalam format yang dikenal? Anda tidak mencari pola, Anda tahu angka pertama adalah hari, bulan kedua dan ketiga tahun. RegEx adalah alat yang salah untuk pekerjaan dalam kasus ini.
Adrian Lynch
Sebuah revisi yang membutuhkan pembatas non-digit, tanggal tanpa nol terkemuka dan 2 atau 4 digit tahun: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH
begitu praktis, terima kasih. format tanggal saya disertai dengan waktu, jadi saya mengode ulangnya sebagai: 'Tanggal baru ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' Apakah tepat?
Kamuran Sönecek
@NeerajSingh Bagaimana mengkonversi "Bulan dd, yyyy" menjadi "MM / dd / yyyy" di javascript?
dilipkumar1007
15

Kemungkinan lain:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Sesuaikan angka dan atur ulang angka-angka itu

Joe
sumber
Juga pertanyaan awal yang ditentukan "dd-mm-yyyy", bukan "mm-dd-yyyy", jadi masih salah (tapi baru saja).
Phil M Jones
@epascarello Bagaimana cara mengubah "Month dd, yyyy" menjadi "MM / dd / yyyy" di javascript?
dilipkumar1007
1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes
7

Menggunakan contoh moment.js :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)
Makah
sumber
1
saat (dari, "DD-MM-YYYY"). toDate ()
Lapenkov Vladimir
6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);
Saad Imran.
sumber
3
Apakah Anda mendapatkan Date.parseDate?
kasdega
@kasdega Maaf, saya memikirkan $ .datepicker.parseDate, perbaiki sekarang :)
Saad Imran.
Kamu harus menggunakan $.datepicker.parseDate("dd-mm-yy", from); untuk menguraikan dengan benar tanggal seperti 24-01-2017, chek dokumentasi datepicker di api.jqueryui.com/datepicker
Andrea Mauro
4

Anda juga dapat menulis tanggal di dalam tanda kurung Date()objek, seperti ini:

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)
Tahanan NOL
sumber
@AmitSengar Bagaimana mengonversi "Bulan dd, yyyy" menjadi "MM / dd / yyyy" di javascript?
dilipkumar1007
3

Gunakan format ini: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00

Diodeus - James MacFarlane
sumber
1
Dari mana Anda mendapatkan parseDatefungsi itu? Apakah itu fungsi javascript asli?
Joseph Silber
maaf bagaimana cara saya menerapkan ini? juga saya perlu format sebagai dd-mm-yy
user559142
parseDate adalah fungsi JS asli. Untuk info lebih lanjut, lihat: xaprb.com/articles/javascript-date-parsing-demo.html
- James MacFarlane
1
@Diodeus ... benarkah itu asli? kenapa kesalahan ff dan chrome throw?
epascarello
2
@Diodeus bahkan dengan pengeditan terakhir ini tidak cukup untuk saya (setidaknya dengan Chrome). Ini mengatur tanggal ke '2011-01-03'dan waktu UTC ke 00:00:00. Jadi jika zona waktu pengguna kurang dari UTC, itu sebenarnya akan menjadi sehari sebelumnya.
Mike
3

Dalam kasus saya

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Hasil: Sen Nov 02 2015 04:40:13 GMT + 0100 (CET) maka saya menggunakan .getTime () untuk bekerja dengan milidetik

argene santoni
sumber
3

Jawaban yang diterima agak memiliki bug

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Pertimbangkan apakah datepicker berisi "77-78-7980" yang jelas bukan tanggal yang valid. Ini akan menghasilkan:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

Yang mungkin bukan hasil yang diinginkan.

Alasan untuk ini dijelaskan di situs MDN :

Di mana Date disebut sebagai konstruktor dengan lebih dari satu argumen, jika nilainya lebih besar dari rentang logisnya (misal 13 disediakan sebagai nilai bulan atau 70 untuk nilai menit), nilai yang berdekatan akan disesuaikan. Misalnya new Date(2013, 13, 1)setara dengan new Date(2014, 1, 1).


Cara yang lebih baik untuk menyelesaikan masalah adalah:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Ini memberi Anda kemungkinan untuk menangani input yang tidak valid.

Sebagai contoh:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}
James Hibbard
sumber
1

Lihatlah Datejs untuk semua masalah terkait tanggal kecil itu .. Anda juga bisa menyelesaikannya dengan fungsi parseDate

Baz1nga
sumber
0

Anda bisa menggunakan Regexp.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}
Kekacauan Kekacauan
sumber
Menghasilkan bulan yang salah! Bulan mulai dari nol, bukan satu. Jadi jika Anda melakukannya Jan, Anda akan mengatakan Februari
epascarello
1
@epascarello - Lupa betapa lumpuhnya API Tanggal.
ChaosPandion
@ChaosPandion: bagaimana cara mengubah format myDate = '20 / 06/17 'menjadi '20 / 6/2017 00:00:00' di javascript?
Ghanshyam Lakhani
-1
new Date().toLocaleDateString();

sesederhana itu, cukup kirimkan tanggal Anda ke js Obyek Tanggal

Nikhil Sengar
sumber
Apakah maksud Anda meneruskan string tanggal di dalam konstruktor Tanggal seperti, new Date('30/12/2018').toLocaleDateString()?? Itu mengembalikan Tanggal Tidak Valid
Ms.Tamil