Làm cách nào tôi có thể chuyển đổi một chuỗi thành một ngày trong JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
hay String -> Date
không?
Làm cách nào tôi có thể chuyển đổi một chuỗi thành một ngày trong JavaScript?
var st = "date in some format"
var dt = new date();
var dt_st= //st in date format same as dt
Date -> String
hay String -> Date
không?
Câu trả lời:
Định dạng chuỗi tốt nhất để phân tích chuỗi là định dạng ISO ngày cùng với hàm tạo đối tượng Ngày JavaScript.
Ví dụ về định dạng ISO: YYYY-MM-DD
hoặc YYYY-MM-DDTHH:MM:SS
.
Nhưng chờ đã! Chỉ sử dụng "định dạng ISO" không hoạt động đáng tin cậy. Chuỗi đôi khi được phân tích cú pháp dưới dạng UTC và đôi khi là giờ địa phương (dựa trên nhà cung cấp và phiên bản trình duyệt). Cách thực hành tốt nhất phải luôn là lưu trữ ngày dưới dạng UTC và tính toán dưới dạng UTC.
Để phân tích một ngày là UTC, hãy thêm Z - ví dụ : new Date('2011-04-11T10:20:30Z')
.
Để hiển thị một ngày trong UTC, hãy sử dụng .toUTCString()
,
để hiển thị một ngày theo giờ địa phương của người dùng, sử dụng .toString()
.
Thêm thông tin về MDN | Ngày và câu trả lời này .
Để tương thích Internet Explorer cũ (các phiên bản IE dưới 9 không hỗ trợ định dạng ISO trong Trình tạo ngày), bạn nên chia biểu diễn chuỗi datetime cho các phần của nó và sau đó bạn có thể sử dụng hàm tạo bằng các phần datetime, ví dụ : new Date('2011', '04' - 1, '11', '11', '51', '00')
. Lưu ý rằng số của tháng phải ít hơn 1.
Phương pháp thay thế - sử dụng một thư viện thích hợp:
Bạn cũng có thể tận dụng thư viện Moment.js cho phép phân tích ngày theo múi giờ đã chỉ định.
new Date('2011-04-11T11:51:00')
ngày tạo là hợp lệ.
new Date('1970-30-02')
là ngày không hợp lệ vì không có 30 tháng trong một năm. Bạn không thể vượt quá nhiều tháng nhưng khi bạn tràn qua các ngày thì nó sẽ phân giải trong Chrome và Firefox thành một ngày hợp lệ: new Date('1970-02-30')
sau đó là cùng ngày với Ngày mới ('1970/03/02').
Thật không may, tôi phát hiện ra rằng
var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());
trả về "Thứ tư ngày 02 tháng 4 năm 2014". Tôi biết nó nghe có vẻ điên rồ, nhưng nó xảy ra với một số người dùng.
Các giải pháp chống đạn là những điều sau đây:
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
được phân tích cú pháp là UTC và toString trả về thời gian cục bộ do đó tùy thuộc vào múi giờ của người dùng, nó chắc chắn có thể trả về các kết quả khác nhau. Nếu luôn muốn thời gian là UTC thì bạn nên sử dụng toUTCString .
var st = "26.04.2013";
var pattern = /(\d{2})\.(\d{2})\.(\d{4})/;
var dt = new Date(st.replace(pattern,'$3-$2-$1'));
Và đầu ra sẽ là:
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()
phương thức này vì nó không tương thích trình duyệt chéo mà không có polyfils. Thay vào đó, sử dụng các phương thức JS tương thích .match()
hoặc .test()
vanilla hơn.
var _delimiter = _format.match(/\W/g)[0];
vào đầu hàm, bạn có thể lấy dấu phân cách tự động và đặt trước tham số thứ 3.
Moment.js ( http://momentjs.com/ ) là gói hoàn chỉnh và tốt để sử dụng ngày và hỗ trợ chuỗi ISO 8601 .
Bạn có thể thêm một ngày chuỗi và định dạng.
moment("12-25-1995", "MM-DD-YYYY");
Và bạn có thể kiểm tra xem một ngày có hợp lệ không.
moment("not a real date").isValid(); //Returns false
Một số ví dụ hiển thị
let dt = moment("02-01-2019", "MM-DD-YYYY");
console.log(dt.fromNow()+' |'+dt.format('LL'))
// output: "3 months ago | February 1, 2019"
Xem tài liệu http://momentjs.com/docs/#/parsing/opes-format/
Khuyến nghị: Tôi khuyên bạn nên sử dụng gói cho ngày chứa nhiều định dạng vì quản lý thời gian và định dạng thời gian thực sự là một vấn đề lớn, thời điểm js giải quyết rất nhiều định dạng. Bạn có thể dễ dàng phân tích ngày từ một chuỗi đơn giản cho đến ngày nhưng tôi nghĩ rằng đó là một công việc khó khăn để hỗ trợ tất cả các định dạng và biến thể của ngày.
let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))
kết quả: "3 tháng trước | ngày 1 tháng 2 năm 2019"
Truyền nó làm đối số cho Date ():
var st = "date in some format"
var dt = new Date(st);
Bạn có thể truy cập ngày, tháng, năm bằng cách sử dụng, ví dụ : dt.getMonth()
.
console.log(new Date('30-08-2018'))
và nhận được ngày không hợp lệ
01/02/2020
trên máy tính của tôi (ở Anh), nó sẽ trả về ngày 1 tháng 2 trong trường hợp như điều tương tự được thực hiện ở Mỹ, nó sẽ trở lại vào ngày 2 tháng 1. Bạn nên khá nhiều không bao giờ sử dụng thực hiện ngây thơ này. Sử dụng thời điểm thay thế.
Nếu bạn có thể sử dụng thư viện khoảnh khắc tuyệt vời (ví dụ: trong dự án Node.js), bạn có thể dễ dàng phân tích ngày của mình bằng cách sử dụng, ví dụ:
var momentDate = moment("2014-09-15 09:00:00");
và có thể truy cập đối tượng ngày JS thông qua
momentDate ().toDate();
new Date(2000, 10, 1)
sẽ cung cấp cho bạn "Thứ tư ngày 01 tháng 11 năm 2000 00:00:00 GMT + 0100 (CET)"
Xem 0 cho tháng mang lại cho bạn tháng một
Đối với những người đang tìm kiếm một giải pháp nhỏ bé và thông minh:
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);
};
Thí dụ:
"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");
Chỉ new Date(st);
Giả sử rằng đó là định dạng phù hợp .
Nếu bạn muốn chuyển đổi từ định dạng "dd / MM / yyyy". Đây là một ví dụ:
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]);
Giải pháp này hoạt động trong các phiên bản IE dưới 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
giá trị? Giống như : var date = new Date(undefined)
?
Date.parse
gần như có được những gì bạn muốn. Nó sặc trên am
/ pm
phần, nhưng với một số hack bạn có thể làm cho nó hoạt động:
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;
}
Chuyển đổi sang định dạng 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]);
}
Tôi hy vọng giúp được ai đó !!!
Tôi đã tạo một fiddle cho điều này, bạn có thể sử dụng hàm toDate () trên bất kỳ chuỗi ngày nào và cung cấp định dạng ngày. Điều này sẽ trả về cho bạn một đối tượng Date. https://jsfiddle.net/Sushil231088/q56yd0rp/
"17/9/2014".toDate("dd/MM/yyyy", "/")
Để chuyển đổi chuỗi sang ngày trong js tôi sử dụng 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
Tôi đã thực hiện chức năng này để chuyển đổi bất kỳ đối tượng Ngày nào thành đối tượng Ngày UTC.
function dateToUTC(date) {
return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}
dateToUTC(new Date());
Một cách khác để làm điều đó:
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
Bạn có thể thử điều này:
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);
hoặc là
var date = new Date('01/01/1970');
chuỗi ngày ở định dạng '01 -01-1970 'sẽ không hoạt động trong FireFox, vì vậy tốt hơn nên sử dụng "/" thay vì "-" trong chuỗi định dạng ngày.
Nếu bạn cần kiểm tra nội dung của chuỗi trước khi chuyển đổi sang định dạng Ngày:
// 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;
}
Tôi đã tạo hàm parseDateTime để chuyển đổi chuỗi thành đối tượng ngày và nó đang hoạt động trong tất cả các trình duyệt (bao gồm cả trình duyệt IE), kiểm tra xem có ai cần không, tham khảo https://github.com/Umesh-Markande/Pude-String-to-Date -tất cả trình duyệt
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)
Câu trả lời này dựa trên câu trả lời của Kassem nhưng nó cũng xử lý năm có hai chữ số. Tôi đã gửi một bản chỉnh sửa cho câu trả lời của Kassem, nhưng trong trường hợp nó không được chấp thuận, tôi cũng sẽ gửi nó dưới dạng một câu trả lời riêng.
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","-")
Bạn có thể sử dụng regex để phân tích chuỗi để chi tiết thời gian sau đó tạo ngày hoặc bất kỳ định dạng trả lại nào như:
//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));
Hôm nay (2020.05.08) Tôi thực hiện các thử nghiệm cho các giải pháp đã chọn - trong hai trường hợp: ngày đầu vào là chuỗi ISO8601 (Quảng cáo, Bd, Cd, Dd, Ed) và ngày đầu vào là dấu thời gian (At, Ct, Dt). Các giải pháp Bd, Cd, Ct không trả về đối tượng Date js, nhưng tôi thêm chúng vì chúng có thể hữu ích nhưng tôi không so sánh chúng với các giải pháp hợp lệ. Kết quả này có thể hữu ích cho phân tích ngày lớn.
new Date
(Quảng cáo) nhanh hơn 50-100 lần so với khoảnh khắc.js (Dd) cho tất cả các trình duyệt cho ngày và dấu thời gian ISOnew Date
(Quảng cáo) nhanh hơn ~ 10 lầnparseDate
(Ed)Date.parse
(Bd) là nhanh nhất nếu tuần trăng mật cần lấy dấu thời gian từ ngày ISO trên tất cả các trình duyệtTôi thực hiện kiểm tra trên MacOs High Sierra 10.13.6 trên Chrome 81.0, Safari 13.1, Firefox 75.0. Giải pháp parseDate
(Ed) sử dụng new Date(0)
và đặt thủ công các thành phần ngày UTC.
Kết quả cho chrome
ISO 8601-esque datestrings, tuyệt vời như tiêu chuẩn, vẫn không được hỗ trợ rộng rãi.
Đây là một tài nguyên tuyệt vời để tìm ra định dạng dữ liệu bạn nên sử dụng:
http://dygraphs.com/date-formats.html
Vâng, điều đó có nghĩa là việc đánh giá của bạn có thể đơn giản như trái ngược với
"2014/10/13 23:57:52"
thay vì
"2014-10-13 23:57:52"
sử dụng mã này: (vấn đề của tôi đã được giải quyết với mã này)
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;
}
Tôi đã viết một hàm có thể sử dụng lại mà tôi sử dụng khi tôi nhận được chuỗi ngày từ máy chủ.
bạn có thể vượt qua dấu phân cách mong muốn (/ - v.v.) phân tách ngày tháng và năm để sử dụng split()
phương thức.
bạn có thể xem và kiểm tra nó trên ví dụ làm việc này .
<!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>
Một cách khác để làm điều đó là xây dựng một biểu thức chính quy với các nhóm chụp được đặt tên qua chuỗi định dạng và sau đó sử dụng biểu thức chính đó để trích xuất ngày, tháng và năm từ chuỗi ngày:
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