การแปลงสตริงเป็นวันที่ใน JavaScript


668

ฉันจะแปลงสตริงเป็นวันที่ใน JavaScript ได้อย่างไร

var st = "date in some format"
var dt = new date();

var dt_st= //st in date format same as dt


1
โอ้ตอนนี้ฉันสับสน คุณต้องการDate -> StringหรือString -> Date?
Felix Kling

10
พิจารณาmomentjs.com
hanshenrik

คำตอบ:


827

รูปแบบสตริงที่ดีที่สุดสำหรับการวิเคราะห์สตริงคือรูปแบบวันที่ ISO พร้อมกับตัวสร้างออบเจ็กต์วันที่ของ JavaScript

ตัวอย่างรูปแบบ 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 ในคอนสตรัควัน) คุณควรแยกการแสดงสตริง datetime ไปของชิ้นส่วนและจากนั้นคุณสามารถใช้ตัวสร้างโดยใช้ชิ้นส่วน datetime new Date('2011', '04' - 1, '11', '11', '51', '00')เช่น: โปรดทราบว่าจำนวนเดือนต้องน้อยกว่า 1


วิธีอื่น - ใช้ไลบรารีที่เหมาะสม:

คุณยังสามารถใช้ประโยชน์จากไลบรารีMoment.jsที่อนุญาตให้แยกวิเคราะห์วันที่ด้วยเขตเวลาที่ระบุ


ฉันยังต้องใช้วิธี "แยกสตริง" สำหรับซาฟารีสำหรับปัญหาเดียวกัน "น่าน" ที่ Paul Tomblin นำมาใช้ ใหม่วันที่ ('2011-04-11 11:51:00') จะส่งคืน 'วันที่ไม่ถูกต้อง'
Amos

1
@Amos: สังเกตเห็นตัวอักษร T ซึ่งแยกวันที่และเวลา หากคุณเขียนnew Date('2011-04-11T11:51:00')วันที่สร้างถูกต้อง
Pavel Hodek

แต่น่าเสียดายที่ผมชนเข้ากับปัญหาที่* มันไม่ทำงานสำหรับผู้ใช้ทั้งหมด
Roman Podlinov

3
การปล่อยให้วันที่แยกสตริงเป็นวิธีที่เลวร้ายที่สุดในการสร้างวัตถุวันที่ ดีกว่าที่จะแยกสตริงด้วยตนเองและเรียกวันที่เป็นตัวสร้าง เบราว์เซอร์บางตัวจะจัดการกับสตริง ISO โดยไม่มีเขตเวลาเป็น UTC และอื่น ๆ เป็นโลคัล
RobG

6
@Ben Taliadoros: ใช่มันไม่ถูกต้องในเบราว์เซอร์ทั่วไปทั้งหมดnew Date('1970-30-02')เป็นวันที่ไม่ถูกต้องเพราะไม่มี 30 เดือนในหนึ่งปี คุณไม่สามารถโอเวอร์โฟลว์เดือน แต่เมื่อคุณโอเวอร์โฟลว์วันจะทำการแก้ไขในChromeและFirefoxเป็นวันที่ที่ถูกต้อง: new Date('1970-02-30')เป็นวันเดียวกับวันที่ใหม่ ('1970-03-02')
Pavel Hodek

291

น่าเสียดายที่ฉันพบว่า

var mydate = new Date('2014-04-03');
console.log(mydate.toDateString());

ส่งคืน "Wed Apr 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());


45
มันไม่ได้บ้าเลยการปรับตัวน่าจะเกิดจากการเตะDSTวันที่ในรูปแบบของการyyyy-MM-ddแยกวิเคราะห์เป็น UTC และtoStringส่งคืนเวลาท้องถิ่นดังนั้นขึ้นอยู่กับเขตเวลาของผู้ใช้ที่สามารถให้ผลลัพธ์ที่แตกต่างกันอย่างแน่นอน หากต้องการเสมอเวลา UTC แล้วคุณควรใช้toUTCString
James

