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


208

ฉันจะแปลงสตริงเป็นวัตถุเวลาวันที่ใน javascript โดยระบุสตริงรูปแบบได้อย่างไร

ฉันกำลังมองหาบางสิ่งที่ชอบ:

var dateTime = convertToDateTime("23.11.2009 12:34:56", "dd.MM.yyyy HH:mm:ss");

2
จุด BTW และเครื่องหมายขีดคั่นสามารถล้มเหลวได้เนื่องจากตัวคั่นวันที่เครื่องหมายทับไม่เป็นไรดังนั้น (ถึงขีด จำกัด ของการทดสอบของฉัน) Javascript จะยอมรับ "2011/08/22 10:30:00" แต่ยังไม่ (แม้จะมี ISO 8601) "2011-09 -02 15:58:40 "ซึ่ง - ได้รับการอ้างสิทธิ์ - ได้รับการสนับสนุนใน Javascript 1.8.5
Dave Everitt

ฟังก์ชัน Date.parse แยกสตริงวันที่ซึ่งอยู่ในรูปแบบ "mm / dd / yyyy" โปรดแปลงสตริงเป็นรูปแบบ "mm / dd / yyyy" ก่อนที่จะใช้การแยกวิเคราะห์

ทำไมไม่ระบุวันที่ในรูปแบบที่ต้องการ? ฉันชอบวันที่ใหม่ ('2012 11 25 18:00:00'); และมันใช้งานได้!
foxybagga

คำตอบ:


88

ฉันคิดว่านี่สามารถช่วยคุณได้: http://www.mattkruse.com/javascript/date/

มีgetDateFromFormat()ฟังก์ชั่นที่คุณสามารถปรับแต่งเล็กน้อยเพื่อแก้ปัญหาของคุณ

อัปเดต: มีตัวอย่างเวอร์ชันที่อัปเดตแล้วที่javascripttoolbox.com


5
TypeError: Object Date has no method 'getDateFromFormat'
Derek 朕會功夫

6
เมธอด getDateFromFormat พร้อมใช้งานกับ doc บนลิงก์ด้านบน มีแหล่งข้อมูลที่นี่: mattkruse.com/javascript/date/source.html
Rafael Mueller

1
+1, ห้องสมุดที่ดี .. จาวาสคริปต์เพียว ... มันวิเศษมาก ขอบคุณ
Surendra Jnawali

7
ลิงก์ทั้งสองนั้นตายไปแล้ว
Sytham

1
หากเป็นไปได้โปรดอัปเดตลิงก์ มันไม่ได้ช่วยอะไรอีกแล้ว
Tallerlei

98

ใช้ถ้าสายของคุณเข้ากันได้กับ หากรูปแบบของคุณไม่เข้ากัน (ฉันคิดว่ามันเป็น) คุณจะต้องแยกสตริงด้วยตัวคุณเอง (ควรจะง่ายกับการแสดงออกปกติ) และสร้างวัตถุวันที่ใหม่ที่มีค่าที่ชัดเจนสำหรับปีเดือนวันที่ชั่วโมงนาทีและวินาทีnew Date(dateString)Date.parse()


1
Date.parse เป็นทางออกที่ดีที่สุด! มันแยกวิเคราะห์เกือบทุกอย่าง! +1
ianaz

7
@ianaz: เกือบทุกอย่างที่ใช้ในอเมริกา แต่การขาดรูปแบบที่ใช้โดยส่วนใหญ่ของยุโรปนั้นใหญ่เกินไป "เกือบ" แต่วันที่ใหม่เป็นพื้นฐานที่ดีสำหรับฟังก์ชั่นที่กำหนดเอง
Pavel V.

ใหม่ Date (dateString) ทำงานได้ดีสำหรับฉัน Date.parse () แทนการแปลงเป็นมิลลิวินาทีดังนั้นจึงส่งกลับตัวเลขไม่ใช่ประเภท Date
Reagan Ochora

68

@Christoph Mentions ใช้ regex เพื่อแก้ไขปัญหา นี่คือสิ่งที่ฉันใช้:

var dateString = "2010-08-09 01:02:03";
var reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/;
var dateArray = reggie.exec(dateString); 
var dateObject = new Date(
    (+dateArray[1]),
    (+dateArray[2])-1, // Careful, month starts at 0!
    (+dateArray[3]),
    (+dateArray[4]),
    (+dateArray[5]),
    (+dateArray[6])
);

