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
?
답변:
문자열 구문 분석에 가장 적합한 문자열 형식은 JavaScript Date 객체 생성자와 함께 날짜 ISO 형식입니다.
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()
.
이전 Internet Explorer 호환성 (9 미만의 IE 버전은 Date 생성자에서 ISO 형식을 지원하지 않음)의 경우 datetime 문자열 표현을 해당 부분으로 분할 한 다음 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')
유효하지 않습니다. 1 년에 30 개월이 없기 때문에 유효하지 않습니다. 몇 달을 넘길 수는 없지만 며칠을 넘으면 Chrome 및 Firefox 에서 유효한 날짜로 확인됩니다 new Date('1970-02-30')
.
불행히도 나는
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
"2014 년 4 월 2 일 수요일"을 반환합니다. 나는 그것이 미친 것처럼 들리지만 일부 사용자에게는 발생합니다.
방탄 솔루션은 다음과 같다 :
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()
메소드는 polyfil 없이는 브라우저 간 호환이 아니므로이 메소드를 신뢰하지 마십시오 . 대신, 더 호환 가능 .match()
하거나 .test()
바닐라 JS 메소드를 사용하십시오.
var _delimiter = _format.match(/\W/g)[0];
함수의 시작 부분에 추가 하면 구분 기호를 자동으로 가져 와서 세 번째 매개 변수를 가져올 수 있습니다.
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가 많은 형식을 해결하기 때문에 많은 형식을 포함하는 날짜에 패키지를 사용하는 것이 좋습니다. 간단한 문자열에서 날짜까지 쉽게 구문 분석 할 수는 있지만 모든 형식과 날짜 변형을 지원하는 것은 어려운 일이라고 생각합니다.
Date ()에 인수로 전달하십시오.
var st = "date in some format"
var dt = new Date(st);
다음을 사용하여 날짜, 월, 연도에 액세스 할 수 있습니다 dt.getMonth()
.
console.log(new Date('30-08-2018'))
유효하지 않은 날짜를 얻을
훌륭한 모멘트 라이브러리 (예 : Node.js 프로젝트)를 사용할 수 있다면 예를 들어 날짜를 쉽게 파싱 할 수 있습니다.
var momentDate = moment("2014-09-15 09:00:00");
를 통해 JS 날짜 객체에 액세스 할 수 있습니다
momentDate ().toDate();
작고 똑똑한 솔루션을 찾는 사람들에게 :
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 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)
?
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)
이 답변은 Kassem의 답변을 기반으로 하지만 두 자리 연도를 처리합니다. Kassem의 답변에 수정 사항을 제출했지만 승인되지 않은 경우 별도의 답변으로 제출합니다.
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
(Ad)은 ISO 날짜 및 타임 스탬프에 대해 모든 브라우저에서 moment.js (Dd)보다 50-100 배 빠릅니다.new Date
(Ad)이 parseDate
(Ed) 보다 ~ 10 배 빠릅니다.Date.parse
모든 브라우저에서 ISO 날짜부터 타임 스탬프를 가져와야하는 경우 솔루션 (Bd)이 가장 빠릅니다.Chrome 81.0, Safari 13.1, Firefox 75.0에서 MacOs High Sierra 10.13.6에서 테스트를 수행합니다. 솔루션 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