Làm cách nào tôi có thể chuyển đổi chuỗi thành datetime với đặc tả định dạng trong JavaScript?


207

Làm cách nào tôi có thể chuyển đổi một chuỗi thành một đối tượng thời gian trong javascript bằng cách chỉ định một chuỗi định dạng?

Tôi đang tìm kiếm một cái gì đó như:

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

2
Dấu chấm và dấu gạch ngang BTW có thể thất bại vì dấu phân cách ngày, dấu gạch chéo không sao, vì vậy (theo giới hạn của các thử nghiệm của tôi) Javascript sẽ chấp nhận "2011/08/22 10:30:00" nhưng chưa (mặc dù ISO 8601) "2011-09 -02 15:58:40 "- được khẳng định - được hỗ trợ trong Javascript 1.8.5 trên.
Dave Everitt

Hàm Date.parse phân tích chuỗi ngày ở định dạng "mm / dd / yyyy". Vui lòng chuyển đổi chuỗi thành định dạng "mm / dd / yyyy" trước khi áp dụng Parse.

Tại sao không cung cấp ngày ở định dạng cần thiết? Tôi làm điều đó như Ngày mới ('2012 11 25 18:00:00'); Và nó hoạt động!
foxybagga

Câu trả lời:


88

Tôi nghĩ rằng điều này có thể giúp bạn: http://www.mattkruse.com/javascript/date/

Có một getDateFromFormat()chức năng mà bạn có thể điều chỉnh một chút để giải quyết vấn đề của mình.

Cập nhật: có phiên bản cập nhật của các mẫu có sẵn tại javascripttoolbox.com


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

6
Phương thức getDateFromFormat có sẵn với tài liệu, trên liên kết ở trên. Nguồn có sẵn ở đây: mattkruse.com/javascript/date/source.html
Rafael Mueller

1
+1, thư viện tốt..tìm javascript ... thật tuyệt vời. cảm ơn bạn
Surendra Jnawali

7
Cả hai liên kết đều đã chết
Sytham

1
Nếu bạn có thể, xin vui lòng cập nhật các liên kết. Điều này không giúp được nữa.
Tallerlei

98

Sử dụng nếu chuỗi của bạn tương thích với . Nếu định dạng của bạn không tương thích (tôi nghĩ là vậy), bạn phải tự phân tích chuỗi (nên dễ dàng với các biểu thức thông thường) và tạo một đối tượng Ngày mới với các giá trị rõ ràng cho năm, tháng, ngày, giờ, phút và giây.new Date(dateString)Date.parse()


1
Date.parse là giải pháp tốt nhất! Nó phân tích hầu hết mọi thứ! +1
ianaz

7
@ianaz: ALMOST mọi thứ được sử dụng ở Mỹ, nhưng thiếu định dạng được sử dụng bởi phần lớn châu Âu là quá lớn "gần như". Nhưng ngày mới là một cơ sở tốt cho các chức năng tùy chỉnh.
Pavel V.

Ngày mới (dateString) hoạt động tốt với tôi, Date.parse () thay vào đó chuyển đổi thành mili giây và do đó trả về một số không phải là loại Ngày.
Reagan Ochora

68

@Christoph Mentions sử dụng regex để giải quyết vấn đề. Đây là những gì tôi đang sử dụng:

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

Không có nghĩa là thông minh, chỉ cần cấu hình regex và new Date(blah)phù hợp với nhu cầu của bạn.

Chỉnh sửa: Có thể dễ hiểu hơn một chút trong ES6 bằng cách sử dụng hàm hủy:

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

Nhưng trong tất cả sự trung thực những ngày này tôi đạt được một cái gì đó như Khoảnh khắc


19
@ bažmegakapa thay vì khóc, có lẽ bạn đã chỉnh sửa câu trả lời và tự thêm 'var'?
OrganicPanda

