ฉันจะหาเอกสารเกี่ยวกับการจัดรูปแบบวันที่ใน JavaScript ได้ที่ไหน [ปิด]


1398

ฉันสังเกตเห็นว่าnew Date()ฟังก์ชั่นของ JavaScript นั้นฉลาดมากในการยอมรับวันที่ในหลายรูปแบบ

Xmas95 = new Date("25 Dec, 1995 23:15:00")
Xmas95 = new Date("2009 06 12,12:52:39")
Xmas95 = new Date("20 09 2006,12:52:39")

ฉันไม่พบเอกสารที่แสดงรูปแบบสตริงที่ถูกต้องทั้งหมดในขณะที่เรียกnew Date()ใช้ฟังก์ชัน

นี่คือการแปลงสตริงเป็นวันที่ ถ้าเราดูที่ด้านตรงข้ามนั่นคือการแปลงวัตถุวันที่เป็นสตริงจนกระทั่งตอนนี้ฉันอยู่ภายใต้การแสดงผลที่ JavaScript ไม่มี API ในตัวเพื่อจัดรูปแบบวัตถุวันที่ให้เป็นสตริง

หมายเหตุของบรรณาธิการ:วิธีการต่อไปนี้เป็นความพยายามของผู้ถามที่ทำงานบนเบราว์เซอร์เฉพาะ แต่ไม่สามารถใช้งานได้โดยทั่วไป ดูคำตอบในหน้านี้เพื่อดูวิธีแก้ไขปัญหาจริง

วันนี้ฉันเล่นกับtoString()วิธีการเกี่ยวกับวัตถุวันที่และน่าแปลกใจที่มันมีจุดประสงค์ในการจัดรูปแบบวันที่เพื่อสตริง

var d1 = new Date();
d1.toString('yyyy-MM-dd');       //Returns "2009-06-29" in Internet Explorer, but not Firefox or Chrome
d1.toString('dddd, MMMM ,yyyy')  //Returns "Monday, June 29,2009" in Internet Explorer, but not Firefox or Chrome

นอกจากนี้ที่นี่ฉันไม่พบเอกสารใด ๆ ในทุกวิธีที่เราสามารถจัดรูปแบบวัตถุวันที่ให้เป็นสตริง

เอกสารซึ่งแสดงรายการตัวระบุรูปแบบที่Date()วัตถุสนับสนุนอยู่ที่ไหน


165
ตัวอย่างของคุณไม่ทำงานตามที่คุณคิด: jsfiddle.net/edelman/WDNVk/1
Jason

27
ขออภัยการส่งสตริงรูปแบบใน toString ทำงานใน. NET และอาจทำงานได้ใน Java แต่เมื่อ Jason ชี้ให้เห็นสิ่งนี้จะไม่ทำงานใน Javascript
Joshua Carmody

12
คนจำ - คำถามที่ไม่ว่าวิธีการที่ยอมรับความจำเป็นที่จะยังคงอยู่ในคำถาม โปรดงดเว้นจากการแก้ไขใด ๆ ที่เปลี่ยนคำถามนี้เป็นคำตอบปรับแต่งและรักษาคำตอบแทน ขอบคุณ :)
Tim Post

1
ฉันใช้รหัสในลิงค์นี้msdn.microsoft.com/en-us/library/ie/ff743760(v=vs.94).aspx - (date.toLocaleDateString ("en-US"));
Khaled Annajar

หากผู้เข้าชมหน้านี้ในอนาคตสับสนกับคำตอบส่วนใหญ่ที่เกี่ยวข้องกับคำถามฉันขอแนะนำให้อ่านการแก้ไขคำถามโดยเฉพาะอย่างยิ่ง (หากแตกต่างจากด้านบน) การแก้ไข 15 @ Eric Muyser - ฉันคนหนึ่งสับสนเพราะขาดความไม่ถูกต้อง วันที่ # toString การใช้งาน
user66001

คำตอบ:


1063

ฉันรัก10 วิธีการรูปแบบเวลาและวันที่ใช้ JavaScriptและการทำงานกับวันที่

โดยทั่วไปคุณมีสามวิธีและคุณต้องรวมสตริงเข้าด้วยกัน:

getDate() // Returns the date
getMonth() // Returns the month
getFullYear() // Returns the year

ตัวอย่าง:

var d = new Date();
var curr_date = d.getDate();
var curr_month = d.getMonth() + 1; //Months are zero based
var curr_year = d.getFullYear();
console.log(curr_date + "-" + curr_month + "-" + curr_year);


27
ทั้งสองเว็บไซต์เหล่านี้มีใบอนุญาตที่ จำกัด ดังนั้นหากคุณใช้รหัส (โดยไม่ได้รับอนุญาต) คุณจะถูกละเมิด Momentjs ( stackoverflow.com/a/10119138/278976 ) ดูเหมือนตัวเลือกที่ดีกว่าและเป็นลิขสิทธิ์ของ MIT
Homer6

4
@peller คำตอบนี้ตอบคำถาม "ฉันจะจัดรูปแบบวันที่ในรูปแบบจาวาสคริปต์ได้อย่างไร" ซึ่งเป็นชื่อของคำถามได้อย่างมีประสิทธิภาพ ในเนื้อความของคำถามเขาค่อนข้างเข้าใจผิด และตรงประเด็นของคุณคำตอบนี้ไม่ได้พูดถึงการจัดรูปแบบสตริงโดยใช้ไลบรารีที่ไม่ได้มาตรฐานหรือไม่ได้กล่าวถึง แต่คำถามนั้นถูกถามอย่างไม่ถูกต้องเนื่องจากความคิดเห็น # 1 ในคำถามนั้น ดังนั้นนี่จึงตอบคำถามจริง แต่ไม่ใช่สตริงรูปแบบที่ไม่มีอยู่จริง
McKay

3
@McKay; นั่นไม่ใช่คำถาม ฉันคิดว่าคุณอาจเข้าใจผิดในสิ่งที่ผู้จำหน่ายสินค้ากำลังขอหรือป้านในการให้เหตุผลของคุณ
codeinthehole

10
@codeinthehole "การจัดรูปแบบวันที่ใน Javascript" เป็นคำถาม "จนถึงตอนนี้ฉันรู้สึกว่า JavaScript ไม่มี API ในตัวเพื่อจัดรูปแบบวัตถุวันที่ในสตริง" แต่แล้วพูดถึงพฤติกรรมที่ฉันเชื่อว่าเขาคิดว่าเป็นพื้นเมืองในจาวาสคริปต์ โดยไม่ทราบว่าห้องสมุดใดที่เขาอ้างอิงผิดพลาดฉันคิดว่าสิ่งที่ดีที่สุดคือเขาถามคำถามว่า "ฉันจะจัดรูปแบบวันที่ในรูปแบบจาวาสคริปต์ได้อย่างไร" และฉันไม่คิดว่าฉันจะก้าวกระโดดอย่างดุเดือด
แมคเคย์

5
MM เฉลี่ย 01-12 ไม่ใช่ 1-12: 2013-04-17 => ตกลง 2013-4-17 => BAD
Adrian Maire

678

Moment.js

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

var a = moment([2010, 1, 14, 15, 25, 50, 125]);
a.format("dddd, MMMM Do YYYY, h:mm:ss a"); // "Sunday, February 14th 2010, 3:25:50 pm"
a.format("ddd, hA");                       // "Sun, 3PM"

(*) ความหมายเบา 9.3KB ย่อขนาด + gzipped ในการตั้งค่าที่เล็กที่สุดที่เป็นไปได้ (feb 2014)


7
นอกจากนี้ยังมีรูปแบบการตกแต่งภายในวัตถุวันที่แทนการเจาะลิงวัตถุหลักดังนั้นคุณจึงมีโอกาสน้อยที่จะเกิดความขัดแย้งตามท้องถนน
Gabe Martin-Dempesy

120
โปรดหยุดการใช้คำว่า "จริงจัง" ในทางที่ผิด แม้กระทั่ง 5kb นั้นมีขนาดใหญ่อย่างน่าขันสำหรับฟังก์ชั่นดังกล่าวและต่อมาในวันนี้ขนาดก็เพิ่มขึ้นเป็น 19kb
user123444555621

