Tôi có thể tìm tài liệu về định dạng ngày trong JavaScript ở đâu? [đóng cửa]


1398

Tôi nhận thấy rằng new Date()chức năng của JavaScript rất thông minh trong việc chấp nhận ngày ở một số định dạng.

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

Tôi không thể tìm thấy tài liệu ở bất cứ đâu hiển thị tất cả các định dạng chuỗi hợp lệ trong khi gọi new Date()hàm.

Điều này là để chuyển đổi một chuỗi thành một ngày. Nếu chúng ta nhìn vào phía đối diện, nghĩa là chuyển đổi một đối tượng ngày thành một chuỗi, cho đến bây giờ tôi có ấn tượng rằng JavaScript không có API tích hợp để định dạng một đối tượng ngày thành một chuỗi.

Lưu ý của biên tập viên: Cách tiếp cận sau đây là nỗ lực của người hỏi đã hoạt động trên một trình duyệt cụ thể nhưng không hoạt động chung; xem câu trả lời trên trang này để xem một số giải pháp thực tế.

Hôm nay, tôi đã chơi với toString()phương thức trên đối tượng ngày và thật ngạc nhiên khi nó phục vụ mục đích định dạng ngày thành chuỗi.

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

Ngoài ra ở đây tôi không thể tìm thấy bất kỳ tài liệu nào về tất cả các cách chúng ta có thể định dạng đối tượng ngày thành một chuỗi.

Tài liệu liệt kê các định dạng định dạng được Date()đối tượng hỗ trợ ở đâu?


165
ví dụ của bạn không thực sự hoạt động theo cách bạn nghĩ: jsfiddle.net/edelman/WDNVk/1
Jason

27
Xin lỗi, truyền các chuỗi định dạng trong toString hoạt động trong .NET và nó có thể hoạt động trong Java, nhưng như Jason chỉ ra, điều này không thực sự hoạt động trong Javascript.
Joshua Carmody

12
Mọi người nhớ - câu hỏi, cho dù kinh điển như thế nào, cần phải vẫn là câu hỏi . Vui lòng kiềm chế mọi chỉnh sửa biến câu hỏi này thành câu trả lời, thay vào đó hãy tinh chỉnh và duy trì câu trả lời . Cảm ơn :)
Tim Post

1
Tôi đã sử dụng mã trong liên kết này msdn.microsoft.com/en-us/l Library / i / ff743760 (v = vs.94) .aspx - (date.toLocaleDateString ("en-US"));
Khaled Annajar

Nếu khách truy cập tương lai vào trang này bị nhầm lẫn bởi hầu hết các câu trả lời liên quan đến câu hỏi, tôi khuyên bạn nên đọc bản sửa đổi câu hỏi , đặc biệt (nếu khác với ở trên) bản sửa đổi 15 @ Eric Muyser - Tôi đã nhầm lẫn vì thiếu tính không hợp lệ Ngày sử dụng # toString.
dùng66001

Câu trả lời:


1063

Tôi yêu 10 cách định dạng ngày giờ bằng cách sử dụng JavaScriptlàm việc với ngày .

Về cơ bản, bạn có ba phương thức và bạn phải kết hợp các chuỗi cho chính mình:

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

Thí dụ:

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
Cả hai trang web này đều có giấy phép hạn chế. Vì vậy, nếu bạn sử dụng mã (mà không được phép), bạn sẽ vi phạm. Momentjs ( stackoverflow.com/a/10119138/278976 ) có vẻ như là một lựa chọn tốt hơn và là giấy phép của MIT.
Homer6

4
@peller Câu trả lời này trả lời câu hỏi "Làm cách nào để định dạng ngày trong javascript?" đó là hiệu quả của tiêu đề của câu hỏi. Trong cơ thể của câu hỏi, anh ta khá sai lầm. Và, theo quan điểm của bạn, câu trả lời này không nói về định dạng chuỗi bằng các thư viện không chuẩn hoặc không được đề cập ngẫu nhiên. Nhưng phần đó của câu hỏi đã được hỏi không chính xác, vì nhận xét số 1 về câu hỏi chỉ ra. Vì vậy, điều này trả lời câu hỏi thực sự, nhưng không phải là chuỗi định dạng không thực sự tồn tại.
McKay

3
@McKay; đó không phải là câu hỏi Tôi nghĩ rằng bạn đang hiểu sai những gì người bán hàng đang hỏi hoặc bị che giấu trong lý luận của bạn.
codeinthehole

10
@codeinthehole "Định dạng ngày trong Javascript" là câu hỏi. "cho đến bây giờ tôi đã có ấn tượng rằng JavaScript không có API tích hợp để định dạng một đối tượng ngày thành một chuỗi." nhưng sau đó nói về hành vi, mà tôi tin rằng anh ấy nghĩ là có nguồn gốc trong javascript. Không biết thư viện nào anh ấy nhầm lẫn tham khảo, tôi nghĩ rằng dự đoán tốt nhất là anh ấy đang đặt câu hỏi, "Làm thế nào để tôi định dạng ngày trong javascript?" và tôi không nghĩ rằng tôi đang có những bước nhảy vọt.
McKay

