Bagaimana saya bisa mengonversi string menjadi tanggal dalam JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
atau String -> Date
?
Bagaimana saya bisa mengonversi string menjadi tanggal dalam JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
atau String -> Date
?
Jawaban:
Format string terbaik untuk penguraian string adalah format ISO tanggal bersama dengan konstruktor objek Tanggal JavaScript.
Contoh format ISO: YYYY-MM-DD
atau YYYY-MM-DDTHH:MM:SS
.
Tapi tunggu! Hanya menggunakan "format ISO" tidak bekerja dengan baik. String kadang-kadang diurai sebagai UTC dan kadang-kadang sebagai waktu lokal (berdasarkan vendor dan versi browser). Praktik terbaik harus selalu menyimpan tanggal sebagai UTC dan membuat perhitungan sebagai UTC.
Untuk mengurai tanggal sebagai UTC, tambahkan Z - misalnya: new Date('2011-04-11T10:20:30Z')
.
Untuk menampilkan tanggal dalam UTC, gunakan .toUTCString()
,
untuk menampilkan tanggal dalam waktu setempat pengguna, gunakan .toString()
.
Info lebih lanjut tentang MDN | Tanggal dan jawaban ini .
Untuk kompatibilitas Internet Explorer tua (versi IE kurang dari 9 tidak mendukung format ISO di Tanggal konstruktor), Anda harus membagi datetime representasi string ke bagian itu dan kemudian Anda dapat menggunakan konstruktor menggunakan datetime bagian, misalnya: new Date('2011', '04' - 1, '11', '11', '51', '00')
. Perhatikan bahwa jumlah bulan harus 1 lebih sedikit.
Metode alternatif - gunakan perpustakaan yang sesuai:
Anda juga dapat memanfaatkan perpustakaan Moment.js yang memungkinkan parsing tanggal dengan zona waktu yang ditentukan.
new Date('2011-04-11T11:51:00')
tanggal yang dibuat valid.
new Date('1970-30-02')
tanggal tidak valid karena tidak ada 30 bulan dalam setahun. Anda tidak dapat melimpahi bulan, tetapi ketika Anda melimpah hari, maka itu diselesaikan di Chrome dan Firefox ke tanggal yang valid: new Date('1970-02-30')
maka hari itu sama dengan Tanggal baru ('1970-03-02').
Sayangnya saya tahu itu
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
mengembalikan "Rab 02 Apr 2014". Saya tahu kedengarannya gila, tetapi itu terjadi untuk beberapa pengguna.
The solusi antipeluru adalah sebagai berikut:
var parts ='2014-04-03'.split('-');
// Please pay attention to the month (parts[1]); JavaScript counts months from 0:
// January - 0, February - 1, etc.
var mydate = new Date(parts[0], parts[1] - 1, parts[2]);
console.log(mydate.toDateString());
yyyy-MM-dd
diuraikan sebagai UTC dan toString mengembalikan waktu setempat karena itu tergantung pada zona waktu pengguna itu pasti dapat mengembalikan hasil yang berbeda. Jika selalu menginginkan waktu sebagai UTC maka Anda harus menggunakan toUTCString .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
Dan hasilnya adalah:
dt => Date {Fri Apr 26 2013}
function stringToDate(_date,_format,_delimiter)
{
var formatLowerCase=_format.toLowerCase();
var formatItems=formatLowerCase.split(_delimiter);
var dateItems=_date.split(_delimiter);
var monthIndex=formatItems.indexOf("mm");
var dayIndex=formatItems.indexOf("dd");
var yearIndex=formatItems.indexOf("yyyy");
var month=parseInt(dateItems[monthIndex]);
month-=1;
var formatedDate = new Date(dateItems[yearIndex],month,dateItems[dayIndex]);
return formatedDate;
}
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
.indexOf()
metode ini karena tidak kompatibel lintas browser tanpa polyfils. Sebaliknya, gunakan metode JS yang lebih kompatibel .match()
atau .test()
vanilla.
var _delimiter = _format.match(/\W/g)[0];
di awal fungsi Anda bisa mendapatkan pembatas secara otomatis dan prescind dari parameter ke-3.
moment.js ( http://momentjs.com/ ) adalah paket lengkap dan bagus untuk tanggal penggunaan dan mendukung string ISO 8601 .
Anda dapat menambahkan tanggal dan format string.
moment("12-25-1995", "MM-DD-YYYY");
Dan Anda dapat memeriksa apakah suatu tanggal valid.
moment("not a real date").isValid(); //Returns false
Beberapa contoh tampilan
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
Lihat dokumentasi http://momentjs.com/docs/#/parsing/string-format/
Rekomendasi: Saya sarankan untuk menggunakan paket untuk tanggal yang berisi banyak format karena zona waktu dan manajemen waktu format benar-benar masalah besar, saat ini memecahkan banyak format. Anda dapat menguraikan tanggal dengan mudah dari string sederhana hingga saat ini, tetapi saya pikir itu adalah kerja keras untuk mendukung semua format dan variasi tanggal.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
keluaran: "3 bulan lalu | 1 Februari 2019"
Berikan sebagai argumen untuk Date ():
var st = "date in some format"
var dt = new Date(st);
Anda dapat mengakses tanggal, bulan, tahun menggunakan, misalnya: dt.getMonth()
.
console.log(new Date('30-08-2018'))
dan dapatkan tanggal yang tidak valid
01/02/2020
di komputer saya (di Inggris) itu akan mengembalikan 1 Februari di mana seolah-olah hal yang sama dilakukan di AS itu akan kembali 2 Januari. Anda seharusnya tidak pernah menggunakan implementasi naif ini. Gunakan momen saja.
Jika Anda dapat menggunakan pustaka momen yang hebat (mis. Dalam proyek Node.js), Anda dapat dengan mudah menguraikan tanggal dengan menggunakan mis.
var momentDate = moment("2014-09-15 09:00:00");
dan dapat mengakses objek tanggal JS melalui
momentDate ().toDate();
new Date(2000, 10, 1)
akan memberi Anda "Rab 01 Nov 2000 00:00:00 GMT + 0100 (CET)"
Lihat 0 untuk bulan memberi Anda Januari
Bagi mereka yang mencari solusi kecil dan cerdas:
String.prototype.toDate = function(format)
{
var normalized = this.replace(/[^a-zA-Z0-9]/g, '-');
var normalizedFormat= format.toLowerCase().replace(/[^a-zA-Z0-9]/g, '-');
var formatItems = normalizedFormat.split('-');
var dateItems = normalized.split('-');
var monthIndex = formatItems.indexOf("mm");
var dayIndex = formatItems.indexOf("dd");
var yearIndex = formatItems.indexOf("yyyy");
var hourIndex = formatItems.indexOf("hh");
var minutesIndex = formatItems.indexOf("ii");
var secondsIndex = formatItems.indexOf("ss");
var today = new Date();
var year = yearIndex>-1 ? dateItems[yearIndex] : today.getFullYear();
var month = monthIndex>-1 ? dateItems[monthIndex]-1 : today.getMonth()-1;
var day = dayIndex>-1 ? dateItems[dayIndex] : today.getDate();
var hour = hourIndex>-1 ? dateItems[hourIndex] : today.getHours();
var minute = minutesIndex>-1 ? dateItems[minutesIndex] : today.getMinutes();
var second = secondsIndex>-1 ? dateItems[secondsIndex] : today.getSeconds();
return new Date(year,month,day,hour,minute,second);
};
Contoh:
"22/03/2016 14:03:01".toDate("dd/mm/yyyy hh:ii:ss");
"2016-03-29 18:30:00".toDate("yyyy-mm-dd hh:ii:ss");
Hanya new Date(st);
Dengan asumsi bahwa itu format yang tepat .
Jika Anda ingin mengonversi dari format "dd / MM / yyyy". Berikut ini sebuah contoh:
var pattern = /^(\d{1,2})\/(\d{1,2})\/(\d{4})$/;
var arrayDate = stringDate.match(pattern);
var dt = new Date(arrayDate[3], arrayDate[2] - 1, arrayDate[1]);
Solusi ini berfungsi dalam versi IE kurang dari 9.
var ts = '1471793029764';
ts = Number(ts); // cast it to a Number
var date = new Date(ts); // works
var invalidDate = new Date('1471793029764'); // does not work. Invalid Date
undefined
nilainya? Suka var date = new Date(undefined)
:?
Date.parse
hampir membuat Anda mendapatkan apa yang Anda inginkan. Itu tersedak pada bagian am
/ pm
, tetapi dengan beberapa peretasan Anda bisa membuatnya bekerja:
var str = 'Sun Apr 25, 2010 3:30pm',
timestamp;
timestamp = Date.parse(str.replace(/[ap]m$/i, ''));
if(str.match(/pm$/i) >= 0) {
timestamp += 12 * 60 * 60 * 1000;
}
Konversikan ke format pt-BR:
var dateString = "13/10/2014";
var dataSplit = dateString.split('/');
var dateConverted;
if (dataSplit[2].split(" ").length > 1) {
var hora = dataSplit[2].split(" ")[1].split(':');
dataSplit[2] = dataSplit[2].split(" ")[0];
dateConverted = new Date(dataSplit[2], dataSplit[1]-1, dataSplit[0], hora[0], hora[1]);
} else {
dateConverted = new Date(dataSplit[2], dataSplit[1] - 1, dataSplit[0]);
}
Saya harap tolong seseorang !!!
Saya telah membuat biola untuk ini, Anda dapat menggunakan fungsi toDate () pada string tanggal apa pun dan memberikan format tanggal. Ini akan mengembalikan Anda objek Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Untuk mengkonversi string ke tanggal di js saya gunakan http://momentjs.com/
moment().format('MMMM Do YYYY, h:mm:ss a'); // August 16th 2015, 4:17:24 pm
moment().format('dddd'); // Sunday
moment().format("MMM Do YY"); // Aug 16th 15
moment().format('YYYY [escaped] YYYY'); // 2015 escaped 2015
moment("20111031", "YYYYMMDD").fromNow(); // 4 years ago
moment("20120620", "YYYYMMDD").fromNow(); // 3 years ago
moment().startOf('day').fromNow(); // 16 hours ago
moment().endOf('day').fromNow(); // in 8 hours
Namun cara lain untuk melakukannya:
String.prototype.toDate = function(format) {
format = format || "dmy";
var separator = this.match(/[^0-9]/)[0];
var components = this.split(separator);
var day, month, year;
for (var key in format) {
var fmt_value = format[key];
var value = components[key];
switch (fmt_value) {
case "d":
day = parseInt(value);
break;
case "m":
month = parseInt(value)-1;
break;
case "y":
year = parseInt(value);
}
}
return new Date(year, month, day);
};
a = "3/2/2017";
console.log(a.toDate("dmy"));
// Date 2017-02-03T00:00:00.000Z
Anda dapat mencoba ini:
function formatDate(userDOB) {
const dob = new Date(userDOB);
const monthNames = [
'January', 'February', 'March', 'April', 'May', 'June', 'July',
'August', 'September', 'October', 'November', 'December'
];
const day = dob.getDate();
const monthIndex = dob.getMonth();
const year = dob.getFullYear();
// return day + ' ' + monthNames[monthIndex] + ' ' + year;
return `${day} ${monthNames[monthIndex]} ${year}`;
}
console.log(formatDate('1982-08-10'));
var date = new Date(year, month, day);
atau
var date = new Date('01/01/1970');
string tanggal dalam format '01 -01-1970 'tidak akan berfungsi di FireFox, jadi lebih baik gunakan "/" daripada "-" dalam string format tanggal.
Jika Anda perlu memeriksa konten string sebelum mengonversi ke format Tanggal:
// Convert 'M/D/YY' to Date()
mdyToDate = function(mdy) {
var d = mdy.split(/[\/\-\.]/, 3);
if (d.length != 3) return null;
// Check if date is valid
var mon = parseInt(d[0]),
day = parseInt(d[1]),
year= parseInt(d[2]);
if (d[2].length == 2) year += 2000;
if (day <= 31 && mon <= 12 && year >= 2015)
return new Date(year, mon - 1, day);
return null;
}
Saya telah membuat fungsi parseDateTime untuk mengonversi objek string ke tanggal dan berfungsi di semua browser (termasuk browser IE), periksa apakah ada yang diperlukan, referensi https://github.com/Umesh-Markande/Parse-String-to-Date -di-semua-browser
function parseDateTime(datetime) {
var monthNames = [
"January", "February", "March",
"April", "May", "June", "July",
"August", "September", "October",
"November", "December"
];
if(datetime.split(' ').length == 3){
var date = datetime.split(' ')[0];
var time = datetime.split(' ')[1].replace('.00','');
var timearray = time.split(':');
var hours = parseInt(time.split(':')[0]);
var format = datetime.split(' ')[2];
var bits = date.split(/\D/);
date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
var day = date.getDate();
var monthIndex = date.getMonth();
var year = date.getFullYear();
if ((format === 'PM' || format === 'pm') && hours !== 12) {
hours += 12;
try{ time = hours+':'+timearray[1]+':'+timearray[2] }catch(e){ time = hours+':'+timearray[1] }
}
var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + ' ' + year + ' ' + time);
return formateddatetime;
}else if(datetime.split(' ').length == 2){
var date = datetime.split(' ')[0];
var time = datetime.split(' ')[1];
var bits = date.split(/\D/);
var datetimevalue = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
var day = datetimevalue.getDate();
var monthIndex = datetimevalue.getMonth();
var year = datetimevalue.getFullYear();
var formateddatetime = new Date(monthNames[monthIndex] + ' ' + day + ' ' + year + ' ' + time);
return formateddatetime;
}else if(datetime != ''){
var bits = datetime.split(/\D/);
var date = new Date(bits[0], --bits[1], bits[2]); /* if you change format of datetime which is passed to this function, you need to change bits e.x ( bits[0], bits[1], bits[2 ]) position as per date, months and year it represent bits array.*/
return date;
}
return datetime;
}
var date1 = '2018-05-14 05:04:22 AM'; // yyyy-mm-dd hh:mm:ss A
var date2 = '2018/05/14 05:04:22 AM'; // yyyy/mm/dd hh:mm:ss A
var date3 = '2018/05/04'; // yyyy/mm/dd
var date4 = '2018-05-04'; // yyyy-mm-dd
var date5 = '2018-05-14 15:04:22'; // yyyy-mm-dd HH:mm:ss
var date6 = '2018/05/14 14:04:22'; // yyyy/mm/dd HH:mm:ss
console.log(parseDateTime(date1))
console.log(parseDateTime(date2))
console.log(parseDateTime(date3))
console.log(parseDateTime(date4))
console.log(parseDateTime(date5))
console.log(parseDateTime(date6))
**Output---**
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 05:04:22 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Fri May 04 2018 00:00:00 GMT+0530 (India Standard Time)
Mon May 14 2018 15:04:22 GMT+0530 (India Standard Time)
Mon May 14 2018 14:04:22 GMT+0530 (India Standard Time)
Jawaban ini didasarkan pada jawaban Kassem tetapi juga menangani dua digit tahun. Saya mengirimkan suntingan ke jawaban Kassem, tetapi jika itu tidak disetujui, saya juga mengirimkan ini sebagai jawaban terpisah.
function stringToDate(_date,_format,_delimiter) {
var formatLowerCase=_format.toLowerCase();
var formatItems=formatLowerCase.split(_delimiter);
var dateItems=_date.split(_delimiter);
var monthIndex=formatItems.indexOf("mm");
var dayIndex=formatItems.indexOf("dd");
var yearIndex=formatItems.indexOf("yyyy");
var year = parseInt(dateItems[yearIndex]);
// adjust for 2 digit year
if (year < 100) { year += 2000; }
var month=parseInt(dateItems[monthIndex]);
month-=1;
var formatedDate = new Date(year,month,dateItems[dayIndex]);
return formatedDate;
}
stringToDate("17/9/14","dd/MM/yyyy","/");
stringToDate("17/9/2014","dd/MM/yyyy","/");
stringToDate("9/17/2014","mm/dd/yyyy","/")
stringToDate("9-17-2014","mm-dd-yyyy","-")
Anda dapat menggunakan regex untuk mem-parsing string ke detail waktu kemudian membuat tanggal atau format pengembalian seperti:
//example : let dateString = "2018-08-17 01:02:03.4"
function strToDate(dateString){
let reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2}).(\d{1})/
, [,year, month, day, hours, minutes, seconds, miliseconds] = reggie.exec(dateString)
, dateObject = new Date(year, month-1, day, hours, minutes, seconds, miliseconds);
return dateObject;
}
alert(strToDate(dateString));
Hari ini (2020.05.08) Saya melakukan tes untuk solusi yang dipilih - untuk dua kasus: tanggal input adalah string ISO8601 (Iklan, Bd, Cd, Dd, Ed) dan tanggal input adalah stempel waktu (At, Ct, Dt). Solusi Bd, Cd, Ct tidak mengembalikan objek Date js sebagai hasil, tapi saya menambahkannya karena mereka bisa berguna tetapi saya tidak membandingkannya dengan solusi yang valid. Hasil ini dapat bermanfaat untuk penguraian tanggal yang besar.
new Date
(Iklan) adalah 50-100x lebih cepat daripada moment.js (Dd) untuk semua browser untuk tanggal dan cap waktu ISOnew Date
(Iklan) ~ 10x lebih cepat dari parseDate
(Ed)Date.parse
(Bd) adalah tercepat jika kita perlu mendapatkan cap waktu dari tanggal ISO di semua browserSaya melakukan pengujian pada MacOs High Sierra 10.13.6 di Chrome 81.0, Safari 13.1, Firefox 75.0. Solusi parseDate
(Ed) digunakan new Date(0)
dan secara manual mengatur komponen tanggal UTC.
Hasil untuk chrome
Datestrings ISO 8601-esque, sebagus standarnya, masih belum didukung secara luas.
Ini adalah sumber yang bagus untuk mengetahui format datestring mana yang harus Anda gunakan:
http://dygraphs.com/date-formats.html
Ya, itu berarti bahwa data Anda bisa sesederhana yang bertentangan
"2014/10/13 23:57:52"
dari pada
"2014-10-13 23:57:52"
gunakan kode ini: (masalah saya terpecahkan dengan kode ini)
function dateDiff(date1, date2){
var diff = {} // Initialisation du retour
var tmp = date2 - date1;
tmp = Math.floor(tmp/1000); // Nombre de secondes entre les 2 dates
diff.sec = tmp % 60; // Extraction du nombre de secondes
tmp = Math.floor((tmp-diff.sec)/60); // Nombre de minutes (partie entière)
diff.min = tmp % 60; // Extraction du nombre de minutes
tmp = Math.floor((tmp-diff.min)/60); // Nombre d'heures (entières)
diff.hour = tmp % 24; // Extraction du nombre d'heures
tmp = Math.floor((tmp-diff.hour)/24); // Nombre de jours restants
diff.day = tmp;
return diff;
}
Saya menulis fungsi yang dapat digunakan kembali yang saya gunakan ketika saya mendapatkan string tanggal dari server.
Anda dapat melewati pembatas yang Anda inginkan (/ - dll.) yang memisahkan hari bulan dan tahun untuk menggunakan split()
metode ini.
Anda dapat melihat & mengujinya pada contoh kerja ini .
<!DOCTYPE html>
<html>
<head>
<style>
</style>
</head>
<body>
<div>
<span>day:
</span>
<span id='day'>
</span>
</div>
<div>
<span>month:
</span>
<span id='month'>
</span>
</div>
<div>
<span>year:
</span>
<span id='year'>
</span>
</div>
<br/>
<input type="button" id="" value="convert" onClick="convert('/','28/10/1980')"/>
<span>28/10/1980
</span>
<script>
function convert(delimiter,dateString)
{
var splitted = dateString.split('/');
// create a new date from the splitted string
var myDate = new Date(splitted[2],splitted[1],splitted[0]);
// now you can access the Date and use its methods
document.getElementById('day').innerHTML = myDate.getDate();
document.getElementById('month').innerHTML = myDate.getMonth();
document.getElementById('year').innerHTML = myDate.getFullYear();
}
</script>
</body>
</html>
Namun cara lain untuk melakukannya adalah membangun regex dengan kelompok tangkapan bernama di atas string format dan kemudian menggunakan regex itu untuk mengekstrak hari, bulan, dan tahun dari string tanggal:
function parseDate(dateStr, format) {
const regex = format.toLocaleLowerCase()
.replace(/\bd+\b/, '(?<day>\\d+)')
.replace(/\bm+\b/, '(?<month>\\d+)')
.replace(/\by+\b/, '(?<year>\\d+)')
const parts = new RegExp(regex).exec(dateStr) || {};
const { year, month, day } = parts.groups || {};
return parts.length === 4 ? new Date(year, month-1, day) : undefined;
}
const printDate = x => console.log(x ? x.toLocaleDateString() : x);
printDate(parseDate('05/11/1896', 'dd/mm/YYYY'));
printDate(parseDate('07-12-2000', 'dd-mm-yy'));
printDate(parseDate('07:12:2000', 'dd:mm:yy'));
printDate(parseDate('2017/6/3', 'yy/MM/dd'));
printDate(parseDate('2017-6-15', 'y-m-d'));
printDate(parseDate('2015 6 25', 'y m d'));
printDate(parseDate('2015625', 'y m d')); // bad format