27
@ Pumbaa80 ฉันไม่เห็นด้วยว่า "แม้กระทั่ง 5kb นั้นมีขนาดใหญ่มากสำหรับการใช้งานเช่นนี้" คุณเห็นเอกสารหรือไม่ มันเป็นห้องสมุดที่มีประโยชน์อย่างยิ่งสำหรับจัดการกับวันที่ใน JS ฉันเข้าใจว่าการมีไลบรารี่มากกว่าสอง KB สำหรับการใช้งานในรูปแบบพื้นฐานเช่น "D / M / Y" นั้นเกินความจำเป็นเล็กน้อย . รหัสที่รักษาได้นั้นเป็นสิ่งที่ดีเพื่อประโยชน์ของไม่กี่ KB ถ้ามันลดลง + 100KB ฉันจะเห็นด้วย
Turnerj

15
@Tumerj เถียงว่ามีประโยชน์ไม่ทำอะไรเลยเพื่อแก้ไขข้อกังวลของการมีน้ำหนักเบา ทั้งสองไม่เกี่ยวข้องกัน
JoshJordan

9
คุณไม่สามารถทำให้เครื่องบินเจ็ทมีน้ำหนักเบากว่านี้ได้โดยถอดเครื่องยนต์ออกเพราะมันจะกลายเป็นเครื่องร่อนไม่ใช่เจ็ต น้ำหนักเบาหมายถึงบางสิ่งบางอย่างมีฟังก์ชั่นที่จำเป็นเท่านั้นในการทำหน้าที่ที่ระบุ ดังนั้นนี่เป็นโซลูชันที่มีน้ำหนักเบา
Bon

425

หากคุณใช้jQuery UIในโครงการของคุณอยู่แล้วคุณสามารถใช้วิธี Datepicker ในตัวสำหรับการจัดรูปแบบวัตถุวันที่ของคุณ:

$.datepicker.formatDate('yy-mm-dd', new Date(2007, 1 - 1, 26));

อย่างไรก็ตาม datepicker จัดรูปแบบเฉพาะวันที่และไม่สามารถจัดรูปแบบเวลา

ดูที่jQuery UI datepicker formatDateตัวอย่าง


จะบอกให้ใช้เวลาท้องถิ่นหรือซูลูได้อย่างไร
Ustaman Sangat

7
ฉันชอบใช้วิธีนี้เพื่อให้ได้เวลาโดยไม่มีไลบรารี่ใด ๆ : new Date (). toTimeString (). match (/ ^ ([0-9] {2}: [0-9] {2}: [0-9 ] {2}) /) [0] FYI
markcial