ถูกตีหัวของฉันในนี้ ดูเหมือนจะใช้งานได้ แต่ฉันไม่เข้าใจว่าทำไมคุณถึงใช้ชิ้นส่วน [0] -1 และไม่ใช่แค่ส่วน [0]
Adam Youngers

4
@AdamYoungers เนื่องจาก Javascript นับเดือนตั้งแต่ 0: มกราคม - 0, กุมภาพันธ์ - 1, ฯลฯ
Roman Podlinov

1
คำตอบนี้แสดงให้เห็นว่าพฤติกรรมในตัวอย่างไม่ถูกต้อง ตามข้อมูลจำเพาะ: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ...... (ดู: datestring) ค่าที่ส่งออกในตัวอย่างจะถูกต้อง
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'));

และผลลัพธ์จะเป็น:

dt => Date {Fri Apr 26 2013}

5
น่าเสียดายที่มีปัญหากับวิธีนี้ รายละเอียดที่นี่: stackoverflow.com/questions/17959660/…
Roman Podlinov

ไม่รู้จักผลลัพธ์เนื่องจากรหัสของคุณไม่ได้แปลงอะไรเป็นสตริงหรือส่งออกอะไร
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
จัดการกับวันที่จากทุกรูปแบบไม่เพียง แต่การจัดรูปแบบสหรัฐฯ
Mark Jones

4
@MarkJones อย่าไว้วางใจ.indexOf()วิธีการเพราะไม่สามารถใช้งานร่วมกับเบราว์เซอร์ข้ามได้โดยไม่ต้องใช้ polyfils ให้ใช้เมธอด JS ที่เข้ากันได้ดีกว่า.match()หรือ.test()วานิลลาแทน
Alexander Dixon

1
การเพิ่มvar _delimiter = _format.match(/\W/g)[0];ที่จุดเริ่มต้นของฟังก์ชันคุณสามารถรับตัวคั่นโดยอัตโนมัติและกำหนดพารามิเตอร์ที่ 3
campsjos

39

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 แก้รูปแบบได้หลายรูปแบบ คุณสามารถแยกวิเคราะห์วันที่ได้อย่างง่ายดายจากสตริงธรรมดาจนถึงปัจจุบัน แต่ฉันคิดว่านั่นเป็นงานที่ยากที่จะสนับสนุนรูปแบบและรูปแบบวันที่ทั้งหมด


1
ตัวอย่าง let dt = moment("02-01-2019", "MM-DD-YYYY");console.log(dt.fromNow()+' | '+dt.format('LL'))ผลลัพธ์ที่แสดงบางอย่าง: "3 เดือนที่ผ่านมา | 1 กุมภาพันธ์ 2019"
CPHPython

36

ส่งผ่านเป็นอาร์กิวเมนต์ถึง Date ():

var st = "date in some format"
var dt = new Date(st);

dt.getMonth()คุณสามารถเข้าถึงวันเดือนปีที่ใช้ตัวอย่างเช่น:


8
ฉันทำconsole.log(new Date('30-08-2018'))และได้รับวันที่ไม่ถูกต้อง
Dwigh

คำตอบนี้ไม่สนใจความซับซ้อนหลายประการของปัญหานี้ตัวอย่างเช่นถ้าฉันทำสิ่งนี้เพื่อหาคู่01/02/2020ในคอมพิวเตอร์ของฉัน (ในสหราชอาณาจักร) จะส่งคืนวันที่ 1 กุมภาพันธ์ที่ราวกับว่าทำสิ่งเดียวกันในสหรัฐอเมริกามันจะส่งคืนวันที่ 2 มกราคม คุณไม่ควรใช้การติดตั้งแบบไร้เดียงสานี้ ใช้ช่วงเวลาแทน
เลียม

23

หากคุณสามารถใช้ห้องสมุดช่วงเวลาที่ยอดเยี่ยม(เช่นในโครงการ Node.js) คุณสามารถแยกวิเคราะห์วันที่ของคุณโดยใช้เช่น

var momentDate = moment("2014-09-15 09:00:00");

และสามารถเข้าถึงวัตถุวันที่ JS ผ่าน

momentDate ().toDate();

5
โปรดทราบว่าช่วงเวลาทำงานได้ดีโดยไม่มีโหนด
shaheer