Tại sao bạn sử dụng /gcờ, chỉ để đặt lastIndexthành 0sau đó? Chỉ không sử dụng một trận đấu toàn cầu.
Ry-

1
@minitech Bản /gsao / dán cẩu thả từ một dự án hiện có. lastindexđã được thêm vào bởi một biên tập viên (để chống lại \gtôi cho rằng?). Tôi sẽ loại bỏ chúng ngay bây giờ. Cảm ơn bạn đã chỉ ra rằng.
OrganicPanda

1
anwer rất đẹp .. thực sự hữu ích với tôi
Jethik

14

Không có thói quen định dạng ngày / giờ tinh vi tồn tại trong JavaScript.

Bạn sẽ phải sử dụng một thư viện bên ngoài cho đầu ra ngày được định dạng, "Định dạng ngày JavaScript" từ Flagrant Badassery trông rất hứa hẹn.

Đối với chuyển đổi đầu vào, một số đề xuất đã được thực hiện. :)


3
"phải" là tương đối. Tất nhiên bạn có thể xây dựng thực hiện của riêng bạn. :)
Tomalak

13

Hãy xem Moment.js . Đây là một thư viện hiện đại và mạnh mẽ bù cho các hàm Ngày tồi tệ của JavaScript (hoặc thiếu chúng).


3
Tôi đã không downvote, nhưng có lẽ thật tuyệt khi biết chính xác chức năng nào trong Moment.js sẽ mang lại hành vi mong muốn (đối với những người lười biếng đã sử dụng Moment.js nhưng không biết sử dụng chức năng cụ thể nào) .
Matt

Việc bản địa hóa có vẻ đầy hứa hẹn, chọn bất kỳ miền địa phương trung tâm nào cho định dạng dấu chấm. Tuy nhiên, tôi đã không kiểm tra nó và định dạng datetime đầy đủ không có trong các ví dụ tôi đã thấy.
Pavel V.

Tôi đã không downvote, nhưng tôi chỉ muốn nói rằng điều này là chậm. Đối với máy tính để bàn ok, nhưng đối với điện thoại di động có thể quá chậm (tùy theo nhu cầu của bạn).
gabn88

11

Chỉ cần một câu trả lời được cập nhật ở đây, có một lib js tốt tại http://www.datejs.com/

Datejs là một thư viện Ngày JavaScript mã nguồn mở để phân tích, định dạng và xử lý.


Quay lại chỉnh sửa đó, mặc dù rất hữu ích, nó nên được thêm vào dưới dạng một nhận xét hoặc câu trả lời riêng biệt.
Alexis Abril

Dù sao nó cũng quá dài cho một bình luận và việc thêm một câu trả lời trùng lặp là sai. Câu hỏi này có hơn 155.000 lượt xem - hãy cung cấp cho những người này càng nhiều thông tin càng tốt! (nhân tiện - rất phổ biến trong Stack Overflow để chỉnh sửa câu trả lời hiện có - bạn có thể sẽ cảm thấy tồi tệ hơn nếu tôi chỉ sao chép câu trả lời của bạn ...)
Kobi

1
Và dù sao đi nữa, nếu bạn không thích bản chỉnh sửa của tôi thì tốt, nhưng vui lòng mở rộng câu trả lời của bạn - "Chỉ cần một câu trả lời được cập nhật ở đây" là một phụ, và nó thiếu một số chi tiết. Câu hỏi này đang được chú ý tại thời điểm này, đó là lý do bạn đột nhiên nhận được 5 phiếu bầu.
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

Thư viện bên ngoài là một quá mức cần thiết để phân tích một hoặc hai ngày, vì vậy tôi đã thực hiện chức năng của riêng mình bằng các giải pháp của Oli'sChristoph . Ở Trung Âu, chúng tôi hiếm khi sử dụng mọi thứ ngoài định dạng của OP, vì vậy điều này là đủ cho các ứng dụng đơn giản được sử dụng ở đây.

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() là khá thông minh nhưng tôi không thể đảm bảo rằng định dạng sẽ phân tích chính xác.