5
MM có nghĩa là 01-12, không phải 1-12: 2013-04-17 => OK 2013-4-17 => BAD
Adrian Maire

678

Khoảnh khắc

Nó là một thư viện ngày (nhẹ) * JavaScript để phân tích cú pháp, thao tác và định dạng ngày.

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"

(*) có nghĩa nhẹ 9,3KB được rút gọn + được nén trong thiết lập nhỏ nhất có thể (feb 2014)


7
Điều này cũng cung cấp một mẫu trang trí xung quanh đối tượng Date thay vì khỉ đấm vào đối tượng cốt lõi, do đó bạn sẽ ít gặp phải xung đột trên đường.
Gabe Martin-Dempesy

120
Hãy ngừng lạm dụng từ "nhẹ". Thậm chí 5kb là vô cùng lớn đối với chức năng như vậy và tính đến ngày hôm nay, kích thước đó đã tăng lên 19kb.
dùng123444555621

27
@ Pumbaa80 Tôi không đồng ý rằng "Thậm chí 5kb là vô cùng lớn đối với chức năng như vậy". Bạn đã xem các tài liệu? Nó là một thư viện cực kỳ hữu ích để xử lý các ngày trong JS. Tôi hiểu rằng việc có một thư viện lớn hơn một vài KB cho một lần sử dụng một định dạng cơ bản như "D / M / Y" có thể hơi quá mức tuy nhiên sự khác biệt của một vài KB đang trở nên không đáng kể để thư viện cung cấp dễ dàng . Mã duy trì là một điều tốt cho lợi ích của một vài KB. Nếu nó được giảm thiểu 100KB, tuy nhiên tôi sẽ đồng ý.
Turnerj

15
@Tumerj lập luận rằng nó hữu ích không có gì để giải quyết mối quan tâm của việc nhẹ. Hai người không liên quan.
JoshJordan

9
Bạn không thể làm cho một chiếc máy bay phản lực nhẹ hơn bằng cách loại bỏ động cơ bởi vì nó sẽ trở thành một chiếc tàu lượn chứ không phải là một chiếc máy bay phản lực. Nhẹ có nghĩa là một cái gì đó chỉ có chức năng cần thiết để thực hiện một chức năng được chỉ định. Ergo, đây là một giải pháp nhẹ.
Bon

425

Nếu bạn đã sử dụng jQuery UI trong dự án của mình, bạn có thể sử dụng phương thức datepicker tích hợp để định dạng đối tượng ngày của bạn:

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

Tuy nhiên, datepicker chỉ định dạng ngày và không thể định dạng thời gian.

Có một cái nhìn datepicker UI UI , các ví dụ.


Làm thế nào để bảo nó sử dụng giờ địa phương hoặc Zulu?
Ustaman Sangat

7
Tôi thích sử dụng giải pháp này có thể có được thời gian mà không cần bất kỳ thư viện nào: Ngày mới (). toTimeString (). khớp (/ ^ ([0-9] {2}: [0-9] {2}: [0-9 ] {2}) /) [0] FYI
markcial

Có cách nào để làm việc này không. $ .datepicker.formatDate ( 'yy-mm-dd', new Date ( "txtAdvDate" .Val ()); hoặc một số điều như thế
pomster

@Pomster - điều gì sẽ khiến bạn nghĩ chuỗi "txtAdvDate" sẽ có phương thức val trên đó? Ý bạn là $ ('# txtAdvDate'). Val ()? Giả sử nó phù hợp với một trong các hàm tạo (xem tại đây w3schools.com/jsref/jsref_obj_date.asp ) thì nó sẽ hoạt động tốt.
vbullinger

@Pomster - hãy thử sử dụng cái này: document.getEuityById (id) .value = $ .datepicker.formatDate ('yy-mm-dd', ngày mới ());
mrrsb

219

Tài liệu liệt kê các định dạng định dạng được Date()đối tượng hỗ trợ ở đâu?

Tôi tình cờ thấy điều này ngày hôm nay và khá ngạc nhiên khi không ai dành thời gian để trả lời câu hỏi đơn giản này. Đúng, có rất nhiều thư viện ngoài kia để giúp thao tác ngày. Một số tốt hơn so với những người khác. Nhưng đó không phải là câu hỏi.

AFAIK, JavaScript thuần không hỗ trợ các chỉ định định dạng theo cách bạn đã chỉ ra rằng bạn muốn sử dụng chúng . Nhưng nó phương pháp hỗ trợ cho các định dạng ngày và / hoặc thời gian, chẳng hạn như .toLocaleDateString(), .toLocaleTimeString(), và .toUTCString().

Tài Dateliệu tham khảo đối tượng tôi sử dụng thường xuyên nhất là trên trang web w3schools.com (nhưng tìm kiếm nhanh trên Google sẽ tiết lộ nhiều thông tin khác có thể đáp ứng tốt hơn nhu cầu của bạn).

Cũng lưu ý rằng phần Thuộc tính đối tượng ngày cung cấp một liên kết đến prototype, minh họa một số cách bạn có thể mở rộng đối tượng Ngày bằng các phương thức tùy chỉnh. Đã có một số cuộc tranh luận trong cộng đồng JavaScript trong những năm qua về việc liệu đây có phải là cách thực hành tốt nhất hay không và tôi không ủng hộ hay chống lại nó, chỉ chỉ ra sự tồn tại của nó.


26
MDN cũng là một tài liệu tham khảo tuyệt vời: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ chủ
Cypher

2
Câu trả lời của tôi đã cố gắng để giải quyết câu hỏi này cũng. Tôi tin rằng các trình duyệt Firefox hoặc Mozilla đã từng cung cấp phương thức Date.toString () có chuỗi định dạng như vậy. Thật không may, tôi không thể tìm thấy dấu vết của tài liệu cũ. Nó không còn là một phần của tiêu chuẩn và dường như không còn được hỗ trợ ở bất cứ đâu nữa, ngay cả trong Firefox.
người bán hàng

214

Chức năng định dạng tùy chỉnh:

Đối với các định dạng cố định, một chức năng đơn giản làm cho công việc. Ví dụ sau đây tạo định dạng quốc tế 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);
}

