Chuyển đổi một chuỗi thành một ngày trong JavaScript


667

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


1
Oh tôi đang bối rối. Bạn có muốn Date -> Stringhay String -> Datekhông?
Felix Kling

Câu trả lời:


827

Đị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-DDhoặ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àycâ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.


Tôi cũng đã phải sử dụng phương pháp "chia chuỗi" cho safari cho cùng một vấn đề "Nan" mà Paul Tomblin đưa ra. Ngày mới ('2011-04-11 11:51:00') sẽ trả về 'ngày không hợp lệ'.
A-mốt

1
@Amos: Lưu ý chữ T, phân tách ngày và giờ. Nếu bạn viết new Date('2011-04-11T11:51:00')ngày tạo là hợp lệ.
Pavel Hodek

Thật không may, tôi đã gặp phải vấn đề * nó không hoạt động đối với TẤT CẢ người dùng .
Roman Podlinov

3
Để ngày phân tích một chuỗi là cách tồi tệ nhất để tạo một đối tượng Ngày. Tốt hơn nhiều để phân tích chuỗi theo cách thủ công và gọi Date là hàm tạo. Một số trình duyệt sẽ coi chuỗi ISO không có múi giờ là UTC, các trình duyệt khác là cục bộ.
RobG

6
@Ben Taliadoros: Vâng, nó không hợp lệ trong tất cả các trình duyệt phổ biến, 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 ChromeFirefox 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').
Pavel Hodek

291

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());


45
Không có gì điên rồ cả, sự điều chỉnh rất có thể là do DST khởi động. Các ngày ở định dạng 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 .
James

Đã đập đầu tôi vào cái này Điều này có vẻ hiệu quả, nhưng tôi không hiểu tại sao bạn sử dụng các phần [0] -1 và không chỉ các phần [0].
Adam Youngers

4
@AdamYoungers Do Javascript tính các tháng từ 0: Tháng 1 - 0, Tháng 2 - 1, v.v.
Roman Podlinov

1
Câu trả lời này cho thấy hành vi trong ví dụ là không chính xác. Theo thông số kỹ thuật: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ mẹo (xem: datestring) giá trị đầu ra trong ví dụ sẽ chính xác
James Ross

124
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}

5
Thật không may, có một vấn đề với giải pháp này. Chi tiết tại đây: stackoverflow.com/questions/17959660/
Kẻ

Đầu ra không xác định, bởi vì mã của bạn không chuyển đổi bất cứ thứ gì thành một chuỗi, cũng không xuất ra bất cứ thứ gì.
Robert Siemer

81
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","-")

3
Xử lý ngày từ mọi biến thể không chỉ là định dạng của Hoa Kỳ
Mark Jones

4
@MarkJones Không tin tưởng .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.
Alexander Dixon

1
Thêm 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.
campsjos

39

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.


1
Một số ví dụ hiển thị 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"
CPHPython

36

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().


8
tôi làm console.log(new Date('30-08-2018'))và nhận được ngày không hợp lệ
Dwigh

Câu trả lời này bỏ qua nhiều vấn đề phức tạp cho vấn đề này, ví dụ, nếu tôi làm điều này cho một ngày 01/02/2020trê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ế.
Liam

23

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();

5
xin lưu ý rằng khoảnh khắc hoạt động tốt mà không cần nút
shaheer

Tôi đã gặp lỗi NaN trong các thiết bị Android và IOS của mình khi sử dụng mã này, tuy nhiên nó đang hoạt động trên máy tính để bàn. đây là mã tôi đã sử dụng trước đó: var dateTimeOfTimeIn = ngày mới (năm + "-" + tháng + "-" + ngày + "T" + data.timeIn); sử dụng phương pháp tiếp cận và thư viện thời điểm này, vấn đề của tôi đã được giải quyết và mã của tôi hiện đang hoạt động tốt trong tất cả các thiết bị của tôi!
Mehdi

20

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


18

Đố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");

Hoạt động như một lá bùa! Bạn đã cứu cuộc đời tôi!
Steve Nosse


12

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.


12

Dấu thời gian nên được chuyển thành Số

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

1
Còn về undefinedgiá trị? Giống như : var date = new Date(undefined)?
Benny Neugebauer

@BennyNeugebauer kiểm tra tốt nếu một giá trị không được xác định trước khi bạn cố gắng chuyển nó cho hàm tạo Ngày. Có lẽ bạn muốn ném một ngoại lệ hoặc có thể bạn muốn quay trở lại một ngày mặc định, ai biết?
Lucky Soni

9

Date.parsegần như có được những gì bạn muốn. Nó sặc trên am/ pmphầ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;
}

6

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 đó !!!


5

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", "/")

4

Để 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

1
khoảnh khắc () theo mặc định mất ngày hiện tại. Cách định dạng chuỗi có định dạng "2016-06-27 17: 49: 51.951602 + 05: 30" bằng cách sử dụng thời điểm.
Zoran777

4

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());

3

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

Ah! Khéo léo! Cuối cùng, một mã chăm sóc bất kỳ dấu phân cách nào được sử dụng.
Sam Sirry

3

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'));


2
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.


chuỗi của tôi là "2015/08/03 13:06:16" trong chuỗi FF không hoạt động
Dhara

2

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; 
}

2

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ái này làm việc cho tôi Cảm ơn bạn.
Chris D. Emerson

2

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","-")

1

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));

1

Hiệu suất

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.

Kết luận

  • Giải pháp 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 ISO
  • Giải pháp new Date(Quảng cáo) nhanh hơn ~ 10 lầnparseDate (Ed)
  • Giải pháp 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ệt

nhập mô tả hình ảnh ở đây

Chi tiết

Tô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

nhập mô tả hình ảnh ở đây


0

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"


0
                //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);

0

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;

}


3
vui lòng giải thích câu trả lời của bạn
Mazz

tham số date1 và date2 phải có định dạng là ngày đúng.
Fetra

ngày trả về hàm có tên diff. Nếu bạn muốn số ngày được trả về, chỉ cần làm như vậy: var result = dateDiff (date1, date2); var day_number = result.day; thật dễ dàng
Fetra

0

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>

0

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


Giải pháp hay, nhưng bạn có thể không biết rằng Firefox vẫn không hỗ trợ các nhóm có tên RegExp - bugzilla.mozilla.org/show_orms.cgi?id=1362154 (PS: không phải tôi là người đã đánh giá thấp câu trả lời của bạn)
qdev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.