ฉันพบข้อผิดพลาด NaN ในอุปกรณ์ android และ IOS ของฉันในขณะที่ใช้รหัสนี้ แต่มันทำงานบนเดสก์ท็อป นี่คือรหัสที่ฉันใช้ก่อนหน้านี้: var dateTimeOfTimeIn = วันที่ใหม่ (ปี + "-" + เดือน + "-" + วัน + "T" + data.timeIn); การใช้วิธีการและช่วงเวลาที่ห้องสมุดนี้ปัญหาของฉันได้รับการแก้ไขและรหัสของฉันทำงานได้ดีในอุปกรณ์ทั้งหมดของฉัน!
เมห์

20

new Date(2000, 10, 1) จะให้ "พ.ย. 01 2000 00:00:00 GMT + 0100 (CET)"

เห็นว่า 0 สำหรับเดือนทำให้คุณมกราคม


19

สำหรับผู้ที่กำลังมองหาทางออกเล็ก ๆ และชาญฉลาด:

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

ทำงานเหมือนจับใจ! คุณช่วยชีวิตเพื่อนของฉัน!
Steve Nosse


12

หากคุณต้องการแปลงจากรูปแบบ "dd / MM / yyyy" นี่คือตัวอย่าง:

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


12

ควรประทับเวลาลงในจำนวน

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
แล้วundefinedคุณค่าล่ะ ที่ชอบ: var date = new Date(undefined)?
Benny Neugebauer

@BennyNeugebauer ดีตรวจสอบว่าค่าไม่ได้กำหนดก่อนที่คุณจะพยายามที่จะส่งมันไปที่คอนสตรัควันที่ บางทีคุณต้องการที่จะโยนข้อยกเว้นหรือบางทีคุณต้องการย้อนกลับไปเป็นวันที่เริ่มต้นใครจะไปรู้?
Lucky Soni

9

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

6

แปลงเป็นรูปแบบ 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]);
    }

ฉันหวังว่าจะช่วยใครซักคน !!!


5

ฉันได้สร้างซอสำหรับสิ่งนี้คุณสามารถใช้ toDate () ฟังก์ชั่นในสตริงวันที่ใด ๆ และให้รูปแบบวันที่ สิ่งนี้จะส่งคืนวัตถุวันที่ https://jsfiddle.net/Sushil231088/q56yd0rp/

"17/9/2014".toDate("dd/MM/yyyy", "/")

4

สำหรับการแปลงสตริงเป็นวันที่ใน js i ใช้ 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
ช่วงเวลา () โดยค่าเริ่มต้นจะใช้วันที่ปัจจุบัน วิธีการจัดรูปแบบสตริงที่อยู่ใน "2016-06-27 17: 49: 51.951602 + 05: 30" ฟอร์แมตโดยใช้ช่วงเวลา
Zoran777

4

ฉันทำฟังก์ชันนี้เพื่อแปลงวัตถุ Date ใด ๆ ให้เป็นวัตถุ UTC Date

function dateToUTC(date) {
    return new Date(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate(), date.getUTCHours(), date.getUTCMinutes(), date.getUTCSeconds());
}


dateToUTC(new Date());

3

อีกวิธีที่จะทำ:

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

อา! เรียบร้อย! ในที่สุดรหัสที่จะดูแลสิ่งที่ใช้คั่น
Sam Sirry

3

คุณสามารถลองสิ่งนี้:

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

หรือ

var date = new Date('01/01/1970');

สตริงวันที่ในรูปแบบ '01 -01-1970 'จะไม่ทำงานใน FireFox ดังนั้นควรใช้ "/" แทน "-" ในสตริงรูปแบบวันที่


สตริงของฉันคือ "2015/08/03 13:06:16" strill ใน FF มันไม่ทำงาน
Dhara

2

หากคุณต้องการตรวจสอบเนื้อหาของสตริงก่อนที่จะแปลงเป็นรูปแบบวันที่:

// 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

