Как я могу преобразовать строку в дату в 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 Date.
Примеры формата 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 по Гринвичу + 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");
Если вы хотите конвертировать из формата "дд / мм / гггг". Вот пример:
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 не возвращают объект Date в качестве результатов, но я добавляю их, потому что они могут быть полезны, но я не сравниваю их с действительными решениями. Эти результаты могут быть полезны для массивного анализа даты.
new Date
(Ad) в 50-100 раз быстрее, чем moment.js (Dd) для всех браузеров для даты и времени ISO.new Date
(Ad) примерно в 10 раз быстрее, чемparseDate
(Ed)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