Chuyển đổi chuỗi dd-mm-yyyy thành ngày


184

tôi đang cố gắng chuyển đổi một chuỗi theo định dạng dd-mm-yyyy thành một đối tượng ngày trong JavaScript bằng cách sử dụng như sau:

 var from = $("#datepicker").val();
 var to = $("#datepickertwo").val();
 var f = new Date(from);
 var t = new Date(to);

("#datepicker").val()chứa một ngày ở định dạng dd-mm-yyyy. Khi tôi làm như sau, tôi nhận được "Ngày không hợp lệ":

alert(f);

Đây có phải là do biểu tượng '-'? Làm thế nào tôi có thể vượt qua điều này?


Điều này xảy ra với tất cả các ngày hoặc một cụ thể?
kasdega

Câu trả lời:


325

Tách ra "-"

Phân tích chuỗi thành các phần bạn cần:

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Sử dụng regex

var date = new Date("15-05-2018".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3"))

Tại sao không sử dụng regex?

Bởi vì bạn biết bạn sẽ làm việc trên một chuỗi gồm ba phần, được phân tách bằng dấu gạch nối.

Tuy nhiên, nếu bạn đang tìm kiếm cùng một chuỗi trong một chuỗi khác, regex sẽ là cách tốt nhất.

Tái sử dụng

Bởi vì bạn đang làm điều này nhiều hơn một lần trong mã mẫu của bạn và có thể ở nơi khác trong cơ sở mã của bạn, hãy gói nó trong một hàm:

function toDate(dateStr) {
  var parts = dateStr.split("-")
  return new Date(parts[2], parts[1] - 1, parts[0])
}

Sử dụng như:

var from = $("#datepicker").val()
var to = $("#datepickertwo").val()
var f = toDate(from)
var t = toDate(to)

Hoặc nếu bạn không nhớ jQuery trong chức năng của mình:

function toDate(selector) {
  var from = $(selector).val().split("-")
  return new Date(from[2], from[1] - 1, from[0])
}

Sử dụng như:

var f = toDate("#datepicker")
var t = toDate("#datepickertwo")

JavaScript hiện đại

Nếu bạn có thể sử dụng JS hiện đại hơn, thì việc phá hủy mảng cũng là một điểm tuyệt vời:

const toDate = (dateStr) => {
  const [day, month, year] = dateStr.split("-")
  return new Date(year, month - 1, day)
}

9
đánh bại tôi ... nhưng tôi vẫn sử dụng DateJs. Điều này không chính xác do lỗi hàng rào. tháng là 0-11 nên bạn cần trừ 1. f = Ngày mới (từ [2], từ [1] -1, từ [0]);
kasdega

12
Chọn câu trả lời với một lỗi tạo ra ngày sai. Tuyệt vời!
eprebello

3
Chúc mừng @kasdega - Đã chỉnh sửa ... một lúc trước!
Adrian Lynch

@AdrianLynch Làm cách nào để chuyển đổi "Tháng dd, yyyy" thành "MM / dd / yyyy" trong javascript?
Dilipkumar1007

1
@Adrian Lynch Tùy chọn JavaScript hiện đại rất tuyệt! Cảm ơn bạn.
Alexandre Ribeiro

134

ví dụ biểu thức chính quy:

new Date( "13-01-2011".replace( /(\d{2})-(\d{2})-(\d{4})/, "$2/$1/$3") );

8
Một sửa đổi cũng mất /là dấu phân cách và một năm gồm 2 chữ số (hoặc bất kỳ số nào lớn hơn 1):replace( /(\d{2})[-/](\d{2})[-/](\d+)/, "$2/$1/$3")
Izhaki

1
Tại sao đây phải là câu trả lời được chọn @AdemirNuno? Tại sao sử dụng RegEx cho một chuỗi ở định dạng đã biết? Bạn không tìm kiếm một mẫu, bạn biết số đầu tiên là ngày, thứ hai trong tháng và thứ ba trong năm. RegEx là công cụ sai cho công việc trong trường hợp này.
Adrian Lynch

Một bản sửa đổi có các dấu phân cách không có chữ số, ngày không có số 0 đứng đầu và 2 hoặc 4 năm chữ số: new Date( "23. 2. 15".replace( /(\d+)[^d]+(\d+)[^d]+(\d+)/, "$2/$1/$3") ); en.wikipedia.org/wiki/Date_format_by_country
PaulH

đó là người thực hành, cảm ơn. định dạng ngày của tôi đi cùng với thời gian, vì vậy tôi mã hóa lại thành: 'Ngày mới ("13-01-2011" .replace (/ (\ d {2}) - (\ d {2}) - (\ w) / , "$ 2 / $ 1 / $ 3")); ' đúng không?
Kamuran Sönecek

@NeerajSingh Làm cách nào để chuyển đổi "Tháng dd, yyyy" thành "MM / dd / yyyy" trong javascript?
Dilipkumar1007

15

Khả năng khác:

var from = "10-11-2011"; 
var numbers = from.match(/\d+/g); 
var date = new Date(numbers[2], numbers[0]-1, numbers[1]);

Nối các chữ số và sắp xếp lại chúng


Ngoài ra, câu hỏi ban đầu chỉ định "dd-mm-yyyy", không phải "mm-dd-yyyy", vì vậy nó vẫn sai (nhưng chỉ là).
Phil M Jones

@eprebello Làm cách nào để chuyển đổi "Tháng dd, yyyy" thành "MM / dd / yyyy" trong javascript?
Dilipkumar1007

1
var date = new Date(numbers[2], numbers[1]-1, numbers[0]);
Rui Nunes

7

Sử dụng ví dụ Moment.js :

var from = '11-04-2017' // OR $("#datepicker").val();
var milliseconds = moment(from, "DD-MM-YYYY").format('x');
var f = new Date(milliseconds)

1
Khoảnh khắc (từ, "DD-MM-YYYY"). toDate ()
Lapenkov Vladimir

6
var from = $("#datepicker").val(); 
var f = $.datepicker.parseDate("d-m-Y", from);

3
Bạn có nhận được Date.parseDate không?
kasdega

@kasdega Xin lỗi, tôi đã nghĩ đến $ .datepicker.parseDate, đã sửa nó ngay bây giờ :)
Saad Imran.