ฉันได้สร้างฟังก์ชั่น parseDateTime เพื่อแปลงสตริงเป็นวัตถุวันที่และทำงานในเบราว์เซอร์ทั้งหมด (รวมถึงเบราว์เซอร์ IE) ตรวจสอบว่ามีใครต้องการอ้างอิง https://github.com/Umesh-Markande/Parse-String-to-Date หรือไม่ -in-ทุกเบราว์เซอร์

    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)

อันนี้ใช้ได้สำหรับฉัน ขอบคุณ.
Christopher D. Emerson

2

คำตอบนี้ขึ้นอยู่กับคำตอบของ 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","-")

1

คุณสามารถใช้ regex เพื่อแยกสตริงเวลารายละเอียดแล้วสร้างวันที่หรือรูปแบบการส่งคืนเช่น:

//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

ประสิทธิภาพ

วันนี้ (2020.05.08) ฉันทำการทดสอบสำหรับวิธีแก้ปัญหาที่เลือก - สำหรับสองกรณี: วันที่ป้อนคือสตริง ISO8601 (โฆษณา, Bd, Cd, Dd, Ed) และวันที่เข้าเป็นเวลา (At, Ct, Dt) โซลูชัน Bd, Cd, Ct ไม่ส่งคืนออบเจ็กต์ js Date เป็นผลลัพธ์ แต่ฉันเพิ่มเนื่องจากมีประโยชน์ แต่ไม่เปรียบเทียบกับโซลูชันที่ถูกต้อง ผลลัพธ์นี้มีประโยชน์สำหรับการแยกวิเคราะห์วันที่ขนาดใหญ่

สรุปผลการวิจัย

  • สารละลาย new Date (โฆษณา) เร็วกว่า moment.js (Dd) 50-100x สำหรับเบราว์เซอร์ทั้งหมดสำหรับวันที่ ISO และเวลาประทับ
  • โซลูชันnew Date(โฆษณา) เร็วกว่า ~ 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 ด้วยตนเอง

ผลลัพธ์สำหรับ chrome

ป้อนคำอธิบายรูปภาพที่นี่


0

datestrings ISO 8601-esque ที่ยอดเยี่ยมที่สุดเท่าที่มาตรฐานยังไม่ได้รับการสนับสนุนอย่างกว้างขวาง

นี่เป็นแหล่งข้อมูลที่ยอดเยี่ยมที่จะทราบว่าคุณควรใช้รูปแบบ datestring ใด:

http://dygraphs.com/date-formats.html

ใช่นั่นหมายความว่าการเผยแพร่ของคุณอาจเป็นเรื่องง่าย

"2014/10/13 23:57:52" แทน "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

ใช้รหัสนี้: (ปัญหาของฉันแก้ไขด้วยรหัสนี้)

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
โปรดอธิบายคำตอบของคุณ
Mazz

พารามิเตอร์ date1 และ date2 ต้องมีรูปแบบเป็นวันที่ด้านขวา
Fetra

ฟังก์ชันส่งคืนวันที่ชื่อ diff หากคุณต้องการจำนวนวันที่คืนก็ให้ทำเช่นนั้น: var result = dateDiff (date1, date2); var day_number = result.day; มันง่าย
Fetra

0

ฉันเขียนฟังก์ชั่นที่ใช้ซ้ำได้ที่ฉันใช้เมื่อฉันได้รับสตริงวันที่จากเซิร์ฟเวอร์
คุณสามารถผ่านตัวคั่นที่คุณต้องการ (/ - ฯลฯ .. ) ซึ่งแยกวันเดือนและปีเพื่อใช้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>

0

อีกวิธีหนึ่งในการสร้าง regex ด้วยกลุ่มการจับภาพที่มีชื่อเหนือสตริงรูปแบบจากนั้นใช้ regex นั้นเพื่อแยกวันเดือนและปีจากสตริงวันที่:

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


วิธีแก้ปัญหาที่ดี แต่คุณอาจไม่ทราบว่า Firefox ยังไม่รองรับกลุ่มชื่อ RegExp - bugzilla.mozilla.org/show_bug.cgi?id=1362154 (PS: ไม่ใช่ฉันที่ลดคำตอบของคุณ)
qdev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.