Bir dizeyi JavaScript'te bir tarihe nasıl dönüştürebilirim?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
yoksa String -> Date
?
Bir dizeyi JavaScript'te bir tarihe nasıl dönüştürebilirim?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
yoksa String -> Date
?
Yanıtlar:
Dize ayrıştırma için en iyi dize biçimi, JavaScript Date nesne yapıcısıyla birlikte tarih ISO biçimidir.
ISO formatı örnekleri: YYYY-MM-DD
veyaYYYY-MM-DDTHH:MM:SS
.
Fakat bekle! Sadece "ISO formatını" kullanmak kendi başına güvenilir bir şekilde çalışmaz. Dize bazen UTC ve bazen de yerel saat olarak ayrıştırılır (tarayıcı satıcısına ve sürümüne göre). En iyi uygulama her zaman tarihleri UTC olarak saklamak ve UTC olarak hesaplamalar yapmak olmalıdır.
Bir tarihi UTC olarak ayrıştırmak için bir Z ekleyin - ör:new Date('2011-04-11T10:20:30Z')
.
UTC'de bir tarih görüntülemek için, tuşunu .toUTCString()
,
kullanıcının yerel saatinde bir tarih görüntülemek için tuşunu kullanın..toString()
.
MDN Hakkında Daha Fazla Bilgi | Tarih ve bu cevap .
Eski Internet Explorer uyumluluk için (IE sürümleri az 9'dan tarihi yapıcı ISO formatını desteklemez) kullanarak, 's parçalara tarih saat dize temsilini bölmek gerekir, ardından tarih saat parçaları, örneğin kullanarak yapıcısını kullanabilirsiniz: new Date('2011', '04' - 1, '11', '11', '51', '00')
. Ay sayısının 1'den az olması gerektiğini unutmayın.
Alternatif yöntem - uygun bir kitaplık kullanın:
Ayrıca , belirtilen saat dilimiyle tarihi ayrıştırmaya izin veren Moment.js kütüphanesinden de yararlanabilirsiniz .
new Date('2011-04-11T11:51:00')
oluşturulan tarih geçerlidir.
new Date('1970-30-02')
geçersiz, bir tarihte 30 ay olmadığı için geçersiz bir tarih. Ayları geçemezsiniz, ancak günleri aştığınızda , Chrome ve Firefox'ta geçerli bir tarihe çözümlenir : new Date('1970-02-30')
o zaman yeni Tarih ('1970-03-02') ile aynı gün olur.
Maalesef bunu öğrendim
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
"02 Nisan 2014 Çar." Çılgınca geldiğini biliyorum, ama bazı kullanıcılar için oluyor.
Kurşun çözeltisi şu şekildedir:
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
UTC olarak ayrıştırılır ve toString yerel saati döndürür, bu nedenle kullanıcıların saat dilimine bağlı olarak kesinlikle farklı sonuçlar döndürebilir. Her zaman saati UTC olarak istiyorsanız, toUTCString öğesini kullanmalısınız .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
Ve çıktı:
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()
olmadan çapraz tarayıcı uyumlu olmadığından yönteme güvenmeyin. Bunun yerine, daha uyumlu .match()
veya .test()
vanilya JS yöntemlerini kullanın.
var _delimiter = _format.match(/\W/g)[0];
Fonksiyonun başlangıcına ekleyerek , sınırlayıcıyı otomatik olarak alabilir ve 3. parametreyi önceden ayarlayabilirsiniz.
moment.js ( http://momentjs.com/ ) kullanım tarihleri için eksiksiz ve iyi bir pakettir ve ISO 8601 dizelerini destekler .
Bir dize tarihi ve biçimi ekleyebilirsiniz.
moment("12-25-1995", "MM-DD-YYYY");
Ve bir tarihin geçerli olup olmadığını kontrol edebilirsiniz.
moment("not a real date").isValid(); //Returns false
Bazı ekran örnekleri
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
Bkz. Belgeler http://momentjs.com/docs/#/parsing/string-format/
Öneri: Zaman dilimi ve format zaman yönetimi gerçekten büyük bir sorun olduğu için çok fazla format içeren tarihler için bir paket kullanmanızı öneririz, an js birçok formatı çözer. Basit bir dizeden bugüne kolayca ayrışabilirsin, ancak tarihlerin tüm formatlarını ve varyasyonlarını desteklemek zor bir iş olduğunu düşünüyorum.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
çıktıları: "3 ay önce | 1 Şubat 2019"
Date () öğesine argüman olarak iletin:
var st = "date in some format"
var dt = new Date(st);
Tarihe, aya, yıla, örneğin: ile erişebilirsiniz dt.getMonth()
.
console.log(new Date('30-08-2018'))
ve geçersiz tarihi almak
Müthiş moment kütüphanesini (örneğin, bir Node.js projesinde) kullanabiliyorsanız, örn.
var momentDate = moment("2014-09-15 09:00:00");
ve JS tarih nesnesine
momentDate ().toDate();
new Date(2000, 10, 1)
size "Çar 01 Kasım 2000 00:00:00 GMT + 0100 (CET)" verecek
Ay için 0'ın Ocak ayını verdiğini görün
Küçük ve akıllı bir çözüm arayanlar için:
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);
};
Misal:
"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");
Sadece new Date(st);
Bunun doğru biçim olduğunu varsayarsak .
"Gg / aa / yyyy" biçiminden dönüştürmek istiyorsanız. İşte bir örnek:
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]);
Bu çözüm 9'dan az IE sürümlerinde çalışır.
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
Değer ne olacak ? Gibi: var date = new Date(undefined)
?
Pt-BR formatına dönüştürün:
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]);
}
Umarım birine yardım !!!
Bunun için bir keman yarattık, herhangi bir tarih dizesinde toDate () işlevini kullanabilir ve tarih biçimini sağlayabilirsiniz. Bu size bir Date nesnesi döndürür. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Js içinde bugüne kadar dize dönüştürme için kullanıyorum 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
Bunu yapmanın başka bir yolu:
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
Bunu deneyebilirsiniz:
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'));
Tarih biçimine dönüştürmeden önce dizenin içeriğini kontrol etmeniz gerekiyorsa:
// 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;
}
Dizeyi tarih nesnesine dönüştürmek için parseDateTime işlevi oluşturdum ve tüm tarayıcıda (IE tarayıcı dahil) çalışıyor, gerekli olup olmadığını kontrol edin, https://github.com/Umesh-Markande/Parse-String-to-Date referans -in-all-tarayıcı
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)
Bu cevap Kassem en dayanmaktadır cevap ama aynı zamanda iki basamaklı yıl işler. Kassem'in cevabına bir düzenleme gönderdim, ancak onaylanmadığı takdirde bunu ayrı bir cevap olarak da gönderiyorum.
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","-")
Dizeyi ayrıntı zamanına ayrıştırmak için regex'i kullanabilir, sonra tarih veya aşağıdaki gibi bir dönüş biçimi oluşturabilirsiniz:
//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));
Bugün (2020.05.08) Seçilen çözümler için testler yapıyorum - iki durum için: giriş tarihi ISO8601 dizesi (Ad, Bd, Cd, Dd, Ed) ve giriş tarihi zaman damgası (At, Ct, Dt). Çözümler Bd, Cd, Ct js Date nesnesini sonuç olarak döndürmez, ancak yararlı olabilecekleri için eklerim, ancak geçerli çözümlerle karşılaştırmam. Bu sonuçlar büyük tarih ayrıştırması için yararlı olabilir.
new Date
(Reklam), ISO tarihi ve zaman damgası için tüm tarayıcılarda moment.js'den (Dd) 50-100x daha hızlıdırnew Date
(Reklam) ~ 10x daha hızlıparseDate
(Ed) 'Date.parse
Tüm tarayıcılarda ISO tarihinden zaman damgası almanız gerekiyorsa en hızlı çözüm (Bd)Chrome 81.0, Safari 13.1, Firefox 75.0 üzerinde MacOs High Sierra 10.13.6 üzerinde test yapıyorum. Çözüm parseDate
(Ed) kullanın new Date(0)
ve UTC tarih bileşenlerini manuel olarak ayarlayın.
Chrome kelimesi için sonuçlar
ISO 8601-esque datestringler, standart kadar mükemmel, hala geniş çapta desteklenmemektedir.
Bu, hangi biçim formatını kullanmanız gerektiğini anlamak için harika bir kaynaktır:
http://dygraphs.com/date-formats.html
Evet, demek istediğim, deneme sürecin aksine basit olabilir
"2014/10/13 23:57:52"
onun yerine
"2014-10-13 23:57:52"
Bu kodu kullanın: (benim sorunum bu kod ile çözüldü)
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;
}
Sunucudan tarih dizeleri aldığımda kullandığım yeniden kullanılabilir bir işlev yazdı. yöntemi
kullanmak için gün ayını ve yılı ayıran istediğiniz sınırlayıcıyı (/ - vb.) geçirebilirsiniz split()
.
bu çalışma örneğinde görebilir ve test edebilirsiniz .
<!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>
Bunu yapmanın başka bir yolu da biçim dizesi üzerinde adlandırılmış yakalama gruplarıyla bir normal ifade oluşturmak ve daha sonra tarih dizesinden gün, ay ve yılı ayıklamak için bu normal ifadeyi kullanmaktır:
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