Як можна перетворити рядок у дату в JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
чи String -> Date
?
Як можна перетворити рядок у дату в JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
чи String -> Date
?
Відповіді:
Найкращий формат рядка для розбору рядків - це формат ISO дата разом із конструктором об'єкта JavaScript Дата.
Приклади формату ISO: YYYY-MM-DD
або YYYY-MM-DDTHH:MM:SS
.
Але зачекайте! Просто використання "ISO-формату" не працює надійно само по собі. Рядок іноді аналізується як UTC, а іноді як локальний час (на основі постачальника браузера та версії). Найкращою практикою завжди має бути зберігання дат як UTC та обчислення як UTC.
Щоб розібрати дату в форматі UTC, додайте Z - наприклад new Date('2011-04-11T10:20:30Z')
.
Щоб відобразити дату в UTC, використовуйте .toUTCString()
,
щоб відобразити дату в місцевому часі користувача, використовуйте .toString()
.
Детальніше про MDN | Дата і ця відповідь .
Для старих Internet Explorer , сумісності (версії IE менше 9 не підтримує формат ISO в Date конструктору), ви повинні розділити DATETIME строкове представлення на його деталі , а потім ви можете використовувати конструктор з використанням дати - часу частин, наприклад: new Date('2011', '04' - 1, '11', '11', '51', '00')
. Зверніть увагу, що число місяця має бути на 1 менше.
Альтернативний метод - використовуйте відповідну бібліотеку:
Ви також можете скористатися бібліотекою Moment.js, яка дозволяє проаналізувати дату за вказаним часовим поясом.
new Date('2011-04-11T11:51:00')
дата, створена, є дійсною.
new Date('1970-30-02')
недійсна дата, оскільки не існує 30 місяців у році. Ви не можете переповнювати місяці, але коли ви переповнюєте дні, то він вирішується в Chrome і Firefox до дійсної дати: new Date('1970-02-30')
тоді це той самий день, що і нова дата ('1970-03-02').
На жаль, я це дізнався
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
повертає "Ср квітня 02 2014". Я знаю, це звучить шалено, але це трапляється для деяких користувачів.
Рішення куленепробивне полягає в наступному:
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, а toString повертає місцевий час, тому залежно від часового поясу користувачів, воно може напевно повернути різні результати. Якщо ви завжди хочете, щоб час було UTC, то вам слід скористатися toUTCString .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
А вихід буде:
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()
методу, оскільки він не є сумісним браузером без поліфілів. Натомість використовуйте більш сумісні .match()
або .test()
ванільні методи JS.
var _delimiter = _format.match(/\W/g)[0];
на початку функції, ви можете отримати роздільник автоматично та передбачити 3-й параметр.
moment.js ( http://momentjs.com/ ) - це повний і хороший пакет для дати використання та підтримує рядки ISO 8601 .
Ви можете додати рядок дату та формат.
moment("12-25-1995", "MM-DD-YYYY");
І ви можете перевірити, чи дійсна дата.
moment("not a real date").isValid(); //Returns false
Деякі приклади відображення
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
Дивіться документацію http://momentjs.com/docs/#/parsing/string-format/
Рекомендація: Я рекомендую використовувати пакет для дат, який містить велику кількість форматів, оскільки керування часом та часовим поясом - це справді велика проблема. Момент js вирішує багато форматів. Ви можете легко проаналізувати датування від простого рядка до дати, але я думаю, що це важка робота з підтримки всіх форматів і варіацій дат.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
: "3 місяці тому | 1 лютого 2019 року"
Передайте це як аргумент Date ():
var st = "date in some format"
var dt = new Date(st);
Ви можете отримати доступ дату, місяць, рік , використовуючи, наприклад: dt.getMonth()
.
console.log(new Date('30-08-2018'))
і отримую недійсну дату
01/02/2020
на моєму комп’ютері (у Великобританії), він повернеться 1-го Фебурарі, як ніби те саме робиться в США, він повернеться 2 січня. Вам майже ніколи не слід використовувати цю наївну реалізацію. Використовуйте натомість момент .
Якщо ви можете використовувати бібліотеку надзвичайних моментів (наприклад, у проекті Node.js), ви можете легко проаналізувати свою дату, наприклад
var momentDate = moment("2014-09-15 09:00:00");
і може отримати доступ до об'єкта дати JS через
momentDate ().toDate();
new Date(2000, 10, 1)
дасть вам "ср. 01 листопада 2000 00:00:00 GMT + 0100 (CET)"
Дивіться, що 0 за місяць дає вам січень
Для тих, хто шукає крихітного та розумного рішення:
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);
};
Приклад:
"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");
Просто new Date(st);
Якщо припустити, що це правильний формат .
Якщо ви хочете конвертувати з формату "dd / MM / yyyy". Ось приклад:
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]);
Це рішення працює у версіях IE менше 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
значенням? Як: var date = new Date(undefined)
?
Date.parse
майже отримує те, що ти хочеш. Він задихається від am
/ pm
частини, але, маючи певний злом, ви можете змусити його працювати:
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;
}
Перетворити у формат 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]);
}
Я сподіваюся допомогти комусь !!!
Я створив для цього загадку, ви можете використовувати функцію toDate () в будь-якому рядку дати та надати формат дати. Це поверне вам об'єкт Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Для перетворення рядка на сьогоднішній день в js я використовую 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
Ще один спосіб зробити це:
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
Ви можете спробувати це:
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'));
Якщо вам потрібно перевірити вміст рядка перед переходом у формат дати:
// 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;
}
Я створив функцію parseDateTime для перетворення рядка в об'єкт дати, і він працює у всіх браузерах (включаючи браузер IE), перевірте, чи потрібно комусь, посилайтеся на https://github.com/Umesh-Markande/Parse-String-to-Date -в-браузер
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)
Ця відповідь заснований на касі в відповідь , але він також працює з двома цифрами. Я подав редагування у відповідь Кассема, але якщо вона не була схвалена, я також подаю це як окрему відповідь.
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","-")
Ви можете використовувати регулярний вираз для розбору рядка для деталізації часу, а потім створити дату або будь-який формат повернення, наприклад:
//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));
Сьогодні (2020.05.08) я виконую тести для обраних рішень - у двох випадках: дата введення - рядок ISO8601 (Ad, Bd, Cd, Dd, Ed), а дата введення - часова мітка (At, Ct, Dt). Рішення Bd, Cd, Ct не повертають об'єкт js Date як результати, але я додаю їх, оскільки вони можуть бути корисними, але я не порівнюю їх з дійсними рішеннями. Ці результати можуть бути корисними для масового розбору дат.
new Date
(реклама) на 50-100 разів швидше, ніж moment.js (Dd) для всіх браузерів для дати та часової позначки ISOnew Date
(реклама) на 10 разів швидше, ніжparseDate
(Ед)Date.parse
(Bd) є найшвидшим, якщо вам потрібно отримати позначки часу від дати ISO у всіх браузерахЯ виконую тест на MacOs High Sierra 10.13.6 на Chrome 81.0, Safari 13.1, Firefox 75.0. Рішення parseDate
(Ed) використовувати new Date(0)
та вручну встановлювати компоненти дати UTC.
Результати для хрому
Датестріли ISO 8601, настільки відмінні, як і стандарт, все ще не підтримуються широко.
Це чудовий ресурс, щоб визначити, який формат для випробування ви повинні використовувати:
http://dygraphs.com/date-formats.html
Так, це означає, що ваш зубний вигляд може бути таким же простим, на відміну від
"2014/10/13 23:57:52"
замість
"2014-10-13 23:57:52"
використовувати цей код: (моя проблема була вирішена з цим кодом)
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;
}
Я написав функцію багаторазового використання, яку використовую, коли отримую рядки дати від сервера.
ви можете передати потрібний роздільник (/ - і т. д.), який розділяє день місяць і рік, щоб використовувати split()
метод.
ви можете побачити і протестувати його на цьому робочому прикладі .
<!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>
Ще один спосіб зробити це - створити регулярний вираз із названими групами захоплення над рядком формату, а потім використовувати цей регекс для вилучення дня, місяця та року з рядка дати:
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