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
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
Đị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ố 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.
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 như sau:
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());
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","-")
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()
.
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
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 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
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.
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();
Đố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");
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
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.
Date.parse
gần như có được bạn 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;
}
kiểm tra thư viện datejs http://www.datejs.com/
Chỉ new Date(st);
Giả sử rằng đó là định dạng phù hợp.
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 thành 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
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;
}
var a = "13:15"
var b = toDate(a, "h:m")
alert(b);
function toDate(dStr, format) {
var now = new Date();
if (format == "h:m") {
now.setHours(dStr.substr(0, dStr.indexOf(":")));
now.setMinutes(dStr.substr(dStr.indexOf(":") + 1));
now.setSeconds(0);
return now;
} else
return "Invalid Format";
}
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));
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'));
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>
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 dấu dữ liệu 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"
//little bit of code for Converting dates
var dat1 = document.getElementById('inputDate').value;
var date1 = new Date(dat1)//converts string to date object
alert(date1);
var dat2 = document.getElementById('inputFinishDate').value;
var date2 = new Date(dat2)
alert(date2);
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 đã 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 yêu cầu 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)
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