มีวิธีทำเช่นนี้ $ .datepicker.formatDate ('yy-mm-dd', วันที่ใหม่ ("txtAdvDate" .Val ()) หรือบางสิ่งเช่นนั้น
Pomster

@Pomster - อะไรที่ทำให้คุณคิดว่าสตริง "txtAdvDate" จะมีวิธี val อยู่หรือไม่ คุณหมายถึง $ ('# txtAdvDate'). val () หรือไม่ สมมติว่ามันเหมาะกับหนึ่งในคอนสตรัคเตอร์ (ดูที่นี่w3schools.com/jsref/jsref_obj_date.asp ) แล้วมันก็ใช้ได้ดี
vbullinger

@Pomster - ลองใช้สิ่งนี้: document.getElementById (id) .value = $ .datepicker.formatDate ('yy-mm-dd', วันที่ใหม่ ());
mrrsb

219

เอกสารซึ่งแสดงรายการตัวระบุรูปแบบที่Date()วัตถุสนับสนุนอยู่ที่ไหน

ฉันสะดุดในวันนี้และรู้สึกประหลาดใจมากที่ไม่มีใครตอบคำถามง่าย ๆ นี้ จริงอยู่มีห้องสมุดมากมายที่นั่นเพื่อช่วยจัดการกับวันที่ บางคนดีกว่าคนอื่น แต่นั่นไม่ใช่คำถามที่ถาม

AFAIK, JavaScript บริสุทธิ์ไม่สนับสนุน specifiers รูปแบบวิธีการที่คุณได้ระบุคุณต้องการที่จะใช้พวกเขา แต่จะใช้วิธีการสนับสนุนสำหรับการจัดรูปแบบวันที่และ / หรือเวลาเช่น.toLocaleDateString(), และ.toLocaleTimeString().toUTCString()

การDateอ้างอิงวัตถุที่ฉันใช้บ่อยที่สุดอยู่ในเว็บไซต์ w3schools.com (แต่การค้นหาโดย Google อย่างรวดเร็วจะเปิดเผยอีกมากมายที่อาจตอบสนองความต้องการของคุณได้ดีกว่า)

นอกจากนี้โปรดทราบว่าส่วนวันที่คุณสมบัติวัตถุให้การเชื่อมโยงprototypeซึ่งแสดงวิธีการบางอย่างที่คุณสามารถขยายวัตถุวันที่ด้วยวิธีการที่กำหนดเอง มีการถกเถียงกันหลายครั้งในชุมชน JavaScript ในช่วงหลายปีที่ผ่านมาว่าเป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่และฉันไม่ได้สนับสนุนหรือต่อต้านมันเพียงแค่ชี้ให้เห็นว่ามันมีอยู่จริง


26
MDN เป็นข้อมูลอ้างอิงที่ดีเช่นกัน: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

2
คำตอบของฉันพยายามตอบคำถามนี้ด้วย ฉันเชื่อว่าเบราว์เซอร์ Firefox หรือ Mozilla ครั้งหนึ่งเคยจัดทำวิธี Date.toString () ซึ่งใช้สตริงการจัดรูปแบบดังกล่าว น่าเสียดายที่ฉันไม่พบร่องรอยของเอกสารเก่า มันไม่ได้เป็นส่วนหนึ่งของมาตรฐานอีกต่อไปและดูเหมือนจะไม่ได้รับการสนับสนุนทุกที่อีกต่อไปแม้แต่ใน Firefox
peller

214

ฟังก์ชั่นการจัดรูปแบบที่กำหนดเอง:

สำหรับรูปแบบคงที่ฟังก์ชั่นที่เรียบง่ายทำให้งาน ตัวอย่างต่อไปนี้สร้างรูปแบบสากล YYYY-MM-DD:

function dateToYMD(date) {
    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    return '' + y + '-' + (m<=9 ? '0' + m : m) + '-' + (d <= 9 ? '0' + d : d);
}

หมายเหตุ: อย่างไรก็ตามโดยทั่วไปแล้วไม่ใช่ความคิดที่ดีที่จะขยายไลบรารีมาตรฐาน Javascript (เช่นโดยการเพิ่มฟังก์ชั่นนี้ในต้นแบบของ Date)

ฟังก์ชั่นขั้นสูงมากขึ้นสามารถสร้างผลลัพธ์ที่กำหนดค่าได้ตามพารามิเตอร์รูปแบบ มีตัวอย่างที่ดีสองสามข้อในหน้าเดียวกันนี้

หากการเขียนฟังก์ชั่นการจัดรูปแบบนั้นยาวเกินไปก็จะมีห้องสมุดอยู่รอบตัวมากมาย บางคำตอบอื่น ๆ ระบุไว้แล้ว แต่การพึ่งพาที่เพิ่มขึ้นก็มีส่วนที่

ฟังก์ชันการจัดรูปแบบ ECMAScript มาตรฐาน:

ตั้งแต่รุ่นล่าสุดของ ECMAscript Dateคลาสมีฟังก์ชันการจัดรูปแบบเฉพาะ:

toDateString : การติดตั้งใช้งานแสดงเฉพาะวันที่

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.todatestring

new Date().toDateString(); // e.g. "Fri Nov 11 2016"

toISOString : แสดง ISO 8601 วันที่และเวลา

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.toisostring

new Date().toISOString(); // e.g. "2016-11-21T08:00:00.000Z"

toJSON : Stringifier สำหรับ JSON

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tojson

new Date().toJSON(); // e.g. "2016-11-21T08:00:00.000Z"

toLocaleDateString : ขึ้นอยู่กับการนำไปใช้งานวันที่ในรูปแบบโลแคล

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaledatestring

new Date().toLocaleDateString(); // e.g. "21/11/2016"

toLocaleString : การนำไปใช้งานขึ้นอยู่กับวันที่และเวลาในรูปแบบโลแคล

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocalestring

new Date().toLocaleString(); // e.g. "21/11/2016, 08:00:00 AM"

toLocaleTimeString : การดำเนินการขึ้นอยู่กับเวลาในรูปแบบสถานที่

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tolocaletimestring

new Date().toLocaleTimeString(); // e.g. "08:00:00 AM"

toString : toStringทั่วไปสำหรับวันที่

http://www.ecma-international.org/ecma-262/7.0/index.html#sec-date.prototype.tostring

new Date().toString(); // e.g. "Fri Nov 11 2016 08:00:00 GMT+0100 (W. Europe Standard Time)"

หมายเหตุ: เป็นไปได้ที่จะสร้างเอาต์พุตที่กำหนดเองจากฟังก์ชันการจัดรูปแบบเหล่านั้น:

new Date().toISOString().slice(0,10); // By @Image72, return YYYY-MM-DD

10
ควรจะได้รับคำตอบเพราะมันให้รูปแบบที่ต้องการ (01-01-2000, ไม่ใช่ 1-1-2000)
Danubian Sailor

6
.. วันที่ () ใหม่ toISOString () ชิ้น (0,10) // "2015/04/27"
image72

2
จะมีประโยชน์มากหากไม่มีตัวอย่างในวันที่ 11 กันยายนดังนั้นจะชัดเจนว่าตำแหน่งใดที่แสดงวันและเดือน
Karl Adler

1
@abimelex เสร็จแล้ว หวังว่าจะชัดเจนขึ้นในขณะนี้
Adrian Maire

1
ขอบคุณสำหรับการเพิ่มลิงก์ไปยังแหล่งที่มา (: - ดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/ ......และdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference / …
Sandra

125

คำตอบสั้น ๆ

ไม่มีเอกสาร“ สากล” ที่จาวาสคริปต์มี เบราว์เซอร์ทุกตัวที่มีจาวาสคริปต์นั้นเป็นการใช้งานจริง อย่างไรก็ตามมีมาตรฐานที่เบราว์เซอร์สมัยใหม่ส่วนใหญ่มักจะติดตามและนั่นคือมาตรฐาน EMCAScript สตริงมาตรฐาน ECMAScript จะใช้การดำเนินการตามข้อกำหนด ISO 8601 ที่มีการแก้ไขน้อยที่สุด

นอกจากนี้ยังมีมาตรฐานที่สองที่กำหนดโดยIETFที่เบราว์เซอร์มีแนวโน้มที่จะปฏิบัติตามเช่นกันซึ่งเป็นคำจำกัดความของการประทับเวลาที่ทำใน RFC 2822 เอกสารจริงสามารถพบได้ในรายการอ้างอิงที่ด้านล่าง

จากนี้คุณสามารถคาดหวังฟังก์ชั่นพื้นฐาน แต่สิ่งที่ "ควร" จะไม่ได้เป็นสิ่งที่ "เป็น" โดยเนื้อแท้ ฉันจะลงลึกในเชิงลึกเล็กน้อยด้วยขั้นตอนนี้แม้ว่าจะมีเพียงสามคนเท่านั้นที่ตอบคำถาม (Scott, goofballLogic และ peller คือ) ซึ่งสำหรับฉันแล้วคนส่วนใหญ่ไม่รู้ว่าเกิดอะไรขึ้นเมื่อคุณ สร้างวัตถุวันที่


คำตอบยาว ๆ

เอกสารซึ่งแสดงรายการตัวระบุรูปแบบที่รองรับโดยวัตถุ Date () อยู่ที่ไหน


ในการตอบคำถามหรือโดยทั่วไปแล้วมองหาคำตอบสำหรับคำถามนี้คุณต้องรู้ว่าจาวาสคริปต์ไม่ใช่ภาษาแปลกใหม่ อันที่จริงแล้วมันเป็นการนำ ECMAScript มาใช้และปฏิบัติตามมาตรฐาน ECMAScript (แต่โน้ตจาวาสคริปต์ก็มีมาตรฐานเหล่านั้นไว้ล่วงหน้าด้วยก่อนหน้านั้นมาตรฐาน EMCAScript ถูกสร้างขึ้นจากการใช้งาน LiveScript / JavaScript ก่อนหน้านี้) มาตรฐาน ECMAScript ปัจจุบันคือ 5.1 (2011); ในเวลาที่คำถามถูกถามเดิม (มิถุนายน '09) มาตรฐานคือ 3 (4 ถูกทอดทิ้ง) แต่ 5 ได้รับการปล่อยตัวหลังจากโพสต์ในตอนท้ายของปี 2009 นี้ควรสรุปปัญหาหนึ่ง; มาตรฐานการใช้งานจาวาสคริปต์ที่อาจตามมาอาจไม่สะท้อนถึงสิ่งที่เกิดขึ้นจริงเพราะก) เป็นการดำเนินการตามมาตรฐานที่กำหนดข) การนำไปปฏิบัติของมาตรฐานทั้งหมดนั้นไม่เคร่งครัด

เป็นหลักเมื่อจัดการกับ javascript คุณกำลังจัดการกับตราสารอนุพันธ์ (จาวาสคริปต์เฉพาะกับเบราว์เซอร์) ของการใช้งาน (ตัวเองจาวาสคริปต์) ตัวอย่างเช่น V8 ของ Google ใช้ ECMAScript 5.0 แต่ JScript ของ Internet Explorer ไม่ได้พยายามที่จะปฏิบัติตามมาตรฐาน ECMAScript ใด ๆ แต่ Internet Explorer 9 นั้นสอดคล้องกับ ECMAScript 5.0

เมื่อมีการส่งผ่านอาร์กิวเมนต์เดียวไปยัง Date ใหม่ () อาร์กิวเมนต์นั้นจะใช้ฟังก์ชันต้นแบบนี้:

new Date(value)

เมื่ออาร์กิวเมนต์สองตัวหรือมากกว่าถูกส่งผ่านไปยัง Date ใหม่ () มันจะใช้ฟังก์ชันต้นแบบนี้:

new Date (year, month [, date [, hours [, minutes [, seconds [, ms ] ] ] ] ] )


ทั้งสองฟังก์ชั่นเหล่านี้ควรดูคุ้นเคย แต่สิ่งนี้ไม่ได้ตอบคำถามของคุณในทันทีและสิ่งที่ระบุว่าเป็น "รูปแบบวันที่" ที่ยอมรับได้นั้นต้องการคำอธิบายเพิ่มเติม เมื่อคุณส่งสตริงไปยัง Date ใหม่ () มันจะเรียกต้นแบบ (โปรดทราบว่าฉันกำลังใช้ต้นแบบต้นแบบอย่างหลวม ๆ รุ่นอาจเป็นฟังก์ชั่นของแต่ละบุคคลหรืออาจเป็นส่วนหนึ่งของคำสั่งเงื่อนไขในฟังก์ชั่นเดียว) สำหรับnew Date (value) ที่มีสตริงของคุณเป็นอาร์กิวเมนต์สำหรับพารามิเตอร์“ value” ฟังก์ชั่นนี้จะตรวจสอบก่อนว่ามันเป็นตัวเลขหรือสตริง เอกสารสำหรับฟังก์ชั่นนี้อยู่ที่นี่:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

จากนี้เราสามารถอนุมานได้ว่าเพื่อให้ได้การจัดรูปแบบสตริงที่อนุญาตสำหรับ Date ใหม่ (ค่า) เราต้องดูวิธี Date.parse (สตริง) เอกสารสำหรับวิธีนี้สามารถดูได้ที่นี่:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

และเราสามารถสรุปได้ว่าวันที่นั้นคาดว่าจะอยู่ในรูปแบบเพิ่มเติมของ ISO 8601 Extended ดังที่ระบุไว้ที่นี่:

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

อย่างไรก็ตามเราสามารถรับรู้จากประสบการณ์ที่วัตถุวันที่ของจาวาสคริปต์ยอมรับรูปแบบอื่น ๆ (บังคับใช้โดยการมีอยู่ของคำถามนี้ในตอนแรก) และสิ่งนี้ไม่เป็นไรเพราะ ECMAScript อนุญาตให้ใช้รูปแบบเฉพาะ อย่างไรก็ตามยังไม่สามารถตอบคำถามเกี่ยวกับเอกสารที่มีอยู่ในรูปแบบที่มีอยู่หรือไม่อนุญาตให้ใช้รูปแบบใด เราจะดูการใช้งานจาวาสคริปต์ของ Google, V8; โปรดทราบฉันไม่ได้แนะนำว่านี่คือเอ็นจิ้น javascript ที่“ ดีที่สุด” (เราจะกำหนด“ ดีที่สุด” หรือ“ ดี”) ได้อย่างไรและใครไม่สามารถสันนิษฐานได้ว่ารูปแบบที่อนุญาตใน V8 แสดงรูปแบบทั้งหมดที่มีในปัจจุบัน สมมติว่าพวกเขาทำตามความคาดหวังสมัยใหม่

Google V8, date.js, DateConstructor

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

ดูที่ฟังก์ชัน DateConstructor เราสามารถอนุมานได้ว่าเราต้องการค้นหาฟังก์ชัน DateParse อย่างไรก็ตามโปรดทราบว่า "ปี" ไม่ใช่ปีจริงและเป็นเพียงการอ้างอิงถึงพารามิเตอร์ "ปี"

Google V8, date.js, DateParse

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

สิ่งนี้เรียก% DateParseString ซึ่งจริงๆแล้วเป็นการอ้างอิงฟังก์ชันเวลาทำงานสำหรับฟังก์ชัน C ++ มันหมายถึงรหัสต่อไปนี้:

Google V8, runtime.cc,% DateParseString ของ Google

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

การเรียกใช้ฟังก์ชันที่เราเกี่ยวข้องในฟังก์ชันนี้ใช้สำหรับ DateParser :: Parse (); ละเว้นตรรกะโดยรอบการเรียกใช้ฟังก์ชันเหล่านี้เป็นเพียงการตรวจสอบเพื่อให้สอดคล้องกับประเภทการเข้ารหัส (ASCII และ UC16) DateParser :: การแยกวิเคราะห์ถูกกำหนดที่นี่:

Google V8, dateparser-inl.h, DateParser :: การแยกวิเคราะห์

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

นี่คือฟังก์ชันที่กำหนดรูปแบบที่ยอมรับได้จริง ๆ โดยพื้นฐานแล้วมันจะตรวจสอบมาตรฐาน EMCAScript 5.0 ISO 8601 และหากไม่ได้มาตรฐานก็จะพยายามสร้างวันที่ตามรูปแบบดั้งเดิม ประเด็นสำคัญบางประการจากความคิดเห็น:

  1. คำที่อยู่ต่อจากหมายเลขแรกที่ parser ไม่รู้จักจะถูกละเว้น
  2. ข้อความในวงเล็บถูกละเว้น
  3. ตัวเลขที่ไม่ได้ลงนามตามด้วย“:” ถูกตีความว่าเป็น“ องค์ประกอบเวลา”
  4. หมายเลขที่ไม่ได้ลงนามตามด้วย“.” ถูกตีความว่าเป็น "องค์ประกอบเวลา" และต้องตามด้วยมิลลิวินาที
  5. หมายเลขที่เซ็นชื่อแล้วตามด้วยชั่วโมงหรือชั่วโมงนาที (เช่น +5: 15 หรือ +0515) จะถูกตีความว่าเป็นเขตเวลา
  6. เมื่อประกาศชั่วโมงและนาทีคุณสามารถใช้“ hh: mm” หรือ“ hhmm”
  7. คำที่ระบุเขตเวลาจะถูกตีความเป็นเขตเวลา
  8. ตัวเลขอื่น ๆ ทั้งหมดจะตีความว่าเป็น“ องค์ประกอบของวันที่”
  9. คำทั้งหมดที่เริ่มต้นด้วยตัวเลขสามหลักแรกของเดือนจะถูกตีความเป็นเดือน
  10. คุณสามารถกำหนดนาทีและชั่วโมงด้วยกันในรูปแบบใดรูปแบบหนึ่งจากสองรูปแบบ:“ hh: mm” หรือ“ hhmm”
  11. ไม่อนุญาตให้ใช้สัญลักษณ์เช่น“ +”,“ -“ และไม่ตรงกัน”)” หลังจากประมวลผลหมายเลขแล้ว
  12. รายการที่ตรงกับหลายรูปแบบ (เช่น 1970-01-01) จะถูกประมวลผลเป็นสตริง EMCAScript 5.0 ISO 8601 ที่เป็นไปตามมาตรฐาน

ดังนั้นนี่น่าจะเพียงพอที่จะให้คุณมีความคิดพื้นฐานเกี่ยวกับสิ่งที่คาดหวังเมื่อมันผ่านการส่งสตริงไปยังวัตถุวันที่ คุณสามารถขยายเพิ่มเติมได้โดยดูที่สเปคต่อไปนี้ที่ Mozilla ชี้ไปที่ Mozilla Developer Network (ตรงตาม IETF RFC 2822 timestamps):

http://tools.ietf.org/html/rfc2822#page-14

เครือข่ายนักพัฒนาของ Microsoft กล่าวถึงมาตรฐานเพิ่มเติมสำหรับวัตถุวันที่: ECMA-402, ข้อกำหนดคุณลักษณะ ECMAScript Internationalization API ซึ่งเป็นส่วนเสริมของมาตรฐาน ECMAScript 5.1 (และอนาคต) สามารถพบได้ที่นี่:

http://www.ecma-international.org/ecma-402/1.0/

ไม่ว่าในกรณีใด ๆ สิ่งนี้ควรช่วยในการเน้นว่าไม่มี "เอกสาร" ที่เป็นตัวแทนของการใช้งานจาวาสคริปต์ทั้งหมด แต่ยังมีเอกสารเพียงพอที่จะทำให้รู้สึกถึงความสมเหตุสมผลของสตริงที่เป็นที่ยอมรับสำหรับวัตถุวันที่ ค่อนข้างคำถามที่โหลดเมื่อคุณคิดเกี่ยวกับมันใช่ไหม : P

อ้างอิง

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.3.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.4.2

http://www.ecma-international.org/ecma-262/5.1/#sec-15.9.1.15

http://tools.ietf.org/html/rfc2822#page-14

http://www.ecma-international.org/ecma-402/1.0/

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#141

https://code.google.com/p/v8/source/browse/trunk/src/date.js?r=18400#270

https://code.google.com/p/v8/source/browse/trunk/src/runtime.cc?r=18400#9559

https://code.google.com/p/v8/source/browse/trunk/src/dateparser-inl.h?r=18400#36

ทรัพยากร

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date

http://msdn.microsoft.com/en-us/library/ff743760(v=vs.94).aspx


92

ตรวจสอบให้แน่ใจว่าคุณชำระเงินDatejsเมื่อจัดการกับวันที่ใน JavaScript มันค่อนข้างน่าประทับใจและเอกสารที่ดีที่คุณสามารถดูในกรณีของฟังก์ชั่น toString

แก้ไข : Tyler Forsythe ชี้ให้เห็นว่า datejs นั้นล้าสมัย ฉันใช้มันในโครงการปัจจุบันของฉันและไม่มีปัญหาใด ๆ กับมันอย่างไรก็ตามคุณควรจะตระหนักถึงเรื่องนี้และพิจารณาทางเลือกอื่น ๆ


2
ฉันหาวิธีป้อนฟีด datej ด้วยมิลลิวินาทีไม่ได้เพื่อสร้างวันที่ ชอบ: var dateTime = new Date (); dateTime.setTime (มิลลิวินาที);
Arne Evertsson

14
25k? เพียงเพื่อวันที่? อุ๊ยตาย
เบ็นเลช

13
Datejs เป็นห้องสมุดที่ล้าสมัยที่ไม่ได้เห็นการพัฒนาที่แข็งขันใน ~ 5 ปี แหล่งที่มาของพวกเขาคือ Github และ Google Code และทั้งคู่มีวันที่อัปเดตล่าสุดของปี 2008 (เป็นปี 2013) เพื่อความมีสติของคุณไปกับ XDate หรือ Moment.js
Tyler Forsythe

3
@TylerForsythe ฉันได้เพิ่มคำใบ้ / คำเตือนเกี่ยวกับเรื่องนั้น
ทิมBüthe

2
lol สคริปต์วันที่ล้าสมัย ...
rtpHarry

69

คุณสามารถขยายDateวัตถุด้วยformatวิธีการใหม่ตามที่ระบุโดยmeizzด้านล่างเป็นรหัสที่ผู้เขียนให้ และนี่เป็นjsfiddle

Date.prototype.format = function(format) //author: meizz
{
  var o = {
    "M+" : this.getMonth()+1, //month
    "d+" : this.getDate(),    //day
    "h+" : this.getHours(),   //hour
    "m+" : this.getMinutes(), //minute
    "s+" : this.getSeconds(), //second
    "q+" : Math.floor((this.getMonth()+3)/3),  //quarter
    "S" : this.getMilliseconds() //millisecond
  }

  if(/(y+)/.test(format)) format=format.replace(RegExp.$1,
    (this.getFullYear()+"").substr(4 - RegExp.$1.length));
  for(var k in o)if(new RegExp("("+ k +")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length==1 ? o[k] :
        ("00"+ o[k]).substr((""+ o[k]).length));
  return format;
}

alert(new Date().format("yyyy-MM-dd"));
alert(new Date("january 12 2008 11:12:30").format("yyyy-MM-dd h:mm:ss"));

ปรับปรุงเป็นบิตสำหรับวัตถุประสงค์ของฉันเพื่อสนับสนุน AM / PM - ดูด้านล่าง
Michael Angstadt

@WHK แต่ฉันยังคงชอบช่วงเวลาอื่น ๆ อีกมากมาย: D
gongzhitaao

มีปัญหาเมื่อจับภาพเดือน: ใหม่วันที่ ((ใหม่วันที่ ()) รูปแบบ ('yyyy-MM-dd')) กลับมาพฤษภาคม แต่ตอนนี้มิถุนายน: - / ใครใช้เขตเวลาในสตริงแยก?
e-info128

1
@WHK อันนี้เป็นตัวแยกวิเคราะห์วันที่ดั้งเดิมมาก ในกรณีที่คุณไม่ต้องยุ่งกับวันที่มากเกินไป หากคุณต้องการรับมือกับรูปแบบวันที่ที่แตกต่างกันจริงๆฉันขอแนะนำห้องสมุดแบบสแตนด์อโลนเช่น momentjs : D
gongzhitaao

1
@WHK สำหรับconsole.log(new Date('2014-06-01')) -> Mayฉันคิดว่ามันเกี่ยวข้องกับเขตเวลา: D
gongzhitaao

37

ฟังก์ชั่นที่คุณอ้างถึงไม่ใช่ Javascript มาตรฐานไม่น่าจะพกพาข้ามเบราว์เซอร์ดังนั้นจึงไม่ใช่วิธีปฏิบัติที่ดี ECMAScript 3 ข้อมูลจำเพาะใบแยกและการส่งออกรูปแบบการทำงานขึ้นไปใช้ JavaScript ECMAScript 5เพิ่มชุดย่อยของการสนับสนุน ISO8601 ฉันเชื่อว่าฟังก์ชัน toString () ที่คุณพูดถึงเป็นนวัตกรรมในเบราว์เซอร์เดียว (Mozilla?)

ห้องสมุดหลายแห่งมีงานประจำให้พารามิเตอร์นี้บางคนมีการสนับสนุนการแปลหลายภาษา นอกจากนี้คุณยังสามารถตรวจสอบวิธีการในdojo.date.locale


5
การพยายามตอบคำถามจริงๆจะไม่ได้รับคะแนนโหวตมากมาย เพียงแค่เสนอชื่อห้องสมุดยอดนิยมและดูคะแนนของคุณทันที !!
RobG

30

ฉันสร้างตัวจัดรูปแบบที่ง่ายมากมันถูกตัด / n / วางได้ (อัปเดตด้วยเวอร์ชัน neater):

function DateFmt(fstr) {
  this.formatString = fstr

  var mthNames = ["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];
  var dayNames = ["Sun","Mon","Tue","Wed","Thu","Fri","Sat"];
  var zeroPad = function(number) {
     return ("0"+number).substr(-2,2);
  }

  var dateMarkers = {
    d:['getDate',function(v) { return zeroPad(v)}],
    m:['getMonth',function(v) { return zeroPad(v+1)}],
    n:['getMonth',function(v) { return mthNames[v]; }],
    w:['getDay',function(v) { return dayNames[v]; }],
    y:['getFullYear'],
    H:['getHours',function(v) { return zeroPad(v)}],
    M:['getMinutes',function(v) { return zeroPad(v)}],
    S:['getSeconds',function(v) { return zeroPad(v)}],
    i:['toISOString']
  };

  this.format = function(date) {
    var dateTxt = this.formatString.replace(/%(.)/g, function(m, p) {
      var rv = date[(dateMarkers[p])[0]]()

      if ( dateMarkers[p][1] != null ) rv = dateMarkers[p][1](rv)

      return rv

    });

    return dateTxt
  }

}

fmt = new DateFmt("%w %d:%n:%y - %H:%M:%S  %i")
v = fmt.format(new Date())

http://snipplr.com/view/66968.82825/


4
ฉันชอบชั้นเรียนนี้ แต่คิดว่าควรจะเป็นชั้นเรียน "คงที่" ไม่จำเป็นต้องยกตัวอย่างมากกว่าหนึ่งครั้ง (ไม่จำเป็นต้องใช้new DateFmt())
Cheeso

1
Cheeso: ถ้าฉันต้องการจัดรูปแบบ 10 วันที่แตกต่างกันในหน้า 3 วิธีที่แตกต่างกันในแต่ละวิธี? ในกรณีนี้จะมีประโยชน์หากมีอินสแตนซ์สามตัวของตัวจัดรูปแบบนี้ นั่นคือการใช้งานที่ถูกต้องสมบูรณ์แบบซึ่งสิ่งนี้จะดักคอ OP ออกแบบสิ่งนี้อย่างถูกต้อง นอกจากนี้การระบุรูปแบบ ณ เวลาการก่อสร้างจะบันทึกการทำสำเนารหัสของการระบุรูปแบบทุกครั้งที่คุณต้องการฟอร์แมตด้วยวิธีการบางอย่าง
hsanders

29

กรอบฟรี จำกัด แต่เบา

var d = (new Date()+'').split(' ');
// ["Tue", "Sep", "03", "2013", "21:54:52", "GMT-0500", "(Central", "Daylight", "Time)"]

[d[3], d[1], d[2], d[4]].join(' ');
// "2013 Sep 03 21:58:03"

เบราว์เซอร์ข้ามนี้หรือไม่ และสถานที่ข้าม?
Iftah

ใช่. แสดงเวลาในเขตเวลาท้องถิ่นของคุณ (ผู้ใช้เบราว์เซอร์)
John Williams

22

DateJS นั้นมีคุณสมบัติครบถ้วน แต่ฉันขอแนะนำLib ง่ายกว่านี้มาก (รูปแบบวันที่ JavaScript)ซึ่งฉันชอบเพียงเพราะมันมีเพียง 120 บรรทัดหรือมากกว่านั้น


การอ้างอิงซอร์สโค้ดในบทความที่เชื่อมโยงนั้นตายไปแล้ว แต่โชคดีที่มีคนใส่ไว้ใน Github: github.com/rvanbaalen/date-steroids
Geert

18

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

/**
* Format date as a string
* @param date - a date object (usually "new Date();")
* @param format - a string format, eg. "DD-MM-YYYY"
*/
function dateFormat(date, format) {
    // Calculate date parts and replace instances in format string accordingly
    format = format.replace("DD", (date.getDate() < 10 ? '0' : '') + date.getDate()); // Pad with '0' if needed
    format = format.replace("MM", (date.getMonth() < 9 ? '0' : '') + (date.getMonth() + 1)); // Months are zero-based
    format = format.replace("YYYY", date.getFullYear());
    return format;
}

ตัวอย่างการใช้งาน:

console.log("The date is: " + dateFormat(new Date(), "DD/MM/YYYY"));

2
การดำเนินการแทนที่ไม่มีประสิทธิภาพจริงๆดังนั้นจึงเป็นการป้องกันที่ดีกว่า
mrzmyr

ถ้าฉันเขียนจะเกิดอะไรขึ้น console.log ("วันที่คือ:" + dateFormat (วันที่ใหม่ (), "DD / MM / YY"));
hakan

1
จะพิมพ์ข้อความ "วันที่คือ: 12/11 / YY" เพราะข้างต้นไม่ได้จัดการวันที่ 2 หลัก format = format.replace("YY", (""+date.getFullYear()).substring(2));หากคุณจำเป็นนี้คุณสามารถเพิ่มต่อไปนี้ทันทีก่อนที่คำสั่งกลับไปนี้: สิ่งนี้กำลังเริ่มน่าเกลียด - คุณอาจต้องการลงเส้นทาง RegEx หรือคล้ายกันแทน
Ollie Bennett

1
@mrzmyr คุณคิดว่าวันที่จัดรูปแบบจะเป็นคอขวดของประสิทธิภาพหรือไม่? มาเลย
doug65536

11

นี่คือฟังก์ชั่นที่ฉันใช้บ่อย ผลลัพธ์คือ yyyy-mm-dd hh: mm: ss.nnn

function date_and_time() {
    var date = new Date();
    //zero-pad a single zero if needed
    var zp = function (val){
        return (val <= 9 ? '0' + val : '' + val);
    }

    //zero-pad up to two zeroes if needed
    var zp2 = function(val){
        return val <= 99? (val <=9? '00' + val : '0' + val) : ('' + val ) ;
    }

    var d = date.getDate();
    var m = date.getMonth() + 1;
    var y = date.getFullYear();
    var h = date.getHours();
    var min = date.getMinutes();
    var s = date.getSeconds();
    var ms = date.getMilliseconds();
    return '' + y + '-' + zp(m) + '-' + zp(d) + ' ' + zp(h) + ':' + zp(min) + ':' + zp(s) + '.' + zp2(ms);
}

1
คำตอบที่ดี แต่ฉันคิดว่าคุณควรเปลี่ยนฟังก์ชั่น zp2 เป็น: var zp2 = function (val) {return val <= 9? '00' + val: (val <= 99? '0' + val: '' + val); }
Eric Wang

1
มีข้อยกเว้นเมื่อค่าของส่วน ms เป็น 0 จะไม่เหมือนกันในฟังก์ชันของคุณผลลัพธ์คือ '00' แต่ไม่ใช่ '000'
Eric Wang

9

คุณอาจพบว่ามีประโยชน์ในการแก้ไขวัตถุวันที่ซึ่งมีขนาดเล็กกว่าห้องสมุดใด ๆ และสามารถขยายได้อย่างง่ายดายเพื่อรองรับรูปแบบที่แตกต่างกัน:

บันทึก:

  • มันใช้Object.keys ()ซึ่งไม่ได้กำหนดไว้ในเบราว์เซอร์รุ่นเก่าดังนั้นคุณอาจต้องใช้โพลีฟิลล์จากลิงก์ที่กำหนด

รหัส

Date.prototype.format = function(format) {
    // set default format if function argument not provided
    format = format || 'YYYY-MM-DD hh:mm';

    var zeropad = function(number, length) {
            number = number.toString();
            length = length || 2;
            while(number.length < length)
                number = '0' + number;
            return number;
        },
        // here you can define your formats
        formats = {
            YYYY: this.getFullYear(),
            MM: zeropad(this.getMonth() + 1),
            DD: zeropad(this.getDate()),
            hh: zeropad(this.getHours()),
            mm: zeropad(this.getMinutes())
        },
        pattern = '(' + Object.keys(formats).join(')|(') + ')';

    return format.replace(new RegExp(pattern, 'g'), function(match) {
        return formats[match];
    });
};

ใช้

var now = new Date;
console.log(now.format());
// outputs: 2015-02-09 11:47
var yesterday = new Date('2015-02-08');
console.log(yesterday.format('hh:mm YYYY/MM/DD'));
// outputs: 00:00 2015/02/08

8

เพียงเพื่อดำเนินการต่อคำตอบที่มั่นคงของ gongzhitaao - นี้จัดการ AM / PM

 Date.prototype.format = function (format) //author: meizz
{
    var hours = this.getHours();
    var ttime = "AM";
    if(format.indexOf("t") > -1 && hours > 12)
    {
        hours = hours - 12;
        ttime = "PM";
     }

var o = {
    "M+": this.getMonth() + 1, //month
    "d+": this.getDate(),    //day
    "h+": hours,   //hour
    "m+": this.getMinutes(), //minute
    "s+": this.getSeconds(), //second
    "q+": Math.floor((this.getMonth() + 3) / 3),  //quarter
    "S": this.getMilliseconds(), //millisecond,
    "t+": ttime
}

if (/(y+)/.test(format)) format = format.replace(RegExp.$1,
  (this.getFullYear() + "").substr(4 - RegExp.$1.length));
for (var k in o) if (new RegExp("(" + k + ")").test(format))
    format = format.replace(RegExp.$1,
      RegExp.$1.length == 1 ? o[k] :
        ("00" + o[k]).substr(("" + o[k]).length));
return format;
}

ทางออกที่ดีมาก! var a = new Date (); a.format ( 'YYYY-MM-d'); // Return 2013-08-16
Adrian Maire

this.getMonth (); ล้มเหลวใน iOS
N20084753

7

ฉันไม่สามารถหาเอกสารที่ชัดเจนเกี่ยวกับรูปแบบวันที่ที่ถูกต้องดังนั้นฉันจึงเขียนการทดสอบของตัวเองเพื่อดูว่ารองรับอะไรบ้างในเบราว์เซอร์ต่างๆ

http://blarg.co.uk/blog/javascript-date-formats

ผลลัพธ์ของฉันสรุปว่ารูปแบบต่อไปนี้ใช้ได้ในเบราว์เซอร์ทั้งหมดที่ฉันทดสอบ (ตัวอย่างใช้วันที่ "9 สิงหาคม 2556"):

[เต็มปี] / [เดือน] / [หมายเลขวันที่] - เดือนสามารถเป็นตัวเลขที่มีหรือไม่มีศูนย์นำหน้าหรือชื่อเดือนในรูปแบบสั้นหรือยาวและหมายเลขวันที่สามารถมีหรือไม่มีศูนย์นำหน้าได้

  • 2013/08/09
  • 2013/08/09
  • 2013/08/09
  • 2013/08/09
  • 2013 / สิงหาคม / 09
  • 2013 / สิงหาคม / 9
  • 2013 / Aug / 09
  • 2013 / Aug / 9

[เดือน] / [ปีเต็ม] / [หมายเลขวันที่] - เดือนสามารถเป็นตัวเลขที่มีหรือไม่มีศูนย์นำหน้าหรือชื่อเดือนในรูปแบบสั้นหรือยาวและหมายเลขวันที่สามารถมีหรือไม่มีศูนย์นำหน้าได้

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • สิงหาคม / 2013/09
  • สิงหาคม / 2013/9
  • Aug / 2013/09
  • Aug / 2013/9

การรวมกันของ [ปีเต็ม], [ชื่อเดือน] และ [หมายเลขวันที่] คั่นด้วยช่องว่าง - ชื่อเดือนสามารถอยู่ในรูปแบบสั้นหรือยาวและหมายเลขวันที่สามารถมีหรือไม่มีศูนย์นำ

  • 2013 สิงหาคม 09
  • สิงหาคม 2013 09
  • 9 สิงหาคม 2556
  • 2013 ส.ค. 52
  • 9 สิงหาคม 2013
  • 2013 9 ส.ค.
  • ฯลฯ ...

ใช้ได้กับ "เบราว์เซอร์สมัยใหม่" (หรือกล่าวอีกนัยหนึ่งว่าเบราว์เซอร์ทั้งหมดยกเว้น IE9 และด้านล่าง)

[ปีเต็ม] - [หมายเลขเดือน] - [หมายเลขวันที่] - จำนวนเดือนและวันที่จะต้องมีศูนย์นำหน้า (นี่คือรูปแบบที่MySQL Dateใช้ประเภท )

  • 2013/08/09

การใช้ชื่อเดือน:
น่าสนใจเมื่อใช้ชื่อเดือนฉันค้นพบว่ามีเพียง 3 ตัวอักษรแรกของชื่อเดือนเท่านั้นที่เคยใช้ดังนั้นสิ่งต่อไปนี้ทั้งหมดจึงใช้ได้อย่างสมบูรณ์:

new Date('9 August 2013');
new Date('9 Aug 2013');
new Date('9 Augu 2013');
new Date('9 Augustagfsdgsd 2013');

6

การจัดรูปแบบและการแยกวิเคราะห์วันที่โดยเฉพาะใน JavaScript อาจทำให้ปวดหัว ไม่ใช่ทุกเบราว์เซอร์ที่จัดการกับวันที่ในลักษณะเดียวกัน ดังนั้นในขณะที่มันมีประโยชน์ที่จะรู้วิธีการพื้นฐานมันมีประโยชน์มากกว่าที่จะใช้ห้องสมุดผู้ช่วย

ห้องสมุด XDate JavaScriptโดยอดัมชอว์ได้รับรอบตั้งแต่ช่วงกลางปี 2011 และยังอยู่ภายใต้การพัฒนางาน มันมีเอกสารที่ยอดเยี่ยม, API ที่ยอดเยี่ยม, การจัดรูปแบบ, พยายามที่จะยังคงเข้ากันได้ย้อนหลังและแม้กระทั่งสนับสนุนสตริงที่แปลเป็นภาษาท้องถิ่น

ลิงก์ไปยังการเปลี่ยนสตริงสถานที่: https://gist.github.com/1221376


6

รหัสตัวอย่าง:

var d = new Date();
var time = d.toISOString().replace(/.*?T(\d+:\d+:\d+).*/, "$1");

เอาท์พุท:

"13:45:20"


2
มูลค่า noting ด้วย toISOString (); มันส่งออก UTC ดังนั้นถ้าnew Date();// = Fri Nov 22 2013 17:48:22 GMT+0100ผลลัพธ์ที่มีโค้ดด้านบนจะเป็นเช่นนั้น"16:48:22"
Tewr

6

ไลบรารีsugar.jsมีฟังก์ชันที่ยอดเยี่ยมสำหรับการทำงานกับวันที่ใน JavaScript และมันก็เป็นอย่างดีเอกสาร

Sugar ให้ความรักในชั้นเรียนมากขึ้นด้วยวิธี Date.create ซึ่งสามารถเข้าใจวันที่ในรูปแบบใดก็ได้ใน 15 ภาษาหลักรวมถึงรูปแบบสัมพัทธ์เช่น "1 ชั่วโมงก่อน" วันที่สามารถส่งออกในรูปแบบหรือภาษาใด ๆ โดยใช้ไวยากรณ์ที่เข้าใจง่ายพร้อมทางลัดไปยังรูปแบบวันที่ที่ใช้กันทั่วไป การเปรียบเทียบวันที่ซับซ้อนสามารถทำได้ด้วยวิธีการต่าง ๆ เช่นซึ่งเข้าใจรูปแบบใด ๆ

ตัวอย่างบางส่วน:

Date.create('July 4, 1776')  -> July 4, 1776
Date.create(-446806800000)   -> November 5, 1955
Date.create(1776, 6, 4)      -> July 4, 1776
Date.create('1776年07月04日', 'ja') -> July 4, 1776
Date.utc.create('July 4, 1776', 'en')  -> July 4, 1776

Date.create().format('{Weekday} {d} {Month}, {yyyy}')    -> Monday July 4, 2003
Date.create().format('{hh}:{mm}')                        -> 15:57
Date.create().format('{12hr}:{mm}{tt}')                  -> 3:57pm
Date.create().format(Date.ISO8601_DATETIME)              -> 2011-07-05 12:24:55.528Z

Date.create().is('the 7th of June') -> false
Date.create().addMonths(2); ->"Sunday, June 15, 2014 13:39"

4

เบราว์เซอร์ทั้งหมด

วิธีที่น่าเชื่อถือที่สุดในการจัดรูปแบบวันที่ด้วยรูปแบบต้นฉบับที่คุณใช้คือการใช้ขั้นตอนต่อไปนี้:

  1. ใช้new Date()สำหรับสร้างDateวัตถุ
  2. ใช้.getDate(), .getMonth()และ.getFullYear()ที่จะได้รับตามลำดับวันเดือนและปี
  3. วางชิ้นส่วนเข้าด้วยกันตามรูปแบบเป้าหมายของคุณ

ตัวอย่าง:

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    var date = new Date(input);
    return [
       ("0" + date.getDate()).slice(-2),
       ("0" + (date.getMonth()+1)).slice(-2),
       date.getFullYear()
    ].join('/');
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(ดูซอนี้ด้วย )


เบราว์เซอร์สมัยใหม่เท่านั้น

คุณยังสามารถใช้.toLocaleDateStringวิธีการในตัวเพื่อทำการจัดรูปแบบสำหรับคุณ คุณเพียงแค่ต้องผ่านสถานที่ที่เหมาะสมและตัวเลือกเพื่อให้ตรงกับรูปแบบที่ถูกต้องซึ่งน่าเสียดายที่เบราว์เซอร์สมัยใหม่(*)รองรับเท่านั้น:

var date = '2015-11-09T10:46:15.097Z';

function format(input) {
    return new Date(input).toLocaleDateString('en-GB', {
        year: 'numeric',
        month: '2-digit',
        day: '2-digit'
    });
}

document.body.innerHTML = format(date); // OUTPUT : 09/11/2015

(ดูซอนี้ด้วย )


(*) ตาม MDN , "เบราว์เซอร์ที่ทันสมัย" หมายถึง Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ และ Safari ทุกค่ำคืน


3

แค่อีกทางเลือกหนึ่งที่ฉันเขียน:

DP_DateExtensions Library

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

รองรับการจัดรูปแบบวันที่ / เวลา, คณิตศาสตร์วันที่ (เพิ่ม / ลบส่วนของวันที่), เปรียบเทียบวันที่, แยกวันที่ ฯลฯ มันเปิดแหล่งที่มาอย่างอิสระ

ไม่มีเหตุผลที่จะต้องพิจารณาหากคุณใช้เฟรมเวิร์กอยู่แล้ว (มันมีความสามารถทั้งหมด) แต่ถ้าคุณเพียงแค่ต้องเพิ่มการจัดการวันที่อย่างรวดเร็วให้กับโครงการ


1
ฉันเดาว่า URL ใหม่นั้นจะถูกลดระดับลงโดย /
javascript

2

หากคุณต้องการที่จะแสดงเพียงครั้งเดียวด้วยตัวเลขสองหลักนี้อาจช่วยให้คุณ:

var now = new Date();
var cHour = now.getHours();
var cMinuts = now.getMinutes();
var cSeconds = now.getSeconds();

var outStr = (cHour <= 0 ? ('0' + cHour) : cHour) + ':' + (cMinuts <= 9 ? ('0' + cMinuts) : cMinuts) + ':' + (cSeconds <= 9 ? '0' + cSeconds : cSeconds);


1

JsSimpleDateFormatเป็นห้องสมุดที่สามารถจัดรูปแบบวัตถุวันที่และแยกสตริงที่จัดรูปแบบกลับไปเป็นวัตถุวันที่ มันใช้รูปแบบ Java (ชั้น SimpleDateFormat) ชื่อของเดือนและวันสามารถแปลเป็

ตัวอย่าง:

var sdf = new JsSimpleDateFormat("EEEE, MMMM dd, yyyy");
var formattedString = sdf.format(new Date());
var dateObject = sdf.parse("Monday, June 29, 2009");

1

คำตอบคือ "ไม่มีที่ไหนเลย" ตั้งแต่การจัดรูปแบบวันที่เป็นฟังก์ชั่นกรรมสิทธิ์ ฉันไม่คิดว่าฟังก์ชั่น toString มีวัตถุประสงค์เพื่อให้สอดคล้องกับรูปแบบเฉพาะ เช่นในข้อมูลจำเพาะ ECMAScript 5.1 ( http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf , 2/8/2013, หน้า 173) ฟังก์ชั่นtoStringมีการบันทึกไว้ดังนี้ :

"เนื้อหาของสตริงขึ้นอยู่กับการนำไปใช้งาน"

ฟังก์ชั่นเช่นตัวอย่างด้านล่างนี้สามารถใช้ในการจัดรูปแบบให้สำเร็จได้อย่างง่ายดาย

function pad(toPad, padWith) {
    return (String(padWith) + String(toPad)).slice(-1 * padWith.length);
}

function dateAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;
    return toFormat.getFullYear() + "-" + pad(toFormat.getMonth() + 1, "00") + "-" + pad(toFormat.getDate(), "00");
}

function timeAsInputValue(toFormat) {
    if(!(toFormat instanceof Date)) return null;        
    return pad(toFormat.getHours(), "00") + ":" + pad(toFormat.getMinutes(), "00") + ":" + pad(toFormat.getSeconds(), "00");
}

1

หากคุณไม่ต้องการฟีเจอร์ทั้งหมดที่ไลบรารี่อย่างMoment.jsมีให้คุณสามารถใช้พอร์ตstrftimeของฉันได้ มันมีน้ำหนักเบา (1.35 KB เทียบกับ 57.9 KB ลดขนาดลงเมื่อเทียบกับ Moment.js 2.15.0) strftime()และให้มากที่สุดของการทำงานของ

/* Port of strftime(). Compatibility notes:
 *
 * %c - formatted string is slightly different
 * %D - not implemented (use "%m/%d/%y" or "%d/%m/%y")
 * %e - space is not added
 * %E - not implemented
 * %h - not implemented (use "%b")
 * %k - space is not added
 * %n - not implemented (use "\n")
 * %O - not implemented
 * %r - not implemented (use "%I:%M:%S %p")
 * %R - not implemented (use "%H:%M")
 * %t - not implemented (use "\t")
 * %T - not implemented (use "%H:%M:%S")
 * %U - not implemented
 * %W - not implemented
 * %+ - not implemented
 * %% - not implemented (use "%")
 *
 * strftime() reference:
 * http://man7.org/linux/man-pages/man3/strftime.3.html
 *
 * Day of year (%j) code based on Joe Orost's answer:
 * http://stackoverflow.com/questions/8619879/javascript-calculate-the-day-of-the-year-1-366
 *
 * Week number (%V) code based on Taco van den Broek's prototype:
 * http://techblog.procurios.nl/k/news/view/33796/14863/calculate-iso-8601-week-and-year-in-javascript.html
 */
function strftime(sFormat, date) {
  if (!(date instanceof Date)) date = new Date();
  var nDay = date.getDay(),
    nDate = date.getDate(),
    nMonth = date.getMonth(),
    nYear = date.getFullYear(),
    nHour = date.getHours(),
    aDays = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'],
    aMonths = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December'],
    aDayCount = [0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334],
    isLeapYear = function() {
      if (nYear&3!==0) return false;
      return nYear%100!==0 || year%400===0;
    },
    getThursday = function() {
      var target = new Date(date);
      target.setDate(nDate - ((nDay+6)%7) + 3);
      return target;
    },
    zeroPad = function(nNum, nPad) {
      return ('' + (Math.pow(10, nPad) + nNum)).slice(1);
    };
  return sFormat.replace(/%[a-z]/gi, function(sMatch) {
    return {
      '%a': aDays[nDay].slice(0,3),
      '%A': aDays[nDay],
      '%b': aMonths[nMonth].slice(0,3),
      '%B': aMonths[nMonth],
      '%c': date.toUTCString(),
      '%C': Math.floor(nYear/100),
      '%d': zeroPad(nDate, 2),
      '%e': nDate,
      '%F': date.toISOString().slice(0,10),
      '%G': getThursday().getFullYear(),
      '%g': ('' + getThursday().getFullYear()).slice(2),
      '%H': zeroPad(nHour, 2),
      '%I': zeroPad((nHour+11)%12 + 1, 2),
      '%j': zeroPad(aDayCount[nMonth] + nDate + ((nMonth>1 && isLeapYear()) ? 1 : 0), 3),
      '%k': '' + nHour,
      '%l': (nHour+11)%12 + 1,
      '%m': zeroPad(nMonth + 1, 2),
      '%M': zeroPad(date.getMinutes(), 2),
      '%p': (nHour<12) ? 'AM' : 'PM',
      '%P': (nHour<12) ? 'am' : 'pm',
      '%s': Math.round(date.getTime()/1000),
      '%S': zeroPad(date.getSeconds(), 2),
      '%u': nDay || 7,
      '%V': (function() {
              var target = getThursday(),
                n1stThu = target.valueOf();
              target.setMonth(0, 1);
              var nJan1 = target.getDay();
              if (nJan1!==4) target.setMonth(0, 1 + ((4-nJan1)+7)%7);
              return zeroPad(1 + Math.ceil((n1stThu-target)/604800000), 2);
            })(),
      '%w': '' + nDay,
      '%x': date.toLocaleDateString(),
      '%X': date.toLocaleTimeString(),
      '%y': ('' + nYear).slice(2),
      '%Y': nYear,
      '%z': date.toTimeString().replace(/.+GMT([+-]\d+).+/, '$1'),
      '%Z': date.toTimeString().replace(/.+\((.+?)\)$/, '$1')
    }[sMatch] || sMatch;
  });
}

ตัวอย่างการใช้งาน:

strftime('%F'); // Returns "2016-09-15"
strftime('%A, %B %e, %Y'); // Returns "Thursday, September 15, 2016"

// You can optionally pass it a Date object...

strftime('%x %X', new Date('1/1/2016')); // Returns "1/1/2016 12:00:00 AM"

รหัสล่าสุดมีให้ที่นี่: https://github.com/thdoan/strftime


0

วิธีที่ถูกต้องในการจัดรูปแบบวันที่ที่จะส่งคืน "2012-12-29" อยู่ที่สคริปต์จากรูปแบบวันที่ของ JavaScript :

var d1 = new Date();
return d1.format("dd-m-yy");

รหัสนี้ใช้ไม่ได้:

var d1 = new Date();
d1.toString('yyyy-MM-dd');      

3
คุณต้องสคริปต์ที่เชื่อมโยง "รูปแบบวันที่ JavaScript" เชื่อมโยงด้านบน
เซบาสเตียน Viereck

0

ส่วนตัวเพราะฉันใช้ทั้ง PHP และ jQuery / javascript ในขนาดเท่ากันฉันจึงใช้ฟังก์ชั่นวันที่จาก php.js http://phpjs.org/functions/date/

การใช้ไลบรารีที่ใช้สตริงรูปแบบเดียวกับที่ฉันรู้อยู่แล้วนั้นง่ายกว่าสำหรับฉันและคู่มือที่มีความเป็นไปได้ของสตริงรูปแบบทั้งหมดสำหรับฟังก์ชั่นวันที่นั้นเป็นหลักสูตรออนไลน์ที่ php.net

คุณเพียงรวมไฟล์ date.js ใน HTML ของคุณโดยใช้วิธีที่คุณต้องการจากนั้นเรียกมันว่า:

var d1=new Date();
var datestring = date('Y-m-d', d1.valueOf()/1000);

คุณสามารถใช้ d1.getTime () แทน valueOf () ถ้าคุณต้องการพวกเขาทำสิ่งเดียวกัน

การหารด้วย 1000 ของการประทับเวลา javascript นั้นเป็นเพราะการประทับเวลาของ javascript นั้นอยู่ในหน่วยมิลลิวินาที แต่การประทับเวลาของ PHP อยู่ในไม่กี่วินาที


0

เฟรมเวิร์กจำนวนมาก (ที่คุณอาจใช้อยู่แล้ว) มีการจัดรูปแบบวันที่ซึ่งคุณอาจไม่ทราบ jQueryUI ได้ถูกกล่าวถึงแล้ว แต่กรอบงานอื่น ๆ เช่นKendo UI (โลกาภิวัตน์) , Yahoo UI (Util)และAngularJSก็มีเช่นกัน

// 11/6/2000
kendo.toString(new Date(value), "d")

// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.