มันไม่ได้ฉลาดแค่กำหนดค่า regex และnew Date(blah)ให้เหมาะกับความต้องการของคุณ

แก้ไข: อาจเข้าใจได้มากกว่าใน ES6 เล็กน้อยโดยใช้การทำลายล้าง:

let dateString = "2010-08-09 01:02:03"
  , reggie = /(\d{4})-(\d{2})-(\d{2}) (\d{2}):(\d{2}):(\d{2})/
  , [, year, month, day, hours, minutes, seconds] = reggie.exec(dateString)
  , dateObject = new Date(year, month-1, day, hours, minutes, seconds);

แต่ในความซื่อสัตย์ทุกวันนี้ฉันเอื้อมมือไปหาอะไรสักอย่าง


19
@ bažmegakapaแทนที่จะร้องไห้คุณอาจจะแก้ไขคำตอบแล้วเพิ่ม 'var เป็นของตัวเอง?
OrganicPanda

ทำไมคุณกำลังใช้/gธงเพียงชุดlastIndexไป0หลังจากนั้น อย่าใช้การแข่งขันระดับโลก
Ry-

1
@minitech The /gเป็นสำเนา / วางที่เลอะเทอะจากโครงการที่มีอยู่ lastindexถูกเพิ่มโดยบรรณาธิการ (เพื่อต่อสู้กับ\gฉันคิดว่า?) ฉันจะลบออกตอนนี้ ขอบคุณสำหรับการชี้ให้เห็นว่า
OrganicPanda

1
Anwer ดีมาก .. มีประโยชน์กับฉัน
จริงๆ

14

ไม่มีขั้นตอนการจัดรูปแบบวันที่ / เวลาที่ซับซ้อนอยู่ใน JavaScript

คุณจะต้องใช้ห้องสมุดภายนอกสำหรับการส่งออกวันที่จัดรูปแบบ "รูปแบบวันที่ JavaScript"จาก Badrant Badgerery ดูมีแนวโน้มมาก

สำหรับการแปลงอินพุทนั้นได้มีการแนะนำหลายอย่างไว้แล้ว :)


3
"ต้อง" เป็นญาติ แน่นอนคุณสามารถสร้างการใช้งานของคุณเอง :)
Tomalak

13

ตรวจสอบMoment.js มันเป็นห้องสมุดที่ทันสมัยและมีประสิทธิภาพที่ทำขึ้นสำหรับฟังก์ชั่นวันที่เลวร้ายของ JavaScript


3
ฉันไม่ได้ลงคะแนน แต่อาจจะเป็นการดีที่ได้รู้ว่าฟังก์ชั่นใดใน Moment.js จะให้พฤติกรรมที่ต้องการ (สำหรับคนขี้เกียจที่ใช้ Moment.js อยู่แล้ว แต่ไม่รู้ว่าจะใช้ฟังก์ชั่นใด) .
Matt

การโลคัลไลซ์เซชันมีแนวโน้มเลือกโลแคลกลาง - ยุโรปสำหรับรูปแบบจุด อย่างไรก็ตามฉันไม่ได้ทดสอบและรูปแบบวันที่และเวลาเต็มไม่ได้อยู่ในตัวอย่างที่ฉันเห็น
Pavel V.

ฉันไม่ได้ลงคะแนน แต่ฉันแค่อยากจะบอกว่านี่ช้า สำหรับเดสก์ท็อปโอเค แต่สำหรับมือถืออาจช้าเกินไป (ขึ้นอยู่กับความต้องการของคุณ)
gabn88

11

สำหรับคำตอบที่ปรับปรุงแล้วที่นี่มี js lib ที่ดีที่http://www.datejs.com/

Datejs เป็นไลบรารี JavaScript วันที่เปิดแหล่งที่มาสำหรับการแยกวิเคราะห์การจัดรูปแบบและการประมวลผล


ย้อนกลับแก้ไขนั้นแม้ว่าจะมีประโยชน์มากก็ควรจะเพิ่มเป็นความคิดเห็นหรือคำตอบแยกต่างหาก
Alexis Abril