Nếu không, bạn sẽ phải tìm một cái gì đó để kết nối cả hai. Ví dụ của bạn khá đơn giản (hoàn toàn là số), do đó, việc chạm vào REGEX (hoặc thậm chí string.split()- có thể nhanh hơn) được ghép nối với một số parseInt()sẽ cho phép bạn nhanh chóng thực hiện một ngày.


3
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

cộng 1 sau khi gọi hàm getmonth () có vẻ sai
Arjuningh

t.getMonth () + 1 đúng vì Date.getMonth () trả về 0 giá trị dựa trên.
Jussi Palo

3

Chỉ để cho tôi 5 xu.

Định dạng ngày của tôi là dd.mm.yyyy (định dạng của Vương quốc Anh) và không có ví dụ nào ở trên hoạt động với tôi. Tất cả các trình phân tích cú pháp đã xem xét mm là ngày và dd là tháng.

Tôi đã tìm thấy thư viện này: http://joey.mazzarelli.com/2008/11/25/easy-date-parsing-with-javascript/ và nó đã hoạt động, bởi vì bạn có thể nói thứ tự của các trường như thế này:

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

Tôi hy vọng điều đó sẽ giúp được ai đó.


Liên kết bây giờ đã chết!

Chà ... một kho lưu trữ nhanh chóng đã cho thấy: bitbucket.org/mazzarelli/js-date/doads là url dự án.
Anton Valqk

1

Moment.js sẽ xử lý việc này:

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

1
Mặc dù khoảnh khắc rất tuyệt vời, nhưng có rất nhiều trường hợp sử dụng mà bạn phải sử dụng Javascript gốc. Trường hợp sử dụng hiện tại của tôi là một chức năng Bản đồ trong CouchDB
Zach Smith

1

Bạn có thể sử dụng thư viện Moment.js cho việc này. Tôi chỉ sử dụng để có được đầu ra theo thời gian cụ thể nhưng bạn có thể chọn loại định dạng bạn muốn chọn.

Tài liệu tham khảo:

1. thư viện khoảnh khắc: https://momentjs.com/

2. chức năng cụ thể thời gian và ngày: https://timestamp.online/article/how-to-convert-timestamp-to-datetime-in-javascript

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

và bạn có thể gọi phương thức này như:

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

Tôi hy vọng nó sẽ giúp. Thưởng thức mã hóa.


0

Để đáp ứng đầy đủ chuỗi chuyển đổi Date.parse sang định dạng dd-mm-YYYY như được chỉ định trong RFC822, nếu bạn sử dụng phân tích yyyy-mm-dd có thể mắc lỗi.


FYI, Từ RFC 822 (trang: 25. Được làm sạch một phần để đáp ứng độ dài văn bản để nhận xét): ngày 13 tháng 8 năm 1982 - 25 - RFC # 822 5. THÔNG SỐ KỸ THUẬT NGÀY VÀ THỜI GIAN 5.1. Ngày-thời gian SYNTAX = [ngày ","] ngày giờ; dd mm yy hh: mm: ss zzz day = "Mon" / "Tue" / "Wed" / "Thu" / "Fri" / "Sat" / "Sun" date = 1 * 2DIGIT tháng 2DIGIT; ngày tháng năm, ví dụ: 20 tháng 6 82 tháng = "tháng một" / "tháng hai" / "tháng ba" / "tháng tư" / "tháng năm" / "tháng sáu" / "tháng bảy" / "tháng tám" / "tháng chín" / "tháng mười" / " Tháng 11 "/" Tháng 12 "
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;
    }

Người hỏi đã yêu cầu chỉ định một chuỗi định dạng .
Armali

@Armali Tham số đầu vào như "/ Ngày (1552415400000) /" ở định dạng chuỗi
Abhishek Kanrar
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.