Phân tích cú pháp chuỗi DateTime trong JavaScript


93

Có ai biết cách phân tích cú pháp chuỗi ngày ở định dạng bắt buộc dd.mm.yyyykhông?


Bạn có muốn tạo một đối tượng ngày mới từ một chuỗi ở định dạng đó không?
Kieran Hall

Câu trả lời:


140

Xem:

Mã:

var strDate = "03.09.1979";
var dateParts = strDate.split(".");

var date = new Date(dateParts[2], (dateParts[1] - 1), dateParts[0]);

8
Rất tiếc .. một chút boo-boo - hàm tạo ngày thực sự trông giống như thế này: new Date (năm, tháng, ngày [, giờ, phút, giây, mili giây]) nên bạn cần thay đổi thứ tự của dateParts bên trong hàm tạo.
Salman A

6
Một tiếng boo-boo khác. Hàm tạo ngày trong JavaScript thật kỳ lạ trong cách nó xử lý các tháng. Nó coi 0 có nghĩa là tháng 1, 1 có nghĩa là tháng 2, v.v. Dòng trong đoạn mã trên sẽ giống như sau: var date = new Date (dateParts [2], dateParts [1] - 1, dateParts [0]);
Elias Zamaria

1
@ mikez302, bạn nói đúng. tham chiếu MDC được liên kết cũng chỉ ra điều đó. mã đã sửa
Jonathan Fingland

mmm, nhưng làm thế nào để kiểm tra strDate có giá trị không hợp lệ như "30.30.2000"?
Dr. No

2
@ user674887, bạn có thể so sánh các giá trị sau khi phân tích cú pháp. ví dụ dateParts [1] -1 == date.getMonth ()
Jonathan Fingland

51

Nếu bạn đang sử dụng jQuery UI, bạn có thể định dạng bất kỳ ngày nào bằng:

<html>
    <body>
        Your date formated: <span id="date1"></span><br/>
    </body>
</html>

 

var myDate = '30.11.2011';
var parsedDate = $.datepicker.parseDate('dd.mm.yy', myDate);

$('#date1').text($.datepicker.formatDate('M d, yy', parsedDate));

http://jsfiddle.net/mescalito2345/ND2Qg/14/


21
+1 Tôi không thấy là hoàn toàn nằm ngoài phạm vi, JavaScript và JQuery là sự kết hợp phổ biến.
djna

Một câu trả lời không nên dựa vào một thư viện không được gắn thẻ hoặc được đề cập trong OP. Sử dụng jQuery làm thư viện ngày là quá mức cần thiết khi hàm 3 dòng có thể thực hiện cùng một công việc.
RobG

9

Chúng tôi sử dụng mã này để kiểm tra xem chuỗi có phải là ngày hợp lệ không

var dt = new Date(txtDate.value)
if (isNaN(dt))

định dạng nhất định không phù hợp với định dạng theo yêu cầu của developer.mozilla.org/en/Core_JavaScript_1.5_Reference/... (và do đó mà ngày constructor sẽ không đủ)
Jonathan Fingland

Điều đó hoàn toàn không kiểm tra các ngày hợp lệ, nó chỉ kiểm tra xem hàm tạo Ngày có thể tạo một ngày hợp lệ từ đầu vào hay không. Cả hai không giống nhau.
RobG

6

refs: http://momentjs.com/docs/#/parsing/string/

Nếu bạn sử dụng moment.js, bạn có thể sử dụng chế độ "chuỗi" + "định dạng"

moment(String, String);
moment(String, String, String);
moment(String, String, Boolean);
moment(String, String, String, Boolean);

Ví dụ:

moment("12-25-1995", "MM-DD-YYYY");

2
Đối với hầu hết các trường hợp, MomentJS là quá mức cần thiết, vì sử dụng JavaScript thuần túy chỉ yêu cầu hàng trăm byte, trong khi MomentJS là 12,4kb được gzipped. Thuận tiện cho các nhà phát triển nhưng làm chậm trang web. Không có giá trị.
Raptor

3

Tôi đã được sử dụng mã sau trong IE. (Tương thích IE8)

var dString = "2013.2.4";
var myDate = new Date( dString.replace(/(\d+)\.(\d+)\.(\d+)/,"$2/$3/$1") );
alert( "my date:"+ myDate );


2

Sử dụng đối tượng Ngày:

var time = Date.parse('02.02.1999');
document.writeln(time);

Cho: 917902800000


16
new Date(Date.parse('02.02.1999'))
Duke

+1 cho Duke nhận xét về new Date(Date.parse('02.02.1999'))Javascript
Jack

Trả về NaN trong ít nhất hai trình duyệt hiện tại. Xem Tại sao Date.parse cho kết quả không chính xác?
RobG

@ Duke— new Date(Date.parse('02.02.1999'))sẽ cho ra kết quả giống hệt với new Date('02.02.1999'), bao gồm cả Ngày không hợp lệ trong một số trình duyệt. Sử dụng trình phân tích cú pháp tích hợp được cho là cách tồi tệ nhất để phân tích cú pháp dấu thời gian.
RobG

2

Hàm này cũng xử lý ngày 29.2.2001 không hợp lệ.

function parseDate(str) {
    var dateParts = str.split(".");
    if (dateParts.length != 3)
        return null;
    var year = dateParts[2];
    var month = dateParts[1];
    var day = dateParts[0];

    if (isNaN(day) || isNaN(month) || isNaN(year))
        return null;

    var result = new Date(year, (month - 1), day);
    if (result == null)
        return null;
    if (result.getDate() != day)
        return null;
    if (result.getMonth() != (month - 1))
        return null;
    if (result.getFullYear() != year)
        return null;

    return result;
}

0

bạn có thể định dạng ngày tháng chỉ cần tạo loại mã này. trong javascript.

 // for eg.
              var inputdate=document.getElementById("getdate").value);
                 var datecomp= inputdate.split('.');

                Var Date= new Date(datecomp[2], datecomp[1]-1, datecomp[0]); 
                 //new date( Year,Month,Date)

Bạn đang phải sử dụng javascript jquery không vì không có thẻ jquery
Sagar

hạnh phúc ... nghĩa là chỉ cần hiểu được senario
Bachas

Tốt. Tôi không nghĩ ví dụ của bạn khác với ví dụ của Martin Staufcik. Trên thực tế, câu trả lời của anh ấy có logic bổ sung để xử lý các ngày không hợp lệ.
Sagar

Martin Staufcik xử lý những điều kiện thường không xảy ra. bạn có thể cung cấp cho tôi bất kỳ lịch nào có thể cho biết giá trị không. tại sao chúng ta nên viết mã dài như vậy khi chúng ta có thể xử lý ngắn gọn. Tôi sẽ tốt hơn nhiều nếu Martin Staufcik cũng đưa ra ngày xử lý với thời gian để xử lý.
Bachas
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.