มันยาวเกินไปสำหรับความคิดเห็นต่อไปและการเพิ่มคำตอบที่ซ้ำกันนั้นผิด คำถามนี้มีผู้เข้าชมมากกว่า 155,000 ครั้ง - ให้ข้อมูลเหล่านี้ให้มากที่สุด! (โดยวิธี - มันเป็นเรื่องธรรมดามากใน Stack Overflow เพื่อแก้ไขคำตอบที่มีอยู่ - คุณอาจจะรู้สึกแย่กว่านี้ถ้าฉันเพิ่งคัดลอกคำตอบของคุณ ... )
Kobi

1
และถ้าคุณไม่ชอบการแก้ไขของฉันที่ใช้ได้ แต่โปรดขยายคำตอบของคุณ - "เพียงคำตอบที่ได้รับการอัปเดตที่นี่" เป็นตัวเติมและมันขาดรายละเอียดบางอย่าง คำถามนี้กำลังได้รับความสนใจในขณะนี้ซึ่งเป็นเหตุผลที่คุณได้รับคะแนน 5 ทันที
Kobi

7
var temp1 = "";
var temp2 = "";

var str1 = fd; 
var str2 = td;

var dt1  = str1.substring(0,2);
var dt2  = str2.substring(0,2);

var mon1 = str1.substring(3,5);
var mon2 = str2.substring(3,5);

var yr1  = str1.substring(6,10);  
var yr2  = str2.substring(6,10); 

temp1 = mon1 + "/" + dt1 + "/" + yr1;
temp2 = mon2 + "/" + dt2 + "/" + yr2;

var cfd = Date.parse(temp1);
var ctd = Date.parse(temp2);

var date1 = new Date(cfd); 
var date2 = new Date(ctd);

if(date1 > date2) { 
    alert("FROM DATE SHOULD BE MORE THAN TO DATE");
}

5

ห้องสมุดภายนอกเป็น overkill สำหรับการแยกวิเคราะห์หนึ่งหรือสองวันดังนั้นฉันทำหน้าที่ของตัวเองโดยใช้โซลูชั่นของOliและChristoph ที่นี่ในยุโรปกลางเราไม่ค่อยใช้สิ่งใดเลย แต่เป็นรูปแบบของ OP ดังนั้นนี่น่าจะเพียงพอสำหรับแอพที่ใช้ง่าย ๆ ที่นี่

function ParseDate(dateString) {
    //dd.mm.yyyy, or dd.mm.yy
    var dateArr = dateString.split(".");
    if (dateArr.length == 1) {
        return null;    //wrong format
    }
    //parse time after the year - separated by space
    var spacePos = dateArr[2].indexOf(" ");
    if(spacePos > 1) {
        var timeString = dateArr[2].substr(spacePos + 1);
        var timeArr = timeString.split(":");
        dateArr[2] = dateArr[2].substr(0, spacePos);
        if (timeArr.length == 2) {
            //minutes only
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]));
        } else {
            //including seconds
            return new Date(parseInt(dateArr[2]), parseInt(dateArr[1]-1), parseInt(dateArr[0]), parseInt(timeArr[0]), parseInt(timeArr[1]), parseInt(timeArr[2]))
        }
    } else {
        //gotcha at months - January is at 0, not 1 as one would expect
        return new Date(parseInt(dateArr[2]), parseInt(dateArr[1] - 1), parseInt(dateArr[0]));
    }
}

4

Date.parse() มันค่อนข้างฉลาด แต่ฉันไม่สามารถรับประกันได้ว่ารูปแบบจะแจงอย่างถูกต้อง

หากไม่เป็นเช่นนั้นคุณต้องหาบางสิ่งเพื่อเชื่อมสะพานทั้งสอง ตัวอย่างของคุณค่อนข้างง่าย (เป็นตัวเลขล้วน ๆ ) ดังนั้นการstring.split()จับคู่REGEX (หรือแม้กระทั่ง- อาจเร็วกว่า) ที่จับคู่กับบางอันparseInt()จะทำให้คุณสามารถออกเดทได้อย่างรวดเร็ว


4
time = "2017-01-18T17:02:09.000+05:30"

t = new Date(time)

hr = ("0" + t.getHours()).slice(-2);
min = ("0" + t.getMinutes()).slice(-2);
sec = ("0" + t.getSeconds()).slice(-2);

t.getFullYear()+"-"+t.getMonth()+1+"-"+t.getDate()+" "+hr+":"+min+":"+sec

บวก 1 หลังจากเรียกฟังก์ชัน getmonth () ดูเหมือนผิด
Arjunsingh