Lưu ý: Tuy nhiên, thường thì không nên mở rộng các thư viện chuẩn Javascript (ví dụ: bằng cách thêm chức năng này vào nguyên mẫu của Date).

Một chức năng nâng cao hơn có thể tạo đầu ra có thể định cấu hình dựa trên tham số định dạng. Có một vài ví dụ hay trong cùng trang này.

Nếu để viết một chức năng định dạng quá dài, có rất nhiều thư viện xung quanh nó. Một số câu trả lời khác đã liệt kê chúng. Nhưng phụ thuộc ngày càng tăng cũng có nó phản tác dụng.

Các chức năng định dạng ECMAScript tiêu chuẩn:

Do các phiên bản ECMAscript gần đây hơn, Datelớp có một số chức năng định dạng cụ thể:

toDateString : Phụ thuộc thực hiện, chỉ hiển thị ngày.

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

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

toISOString : Hiển thị ngày và giờ ISO 8601.

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

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

toJSON : Trình tạo chuỗi cho JSON.

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

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

toLocaleDateString : Phụ thuộc thực hiện, một ngày ở định dạng miền địa phương.

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

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

toLocaleString : Phụ thuộc triển khai, ngày & giờ ở định dạng miền địa phương.

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

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

toLocaleTimeString : Phụ thuộc thực hiện, thời gian ở định dạng miền địa phương.

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

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

toString : Chung toString cho ngày.

http: //www.ecma-i Intl.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)"

Lưu ý: có thể tạo đầu ra tùy chỉnh từ các chức năng định dạng đó:

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

10
Nó nên được chấp nhận câu trả lời, bởi vì nó đưa ra định dạng bắt buộc (01-01-2000, không phải 1-1-2000)
Thủy thủ Danubian

6
ngày mới (). toISOString (). lát (0,10) // "2015-04-27"
image72

2
Sẽ rất hữu ích nếu không có ví dụ với ngày 11 tháng 9 vì vậy sẽ rõ ràng ở vị trí nào là ngày và tháng được đại diện.
Karl Adler

1
@abimelex xong. Hy vọng nó rõ ràng hơn bây giờ.
Adrian Maire

1
cảm ơn vì đã thêm các liên kết vào nguồn (: - xem thêm developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ , và developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /
Lọ

125

Câu trả lời ngắn

Không có tài liệu phổ biến trên mạng mà javascript phục vụ; mỗi trình duyệt có javascript thực sự là một triển khai. Tuy nhiên, có một tiêu chuẩn mà hầu hết các trình duyệt hiện đại có xu hướng tuân theo, và đó là tiêu chuẩn EMCAScript; các chuỗi tiêu chuẩn ECMAScript sẽ lấy tối thiểu việc triển khai định nghĩa ISO 8601.

Ngoài ra, còn có một tiêu chuẩn thứ hai do IETF đưa ra mà các trình duyệt cũng có xu hướng tuân theo, đó là định nghĩa về dấu thời gian được thực hiện trong RFC 2822. Tài liệu thực tế có thể được tìm thấy trong danh sách tài liệu tham khảo ở phía dưới.

Từ điều này, bạn có thể mong đợi chức năng cơ bản, nhưng những gì mà Google nghĩ là không phải là bản chất của Cameron. Mặc dù vậy, tôi sẽ đi sâu hơn một chút về thủ tục này, vì dường như chỉ có ba người thực sự trả lời câu hỏi (Scott, goofballLogic và peller cụ thể) mà theo tôi, cho thấy hầu hết mọi người không biết về những gì thực sự xảy ra khi bạn tạo một đối tượng Date.


Câu trả lời dài

Tài liệu liệt kê các bộ định dạng định dạng được hỗ trợ bởi đối tượng Date () ở đâu?


Để trả lời câu hỏi, hoặc thậm chí thường tìm câu trả lời cho câu hỏi này, bạn cần biết rằng javascript không phải là một ngôn ngữ mới lạ; đây thực sự là một triển khai của ECMAScript và tuân theo các tiêu chuẩn ECMAScript (nhưng lưu ý, javascript cũng thực sự có trước các tiêu chuẩn đó; các tiêu chuẩn EMCAScript được xây dựng từ việc triển khai LiveScript / JavaScript sớm). Tiêu chuẩn ECMAScript hiện tại là 5.1 (2011); tại thời điểm câu hỏi ban đầu được hỏi (tháng 6 năm 2009), tiêu chuẩn là 3 (4 đã bị bỏ), nhưng 5 đã được phát hành ngay sau bài đăng vào cuối năm 2009. Điều này sẽ phác thảo một vấn đề; việc triển khai javascript theo tiêu chuẩn nào có thể tuân theo, có thể không phản ánh những gì thực sự diễn ra, bởi vì a) đó là việc thực hiện một tiêu chuẩn nhất định, b) không phải tất cả các triển khai của một tiêu chuẩn đều là thuần túy,