Bạn nên sử dụng $.datepicker.parseDate("dd-mm-yy", from);để phân tích chính xác một ngày như 24-01-2017, tài liệu về ngày tháng chek tại api.jqueryui.com/datepicker
Andrea Mauro

4

Bạn cũng có thể viết một ngày bên trong dấu ngoặc đơn của Date()đối tượng, như sau:

new Date("Month dd, yyyy hh:mm:ss")
new Date("Month dd, yyyy")
new Date(yyyy,mm,dd,hh,mm,ss)
new Date(yyyy,mm,dd)
new Date(milliseconds)

@AmitSengar Làm cách nào để chuyển đổi "Tháng dd, yyyy" thành "MM / dd / yyyy" trong javascript?
Dilipkumar1007

3

Sử dụng định dạng này: myDate = new Date('2011-01-03'); // Mon Jan 03 2011 00:00:00


1
Bạn đã có được parseDatechức năng đó từ đâu? Đó có phải là một chức năng javascript gốc?
Joseph Silber

xin lỗi làm thế nào để tôi thực hiện điều này? Ngoài ra, tôi cần định dạng là dd-mm-yy
user559142

parseDate là một hàm JS gốc. Để biết thêm thông tin, hãy xem: xaprb.com/articles/javascript-date-parsing-demo.html
- James MacFarlane

1
@Diodeus ... thực sự nó là bản địa? Làm thế nào đến lỗi ném ff và chrome?
eprebello

2
@Diodeus ngay cả với lần chỉnh sửa cuối cùng, điều này không hoàn toàn phù hợp với tôi (ít nhất là với Chrome). Nó đặt ngày '2011-01-03'và thời gian UTC 00:00:00. Vì vậy, nếu múi giờ của người dùng ít hơn UTC, nó thực sự sẽ là ngày trước.
Mike

3

Trong trường hợp của tôi

new Date("20151102034013".replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, "$1-$2-$3T$4:$5:$6"))

Kết quả: Thứ hai ngày 02 tháng 11 năm 2015 04:40:13 GMT + 0100 (CET) sau đó tôi sử dụng .getTime () để làm việc với mili giây


3

Câu trả lời được chấp nhận có một lỗi

var from = $("#datepicker").val().split("-")
var f = new Date(from[2], from[1] - 1, from[0])

Xem xét nếu công cụ hẹn hò có chứa "77-78-7980" rõ ràng không phải là ngày hợp lệ. Điều này sẽ dẫn đến:

var f = new Date(7980, 77, 77);
=> Date 7986-08-15T22:00:00.000Z

Mà có lẽ không phải là kết quả mong muốn.

Lý do cho điều này được giải thích trên trang MDN :

Trong đó Date được gọi là hàm tạo có nhiều hơn một đối số, nếu các giá trị lớn hơn phạm vi logic của chúng (ví dụ 13 được cung cấp dưới dạng giá trị tháng hoặc 70 cho giá trị phút), giá trị liền kề sẽ được điều chỉnh. Ví dụ như new Date(2013, 13, 1)tương đương với new Date(2014, 1, 1).


Một cách tốt hơn để giải quyết vấn đề là:

const stringToDate = function(dateString) {
  const [dd, mm, yyyy] = dateString.split("-");
  return new Date(`${yyyy}-${mm}-${dd}`);
};

console.log(stringToDate('04-04-2019'));
// Date 2019-04-04T00:00:00.000Z

console.log(stringToDate('77-78-7980'));
// Invalid Date

Điều này cung cấp cho bạn khả năng xử lý đầu vào không hợp lệ.

Ví dụ:

const date = stringToDate("77-78-7980");

if (date === "Invalid Date" || isNaN(date)) {
  console.log("It's all gone bad");
} else {
  // Do something with your valid date here
}


1

Hãy xem Datejs cho tất cả các vấn đề liên quan đến ngày nhỏ .. Bạn cũng có thể giải quyết vấn đề này bằng hàm parseDate


0

Bạn có thể sử dụng Regapi.

var result = /^(\d{2})-(\d{2})-(\d{4})$/.exec($("#datepicker").val());
if (result) {
    from = new Date(
        parseInt(result[3], 10), 
        parseInt(result[2], 10) - 1, 
        parseInt(result[1], 10)
    );
}

Sản xuất sai tháng! Tháng bắt đầu từ con số không, không phải một. Vì vậy, nếu bạn đã làm Jan, bạn sẽ nói vào ngày 2 tháng 2
eprebello

1
@eprebello - Quên làm thế nào khập khiễng API ngày.
ChaosPandion

@ChaosPandion: làm cách nào để chuyển đổi myDate = '20 / 06/17 'thành định dạng '20 / 6/2017 00:00:00' trong javascript?
Ghanshyam Lakhani

-1
new Date().toLocaleDateString();

đơn giản như vậy, chỉ cần chuyển ngày của bạn đến js Date Object


Bạn có nghĩa là chuyển chuỗi ngày bên trong hàm tạo ngày như thế nào new Date('30/12/2018').toLocaleDateString()?? Điều đó trả về Ngày không hợp lệ
Ms.Tamil
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.