t.getMonth () + 1 ถูกต้องเนื่องจาก Date.getMonth () ส่งคืนค่าที่เป็น 0
Jussi Palo

3

เพียงแค่ให้ 5 เซ็นต์ของฉัน

รูปแบบวันที่ของฉันคือ dd.mm.yyyy (รูปแบบสหราชอาณาจักร) และไม่มีตัวอย่างใด ๆ ที่ใช้งานได้สำหรับฉัน parsers ทั้งหมดกำลังพิจารณา mm เป็นวันและ dd เป็นเดือน

ฉันพบห้องสมุดนี้แล้ว: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ และมันใช้งานได้เพราะคุณสามารถบอกลำดับของฟิลด์ดังนี้:

>>console.log(new Date(Date.fromString('09.05.2012', {order: 'DMY'})));
Wed May 09 2012 00:00:00 GMT+0300 (EEST)

ฉันหวังว่าจะช่วยใครบางคน


ลิงค์ตอนนี้ตาย!

ดี ... archive.org ที่แสดงให้เห็นอย่างรวดเร็ว: bitbucket.org/mazzarelli/js-date/downloadsเป็น URL โครงการ
Anton Valqk

1

Moment.jsจะจัดการสิ่งนี้:

var momentDate = moment('23.11.2009 12:34:56', 'DD.MM.YYYY HH:mm:ss');
var date = momentDate.;

1
ในขณะที่ moment.js นั้นยอดเยี่ยมมีหลายกรณีที่คุณต้องใช้จาวาสคริปต์ดั้งเดิม กรณีการใช้งานปัจจุบันของฉันคือฟังก์ชั่นแผนที่ใน CouchDB
Zach Smith

1

คุณสามารถใช้ห้องสมุด moment.js สำหรับสิ่งนี้ ฉันใช้เพื่อรับเอาท์พุทเฉพาะเวลา แต่คุณสามารถเลือกประเภทของรูปแบบที่คุณต้องการเลือก

อ้างอิง:

1. ห้องสมุดช่วงเวลา: https://momentjs.com/

2. ฟังก์ชั่นเฉพาะเวลาและวันที่: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

convertDate(date) {
        var momentDate = moment(date).format('hh : mm A');
        return momentDate;
}

และคุณสามารถเรียกวิธีนี้เช่น:

this.convertDate('2020-05-01T10:31:18.837Z');

ฉันหวังว่ามันจะช่วย เพลิดเพลินกับการเข้ารหัส


0

ในการตอบสนองDate.parse ให้แปลงสตริงเป็นฟอร์แมต dd-mm-YYYY ตามที่ระบุใน RFC822 หากคุณใช้การแยกวิเคราะห์ yyyy-mm-dd อาจทำผิดพลาด


FYI, จาก RFC 822 (หน้า: 25 ทำความสะอาดบางส่วนเพื่อตอบสนองความยาวข้อความสำหรับความคิดเห็น): 13 สิงหาคม 2525-25-25 - RFC # 822 5. ข้อมูลจำเพาะของวันที่และเวลา 5.1 SYNTAX date-time = [วัน ","] เวลาวันที่; dd mm yy hh: mm: ss zzz day = "จันทร์" / "อังคาร" / "พุธ" / "พฤหัสบดี" / "ศุกร์" / "วันเสาร์" / "วันเสาร์" / "อาทิตย์" วันที่ = 1 * 2 หลักเดือน 2 มิติ day month year เช่น 20 Jun 82 month = "Jan" / "Feb" / "Mar" / "Apr" / "May" / "Jun" / "Jul" / "Jul" / "Aug" / "Sep" / "Oct" / " พ.ย. "/" ธ.ค. "
Valentin Rusk

0
//Here pdate is the string date time
var date1=GetDate(pdate);
    function GetDate(a){
        var dateString = a.substr(6);
        var currentTime = new Date(parseInt(dateString ));
        var month =("0"+ (currentTime.getMonth() + 1)).slice(-2);
        var day =("0"+ currentTime.getDate()).slice(-2);
        var year = currentTime.getFullYear();
        var date = day + "/" + month + "/" + year;
        return date;
    }

querist ขอให้ระบุสตริงรูปแบบ
Armali

@Armali พารามิเตอร์อินพุตเช่น "/ Date (1552415400000) /" ในรูปแบบสตริง
Abhishek Kanrar
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.