Về cơ bản, khi giao dịch với javascript, bạn đang xử lý một công cụ phái sinh (javascript cụ thể cho trình duyệt) của một triển khai (chính javascript). Ví dụ, động cơ V8 của Google triển khai ECMAScript 5.0, nhưng JScript của Trình thám hiểm Internet không cố tuân thủ mọi tiêu chuẩn ECMAScript, nhưng Internet Explorer 9 không tuân thủ ECMAScript 5.0.

Khi một đối số duy nhất được chuyển đến Ngày mới (), nó sẽ tạo nguyên mẫu hàm này:

new Date(value)

Khi hai hoặc nhiều đối số được chuyển đến Ngày mới (), nó sẽ tạo nguyên mẫu hàm này:

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


Cả hai chức năng này trông có vẻ quen thuộc, nhưng điều này không trả lời ngay câu hỏi của bạn và định lượng nào là định dạng ngày có thể chấp nhận được. Khi bạn chuyển một chuỗi sang Ngày mới (), nó sẽ gọi nguyên mẫu (lưu ý rằng tôi đang sử dụng từ nguyên mẫu một cách lỏng lẻo; các phiên bản có thể là các hàm riêng lẻ hoặc nó có thể là một phần của câu lệnh có điều kiện trong một hàm) Ngày mới (giá trị) với chuỗi của bạn làm đối số cho tham số giá trị trên đường cao tốc độ cao. Hàm này trước tiên sẽ kiểm tra xem đó là số hay chuỗi. Tài liệu cho chức năng này có thể được tìm thấy ở đây:

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

Từ điều này, chúng ta có thể suy luận rằng để có được định dạng chuỗi được phép cho Ngày (giá trị) mới, chúng ta phải xem phương thức Date.parse (chuỗi). Tài liệu cho phương pháp này có thể được tìm thấy ở đây:

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

Và chúng ta có thể suy luận thêm rằng ngày dự kiến ​​sẽ ở Định dạng mở rộng ISO 8601 được sửa đổi, như được chỉ định ở đây:

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

Tuy nhiên, chúng tôi có thể nhận ra từ kinh nghiệm rằng đối tượng Ngày của javascript chấp nhận các định dạng khác (được thi hành bởi sự tồn tại của câu hỏi này) và điều này không sao vì ECMAScript cho phép thực hiện các định dạng cụ thể. Tuy nhiên, điều đó vẫn không trả lời cho câu hỏi tài liệu nào có sẵn trên các định dạng có sẵn, cũng như định dạng nào thực sự được phép. Chúng ta sẽ xem xét triển khai javascript của Google, V8; xin lưu ý rằng tôi không gợi ý đây là công cụ javascript tốt nhất của YouTube (làm thế nào người ta có thể định nghĩa về điều tốt nhất là hay nhất là tốt nhất) và người ta không thể cho rằng các định dạng được phép trong V8 đại diện cho tất cả các định dạng hiện có, nhưng tôi nghĩ nó công bằng giả sử họ làm theo những kỳ vọng hiện đại.

V8 của Google, date.js, DateConstructor

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

Nhìn vào hàm DateConstructor, chúng ta có thể suy ra rằng chúng ta cần tìm hàm DatePude; tuy nhiên, xin lưu ý rằng, năm năm trước đây không phải là năm thực tế và chỉ là một tham chiếu đến tham số của năm năm.

V8 của Google, date.js, DatePude

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

Điều này gọi% DatePudeString, đây thực sự là một tham chiếu hàm thời gian chạy cho hàm C ++. Nó đề cập đến đoạn mã sau:

V8 của Google, runtime.cc,% DatePudeString

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

Hàm gọi chúng tôi quan tâm trong hàm này là cho DateParser :: Parse (); bỏ qua logic xung quanh các lệnh gọi hàm này, đây chỉ là các kiểm tra để tuân thủ loại mã hóa (ASCII và UC16). DateParser :: Parse được định nghĩa ở đây:

V8 của Google, dateparser-inl.h, DateParser :: Parse

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

Đây là chức năng thực sự xác định định dạng mà nó chấp nhận. Về cơ bản, nó kiểm tra tiêu chuẩn EMCAScript 5.0 ISO 8601 và nếu nó không tuân thủ tiêu chuẩn, thì nó sẽ cố gắng xây dựng ngày dựa trên các định dạng cũ. Một vài điểm chính dựa trên các ý kiến:

  1. Các từ trước số đầu tiên mà trình phân tích cú pháp chưa biết sẽ bị bỏ qua.
  2. Văn bản ngoặc đơn được bỏ qua.
  3. Các số chưa được ký theo sau là: Khác: Được hiểu là một thành phần thời gian của Google.
  4. Số chưa ký theo sau là. được hiểu là một thành phần thời gian của người dùng, và phải được theo sau bởi mili giây.
  5. Các số được ký theo sau là giờ hoặc giờ phút (ví dụ +5: 15 hoặc +0515) được hiểu là múi giờ.
  6. Khi khai báo giờ và phút, bạn có thể sử dụng hoặc hhmm mm mm hoặc mm hhmm.
  7. Các từ chỉ múi giờ được hiểu là múi giờ.
  8. Tất cả các số khác được hiểu là các thành phần ngày của Wikipedia.
  9. Tất cả các từ bắt đầu bằng ba chữ số đầu tiên của tháng được hiểu là tháng.
  10. Bạn có thể định nghĩa phút và giờ với nhau theo một trong hai định dạng: Hồi hh: mm, hoặc hhmmv.
  11. Không được phép sử dụng các biểu tượng như Hồi +, Hồi - cường và không thể so sánh được) Sau khi một số được xử lý.
  12. Các mục khớp với nhiều định dạng (ví dụ 1970-01-01) được xử lý dưới dạng chuỗi EMCAScript 5.0 ISO 8601 tuân thủ tiêu chuẩn.

Vì vậy, điều này là đủ để cung cấp cho bạn một ý tưởng cơ bản về những gì mong đợi khi chuyển một chuỗi vào một đối tượng Date. Bạn có thể mở rộng thêm về điều này bằng cách xem thông số kỹ thuật sau mà Mozilla hướng đến trên Mạng của nhà phát triển Mozilla (tuân thủ dấu thời gian của IETF RFC 2822):

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

Ngoài ra, Microsoft Developer Network còn đề cập đến một tiêu chuẩn bổ sung cho đối tượng Date: ECMA-402, Đặc tả API quốc tế hóa ECMAScript, bổ sung cho tiêu chuẩn ECMAScript 5.1 (và tương lai). Điều đó có thể được tìm thấy ở đây:

http: //www.ecma-i Intl.org/ecma-402/1.0/

Trong mọi trường hợp, điều này sẽ giúp làm nổi bật rằng không có "tài liệu" nào đại diện cho tất cả các triển khai javascript, nhưng vẫn có đủ tài liệu để hiểu ý nghĩa hợp lý của chuỗi nào được chấp nhận cho đối tượng Date. Khá nhiều câu hỏi được tải khi bạn nghĩ về nó, có? : P

Người giới thiệu

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

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

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

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

http: //www.ecma-i Intl.org/ecma-402/1.0/

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

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

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

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

Tài nguyên

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

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


92

Hãy chắc chắn rằng bạn kiểm tra Datejs khi xử lý ngày trong JavaScript. Nó khá ấn tượng và được ghi lại tốt như bạn có thể thấy trong trường hợp hàm toString .

EDIT : Tyler Forsythe chỉ ra rằng, datejs đã lỗi thời. Tôi sử dụng nó trong dự án hiện tại của tôi và không gặp rắc rối với nó, tuy nhiên bạn nên biết điều này và xem xét các lựa chọn thay thế.


2
Tôi không thể tìm cách cung cấp datejs bằng mili giây để tạo ngày. Giống như vậy: var dateTime = Ngày mới (); dateTime.setTime (mili giây);
Arne Evertsson

14
25k? Chỉ cho ngày? Ôi.
Ben Lesh

13
Datejs là một thư viện lỗi thời chưa thấy sự phát triển tích cực trong ~ 5 năm. Nguồn của họ là trên Github và Google Code và cả hai đều có ngày cập nhật cuối cùng của năm 2008 (đó là năm 2013). Vì lợi ích của bạn, hãy đi với XDate hoặc Moment.js.
Tyler Forsythe

3
@TylerForsythe Tôi đã thêm một gợi ý / cảnh báo về điều đó.
Tim Büthe

2
lol kịch bản ngày đã hết hạn ...
rtpHarry

69

Bạn chỉ có thể mở rộng DateĐối tượng bằng một formatphương thức mới như được lưu ý bởi meizz , bên dưới là mã do tác giả đưa ra. Và đây là một 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"));

Tăng cường một chút cho mục đích của tôi để hỗ trợ AM / PM - xem bên dưới
Michael Angstadt

@WHK Nhưng tôi vẫn thích khoảnh khắc hơn: D
gongzhitaao

Có vấn đề khi bắt tháng: định dạng Ngày mới ((Ngày mới ()).
điện tử128

1
@WHK Đây thực sự là một trình phân tích cú pháp ngày rất nguyên thủy. Chỉ trong trường hợp bạn không phải lộn xộn với ngày quá nhiều. Nếu bạn thực sự cần phải đối phó với các định dạng ngày khác nhau, tôi sẽ đề xuất một thư viện độc lập như khoảnh khắc. : D
gongzhitaao

1
@WHK Vì console.log(new Date('2014-06-01')) -> Maytôi nghĩ nó có liên quan đến múi giờ: D
gongzhitaao

37

Các chức năng bạn trích dẫn không phải là Javascript tiêu chuẩn, không có khả năng di động trên các trình duyệt và do đó không thực hành tốt. Đặc tả ECMAScript 3 để lại chức năng phân tích cú pháp và định dạng đầu ra cho đến khi triển khai Javascript. ECMAScript 5 thêm một tập hợp con hỗ trợ ISO8601. Tôi tin rằng hàm toString () mà bạn đề cập là một sự đổi mới trong một trình duyệt (Mozilla?)

Một số thư viện cung cấp các thói quen để tham số hóa điều này, một số có hỗ trợ bản địa hóa rộng rãi. Bạn cũng có thể kiểm tra các phương thức trong dojo.date.locale .


5
Cố gắng thực sự trả lời câu hỏi sẽ không giúp bạn có nhiều phiếu bầu. Chỉ cần đề cử một thư viện phổ biến và xem điểm số của bạn bay !!
RobG

30

Tôi đã tạo trình định dạng rất đơn giản này, nó bị cắt / n / pastable (Cập nhật với phiên bản gọn hơn):

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
Tôi thích lớp này nhưng nghĩ nó phải là lớp "tĩnh". Không cần phải khởi tạo nó nhiều hơn một lần. (không cần new DateFmt())
Cheeso

1
Cheeso: Điều gì sẽ xảy ra nếu tôi muốn định dạng 10 ngày khác nhau trên một trang 3 cách khác nhau, mỗi cách? Trong trường hợp đó, sẽ hữu ích khi có ba phiên bản của trình định dạng này. Đó là một usecase hoàn toàn hợp lệ mà điều này sẽ ngăn chặn. OP đã thiết kế chính xác. Ngoài ra, việc chỉ định một định dạng tại thời điểm xây dựng giúp tiết kiệm mã trùng lặp của việc chỉ định định dạng mỗi khi bạn cần định dạng theo một cách nhất định.
hsanders

29

Khung miễn phí, giới hạn nhưng nhẹ

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"

đây là trình duyệt chéo? và địa phương chéo?
Iftah

Đúng. Hiển thị thời gian trong múi giờ địa phương (người dùng trình duyệt) của bạn.
John Williams


18

Sau khi xem qua một số tùy chọn được cung cấp trong các câu trả lời khác, tôi quyết định viết giải pháp hạn chế nhưng đơn giản của riêng mình mà những người khác cũng có thể thấy hữu ích.

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

Ví dụ sử dụng:

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

2
thay thế các hoạt động không thực sự hiệu quả, vì vậy đó là một cách tốt hơn để ngăn chặn nó.
mrzmyr

Nếu tôi viết, chuyện gì sẽ xảy ra? console.log ("Ngày là:" + dateFormat (Ngày mới (), "DD / MM / YY"));
hakan

1
Điều này sẽ in văn bản "Ngày là: 12/11 / YY", vì ở trên không xử lý ngày 2 chữ số. Nếu bạn cần điều này, bạn có thể thêm các mục sau ngay trước câu lệnh return : format = format.replace("YY", (""+date.getFullYear()).substring(2));. Điều này đang trở nên xấu đi - thay vào đó bạn có thể muốn đi xuống tuyến đường RegEx hoặc tương tự.
Ollie Bennett

1
@mrzmyr Bạn có thực sự nghĩ rằng định dạng ngày sẽ là một nút cổ chai hiệu suất? Nào.
doug65536

11

Đây là một chức năng tôi sử dụng rất nhiều. Kết quả là 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
câu trả lời tốt, nhưng tôi nghĩ bạn nên thay đổi hàm zp2 là: var zp2 = function (val) {return val <= 9? '00' + val: (val <= 99? '0' + val: '' + val); }
Eric Wang

1
có một ngoại lệ, khi giá trị của phần ms bằng 0, thì không giống nhau, trong hàm của bạn, kết quả là '00', nhưng không phải là '000'.
Eric Wang

9

Bạn có thể thấy việc sửa đổi đối tượng ngày này hữu ích, nhỏ hơn bất kỳ thư viện nào và có thể dễ dàng mở rộng để hỗ trợ các định dạng khác nhau:

GHI CHÚ:

  • Nó sử dụng Object.keys () không được xác định trong các trình duyệt cũ hơn nên bạn có thể cần triển khai polyfill từ liên kết đã cho.

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

SỬ DỤNG

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

Chỉ cần tiếp tục câu trả lời chắc chắn của gongzhitaao - điều này xử lý 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;
}

Giải pháp rất tốt! var a = Ngày mới (); a.format ('yyyy-MM-d'); // Trả lại 2013-08-16.
Adrian Maire

this .getMonth (); thất bại trong iOS
N20084753

7

Tôi không thể tìm thấy bất kỳ tài liệu chính thức nào về các định dạng ngày hợp lệ vì vậy tôi đã viết bài kiểm tra của riêng mình để xem những gì được hỗ trợ trong các trình duyệt khác nhau.

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

Kết quả của tôi đã kết luận các định dạng sau là hợp lệ trong tất cả các trình duyệt mà tôi đã kiểm tra (ví dụ sử dụng ngày "9 tháng 8 năm 2013"):

[Năm đầy đủ] / [Tháng] / [Số ngày] - Tháng có thể là số có hoặc không có số 0 đứng đầu hoặc tên tháng ở định dạng ngắn hoặc dài và số ngày có thể có hoặc không có số 0 đứng đầu.

  • 2013/08/09
  • 2013/08/9
  • 2013/8/09
  • 2013/8/9
  • 2013/8/09
  • 2013/9/9
  • 2013/09/09
  • 2013/9/9

[Tháng] / [Cả năm] / [Số ngày] - Tháng có thể là số có hoặc không có số 0 đứng đầu hoặc tên tháng ở định dạng ngắn hoặc dài và số ngày có thể có hoặc không có số 0 đứng đầu.

  • 08/2013/09
  • 08/2013/9
  • 8/2013/09
  • 8/2013/9
  • Tháng 8/2013/09
  • Tháng 8/2013/9
  • Tháng 8 năm 2013/09
  • Tháng 8 năm 2013/9

Bất kỳ sự kết hợp nào của [Cả năm], [Tên tháng] và [Số ngày] được phân tách bằng dấu cách - Tên tháng có thể ở định dạng ngắn hoặc dài và số ngày có thể có hoặc không có số 0 đứng đầu.

  • Ngày 09 tháng 8 năm 2013
  • Tháng 8 năm 2013 09
  • Ngày 09 tháng 8 năm 2013
  • Ngày 09 tháng 8 năm 2013
  • Ngày 9 tháng 8 năm 2013
  • 2013 9 tháng 8
  • Vân vân...

Cũng hợp lệ trong "trình duyệt hiện đại" (hay nói cách khác là tất cả các trình duyệt trừ IE9 trở xuống)

[Cả năm] - [Số tháng] - [Số ngày] - Số tháng và ngày phải bao gồm các số 0 đứng đầu (đây là định dạng mà loại Ngày của MySQL sử dụng)

  • 2013-08-09

Sử dụng tên tháng:
Thật thú vị, khi sử dụng tên tháng tôi phát hiện ra rằng chỉ có 3 ký tự đầu tiên của tên tháng được sử dụng nên tất cả các điều sau đây là hoàn toàn hợp lệ:

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

6

Định dạng và đặc biệt là phân tích ngày trong JavaScript có thể là một vấn đề đau đầu. Không phải tất cả các trình duyệt xử lý ngày theo cùng một cách. Vì vậy, trong khi thật hữu ích khi biết các phương thức cơ bản, thì thực tế hơn là sử dụng thư viện trợ giúp.

Các thư viện XDate javascript bởi Adam Shaw đã được khoảng từ giữa năm 2011 và vẫn còn đang được phát triển tích cực. Nó có tài liệu tuyệt vời, một API tuyệt vời, định dạng, cố gắng duy trì khả năng tương thích ngược và thậm chí hỗ trợ các chuỗi cục bộ.

Liên kết để thay đổi chuỗi miền địa phương: https://gist.github.com/1221376


6

Mã ví dụ:

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

Đầu ra:

"13:45:20"


2
đáng chú ý với toISOString (); nó xuất UTC. Vì vậy, nếu new Date();// = Fri Nov 22 2013 17:48:22 GMT+0100, đầu ra với mã ở trên sẽ là"16:48:22"
Tewr

6

Thư viện sugar.js có một số chức năng tuyệt vời để làm việc với các ngày trong JavaScript. Và nó là tài liệu rất tốt .

Sugar mang đến cho lớp Date nhiều tình yêu bắt đầu bằng phương pháp Date.create, có thể hiểu ngày ở bất kỳ định dạng nào trong 15 ngôn ngữ chính, bao gồm các định dạng tương đối như "1 giờ trước". Ngày cũng có thể được xuất ra ở bất kỳ định dạng hoặc ngôn ngữ nào bằng cách sử dụng cú pháp dễ hiểu, với các phím tắt đến các định dạng ngày thường được sử dụng. So sánh ngày phức tạp cũng có thể với các phương thức như là, hiểu bất kỳ định dạng nào và áp dụng được xây dựng chính xác.

Một vài ví dụ:

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

Tất cả các trình duyệt

Cách đáng tin cậy nhất để định dạng một ngày với định dạng nguồn bạn đang sử dụng, là áp dụng các bước sau:

  1. Sử dụng new Date()để tạo một Dateđối tượng
  2. Sử dụng .getDate(), .getMonth().getFullYear()để có được lần lượt là ngày, tháng, năm
  3. Dán các mảnh lại với nhau theo định dạng mục tiêu của bạn

Thí dụ :

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

(Xem thêm Fiddle này ).


Chỉ các trình duyệt hiện đại

Bạn cũng có thể sử dụng .toLocaleDateStringphương thức tích hợp sẵn để thực hiện định dạng cho bạn. Bạn chỉ cần vượt qua ngôn ngữ và các tùy chọn phù hợp để phù hợp với định dạng phù hợp, điều không may chỉ được hỗ trợ bởi các trình duyệt hiện đại (*) :

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

(Xem thêm Fiddle này ).


(*) Theo MDN , "Trình duyệt hiện đại" có nghĩa là Chrome 24+, Firefox 29+, IE11, Edge12 +, Opera 15+ & Safari xây dựng hàng đêm


3

Chỉ là một lựa chọn khác, mà tôi đã viết:

Thư viện DP_DateExtensions

Không chắc nó có giúp ích gì không, nhưng tôi đã thấy nó hữu ích trong một số dự án - có vẻ như nó sẽ làm những gì bạn cần.

Hỗ trợ định dạng ngày / giờ, toán ngày (cộng / trừ các phần ngày), so sánh ngày, phân tích ngày, v.v ... Nó tự do mở nguồn.

Không có lý do để xem xét nó nếu bạn đã sử dụng một khung công tác (tất cả đều có khả năng), nhưng nếu bạn chỉ cần nhanh chóng thêm thao tác ngày vào một dự án thì hãy cho nó một cơ hội.



2

Nếu bạn muốn chỉ hiển thị thời gian với hai chữ số, điều này có thể giúp bạn:

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 là một thư viện có thể định dạng đối tượng ngày và phân tích chuỗi được định dạng trở lại đối tượng Date. Nó sử dụng định dạng Java (lớp SimpleDateFormat). Tên của tháng và ngày có thể được địa phương hóa.

Thí dụ:

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

1

Câu trả lời là "hư không" vì định dạng ngày là chức năng độc quyền. Tôi không nghĩ các hàm toString được dự định tuân theo một định dạng cụ thể. ví dụ: trong thông số ECMAScript 5.1 ( http: //www.ecma-i Intl.org/publications/files/ECMA-ST/Ecma-262.pdf, 2/8/2013, trang 173), chức năng toString được ghi lại như sau :

"Nội dung của Chuỗi phụ thuộc vào việc triển khai"

Các chức năng như các mẫu dưới đây có thể được sử dụng để thực hiện định dạng khá dễ dàng.

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

Nếu bạn không cần tất cả các tính năng mà thư viện như Moment.js cung cấp, thì bạn có thể sử dụng cổng strftime của tôi . Nó nhẹ (1,35 KB so với 57,9 KB được thu nhỏ so với Moment.js 2.15.0) và cung cấp hầu hết các chức năng của 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;
  });
}

Sử dụng mẫu:

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"

Mã mới nhất có sẵn tại đây: https://github.com/thdoan/strftime


0

Cách chính xác để định dạng ngày trả về "2012-12-29" là với tập lệnh từ Định dạng ngày JavaScript :

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

Mã này KHÔNG hoạt động:

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

3
bạn cần tập lệnh được liên kết "Định dạng ngày JavaScript" được liên kết ở trên
Sebastian Viereck

0

Cá nhân, vì tôi sử dụng cả PHP và jQuery / javascript theo các số đo bằng nhau, tôi sử dụng hàm ngày từ php.js http://phpjs.org/fifts/date/

Sử dụng một thư viện sử dụng các chuỗi định dạng giống như những gì tôi đã biết là dễ dàng hơn đối với tôi và hướng dẫn chứa tất cả các khả năng chuỗi định dạng cho hàm ngày tất nhiên là trực tuyến tại php.net

Bạn chỉ cần bao gồm tệp date.js trong HTML bằng phương thức ưa thích của mình, sau đó gọi nó như thế này:

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

Bạn có thể sử dụng d1.getTime () thay vì valueOf () nếu bạn muốn, họ làm điều tương tự.

Việc chia cho 1000 dấu thời gian javascript là do dấu thời gian javascript tính bằng milisecond nhưng dấu thời gian PHP tính bằng giây.


0

Nhiều khung (mà bạn có thể đã sử dụng) có định dạng ngày mà bạn có thể không biết. jQueryUI đã được đề cập, nhưng các khung khác như Kendo UI (Toàn cầu hóa) , Yahoo UI (Util)AngularJS cũng có chúng.

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

// Monday, November 06, 2000
kendo.toString(new Date(2000, 10, 6), "D")
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.