Chuyển đổi ngày ISO thành định dạng ngày yyyy-mm-dd trong JavaScript


108

Làm cách nào để lấy ngày có định dạng yyyy-mm-dd từ ngày ISO 8601 ?

Ngày 8601 của tôi là

2013-03-10T02:00:00Z

Làm thế nào tôi có thể nhận được những thứ sau?

2013-03-10

2
Bạn đã thực sự cố gắng làm điều đó chưa? Đây không phải là một câu hỏi mới mà nó đã được trả lời nhiều lần.
bPratik


14
date.split("T")[0]sẽ làm
Aravindh Gopi

Câu trả lời:


99

Thử cái này

date = new Date('2013-03-10T02:00:00Z');
date.getFullYear()+'-' + (date.getMonth()+1) + '-'+date.getDate();//prints expected format.

Cập nhật: -

Như đã chỉ ra trong các nhận xét, tôi đang cập nhật câu trả lời để in các số không ở đầu cho ngày và tháng nếu cần.

date = new Date('2013-08-03T02:00:00Z');
year = date.getFullYear();
month = date.getMonth()+1;
dt = date.getDate();

if (dt < 10) {
  dt = '0' + dt;
}
if (month < 10) {
  month = '0' + month;
}

console.log(year+'-' + month + '-'+dt);


17
Lưu ý, tôi không nghĩ rằng đây sẽ in một số không hàng đầu cho ngày hoặc tháng
user3413723

2
Đồng ý với @ user3413723, điều này không trả lời câu hỏi vì nó loại bỏ số 0 ở đầu do đó không đáp ứng yêu cầu của định dạng YYYY-MM-DD
James Murphy

Làm việc tốt @Mritunjay
Ravi Delixan

Câu trả lời này dài hơn và dễ mắc lỗi đánh máy hơn so với câu trả lời của DriveByPoster. Nhưng tôi sẽ không đưa ra phản đối vì nó là ngôn ngữ bất khả tri hơn. Nó chỉ không sử dụng các công cụ đơn giản theo ý của chúng tôi.
RoboticRenaissance

thưa bạn, bạn có thể vui lòng cho tôi biết làm thế nào để vượt qua 2013 3 1 ngày định dạng này trong Ngày mới (date)
Kapil soni

142

Chỉ cần cắt chuỗi:

var date = new Date("2013-03-10T02:00:00Z");
date.toISOString().substring(0, 10);

Hoặc nếu bạn chỉ cần ngày ngoài chuỗi.

var strDate = "2013-03-10T02:00:00Z";
strDate.substring(0, 10);

3
Tôi nghĩ rằng đây là giải pháp dễ nhất và thanh lịch nhất từ ​​tất cả nhưng ở đây có bất kỳ sự sụp đổ nào cho việc này không?
Aida_Aida

30
@Aida_Aida Vấn đề duy nhất tôi có thể nghĩ đến là nếu mã của bạn xử lý theo thời gian quy mô địa lý ít nhất là 8000 năm trong tương lai, mã của bạn có thể bị hỏng vì định dạng sẽ YYYYY-MM-DDở năm 10000. Để tránh điều này, bạn có thể chia nhỏ Tký tự thay thế. (Xem en.wikipedia.org/wiki/Year_10,000_problem )
apsillers

9
Cách này sẽ không xử lý các múi giờ một cách chính xác vì ISOString là UTC nhưng đối tượng Date là cục bộ. Bạn phải xem xét điều này.
Guillaume F.

3
@GuillaumeF. một yếu tố quan trọng nhưng nó không phù hợp với yêu cầu của OP
jamesjansson

Tôi không thể hiểu tại sao chuỗi phải được phân tích cú pháp thành Ngày. Các substring lựa chọn dường như là câu trả lời đơn giản nhất.
RobG

45

Bạn có thể kiểm tra Moment.js , Luxon , date-fns hoặc Day.js để có thao tác ngày tốt.

Hoặc chỉ cần trích xuất phần đầu tiên của chuỗi ISO của bạn, nó đã chứa những gì bạn muốn. Đây là một ví dụ bằng cách tách trên T:

"2013-03-10T02:00:00Z".split("T")[0] // "2013-03-10"

14

Moment.js sẽ xử lý định dạng ngày tháng cho bạn. Đây là cách bao gồm nó thông qua thẻ JavaScript và sau đó là một ví dụ về cách sử dụng Moment.js để định dạng ngày.

<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.14.1/moment.min.js"></script>

moment("2013-03-10T02:00:00Z").format("YYYY-MM-DD") // "2013-03-10"

Mặc dù đoạn mã này có thể giải quyết câu hỏi, bao gồm một lời giải thích thực sự giúp cải thiện chất lượng bài đăng của bạn. Hãy nhớ rằng bạn đang trả lời câu hỏi cho người đọc trong tương lai và những người đó có thể không biết lý do cho đề xuất mã của bạn. Cũng vui lòng cố gắng không chèn mã của bạn bằng các nhận xét giải thích, vì điều này làm giảm khả năng đọc của cả mã và giải thích!
Goodbye StackExchange,

2
momentlà một thư viện khá lớn chỉ dùng để định dạng. Thay vì sử dụng date-fns có kích thước nhỏ hơn nhiều và cung cấp cùng chức năng.
Hozefa

@Hozefa, sau đó trả lời câu hỏi OP với giải pháp của bạn.
Harris

1
@Harris - đã làm công việc suôn sẻ!
HadidAli

Tôi mong muốn giây phút đã có một số chức năng như .toISODateString(), bởi vì đó là trường hợp rất thường xuyên ...
Lev Lukomsky

12

Đây là những gì tôi làm chỉ để cập nhật:

let isoDate = "2013-03-10T02:00:00Z";

alert(isoDate.split("T")[0]);


2
Đây là câu trả lời đầu tiên thực sự đề xuất ý tưởng split () như câu trả lời theo như tôi có thể nói và tôi thích giải pháp đó cho yếu tố nỗ lực so với độ tin cậy và hiệu quả mặc dù tôi sử dụng moment () ở mọi nơi tôi có thể.
rainabba

1
toISOString sử dụng UTC, sẽ tạo ra ngày địa phương sai trong khoảng thời gian chênh lệch múi giờ địa phương từ nửa đêm. - RobG
Michael Dimmitt

9

Moment.js là thư viện khá lớn để sử dụng cho một trường hợp sử dụng duy nhất. Tôi khuyên bạn nên sử dụng date-fnsthay thế. Về cơ bản, nó cung cấp hầu hết các chức năng của Moment.js với kích thước gói nhỏ hơn nhiều và nhiều formatting options.

import format from 'date-fns/format'
format('2013-03-10T02:00:00Z', 'YYYY-MM-DD'); // 2013-03-10, YYYY-MM-dd for 2.x

Một điều cần lưu ý là, vì đó là định dạng thời gian ISO 8601 , trình duyệt thường chuyển đổi từ giờ UTC sang múi giờ địa phương. Mặc dù đây là trường hợp sử dụng đơn giản mà bạn có thể làm được '2013-03-10T02:00:00Z'.substring(0, 10);.

Đối với các chuyển đổi phức tạp hơn date-fnslà cách để đi.


6

let isoDate = "2013-03-10T02:00:00Z";
var d = new Date(isoDate);
d.toLocaleDateString('en-GB'); // dd/mm/yyyy
d.toLocaleDateString('en-US'); // mm/dd/yyyy


d.toLocaleDateString ('en-GB'); hoạt động như một sự quyến rũ. Câu trả lời chính xác!
Donald Shahini,

5

Sử dụng:

new Date().toISOString().substring(0, 10);

4

Điều này sẽ xuất ra ngày ở định dạng YYYY-MM-DD:

let date = new Date();
date = date.toISOString().slice(0,10);

Tôi không biết tại sao điều này không nhận được nhiều phiếu bầu hơn, nó hoạt động hoàn hảo và trả lời câu hỏi với nỗ lực tối thiểu
Wolfiebae

4

Chuyển ngày của bạn vào đối tượng ngày tháng:

var d = new Date('2013-03-10T02:00:00Z');
d.toLocaleDateString().replace(/\//g, '-');

1
toLocaleDateString () sẽ có định dạng "/". Không phải định dạng "-".
TechCrunch

Bạn có thể sử dụng ở trên thay thế "/" bằng "-". Không phải là thanh lịch nhất mặc dù nếu toLocaleDateString bao giờ thay đổi
James Murphy

Kết quả của toLocaleDateString không nhất quán cho tất cả người dùng, vì vậy có thể không tạo ra kết quả theo yêu cầu của OP.
RobG

4

Đối với tất cả những người đang sử dụng các nỗ lực phân tách, cắt lát và các nỗ lực dựa trên chuỗi khác để lấy ngày, bạn có thể tự thiết lập cho mình không thành công liên quan đến múi giờ!

Chuỗi ISO có Múi giờ Zulu và ngày theo múi giờ này, có nghĩa là, nó có thể sử dụng ngày trước hoặc muộn hơn một ngày so với múi giờ thực tế mà bạn phải tính đến trong chuỗi chuyển đổi của mình.

Xem ví dụ này:

const timeZoneRelatedDate = new Date(2020, 0, 14, 0, 0);

console.log(timeZoneRelatedDate.toLocaleDateString(
    'ja-JP', 
    {
      year: 'numeric',
      month: '2-digit',
      day: '2-digit'
    }
).replace(/\//gi,'-'));

// RESULT: "2020-01-14"

console.log(timeZoneRelatedDate.toISOString());

// RESULT: "2020-01-13T23:00:00.000Z" (for me in UTC+1)

console.log(timeZoneRelatedDate.toISOString().slice(0,10));

// RESULT: "2020-01-13"

3

Nếu bạn có đối tượng ngày tháng:

let date = new Date()
let result = date.toISOString().split`T`[0]

console.log(result)

hoặc là

let date = new Date()
let result = date.toISOString().slice(0, 10)

console.log(result)


1
toISOString sử dụng UTC, sẽ tạo ra ngày địa phương sai trong khoảng thời gian chênh lệch múi giờ địa phương từ nửa đêm.
RobG

1

Để mở rộng giải pháp của rk rk : Trong trường hợp bạn muốn định dạng bao gồm thời gian, bạn có thể thêm toTimeString()chuỗi vào chuỗi của mình, rồi tách phần GMT, như sau:

var d = new Date('2013-03-10T02:00:00Z');
var fd = d.toLocaleDateString() + ' ' + d.toTimeString().substring(0, d.toTimeString().indexOf("GMT"));

0

Tôi đã sử dụng cái này:

HTMLDatetoIsoDate(htmlDate){
  let year = Number(htmlDate.toString().substring(0, 4))
  let month = Number(htmlDate.toString().substring(5, 7))
  let day = Number(htmlDate.toString().substring(8, 10))
  return new Date(year, month - 1, day)
}

isoDateToHtmlDate(isoDate){
  let date = new Date(isoDate);
  let dtString = ''
  let monthString = ''
  if (date.getDate() < 10) {
    dtString = '0' + date.getDate();
  } else {
    dtString = String(date.getDate())
  }
  if (date.getMonth()+1 < 10) {
    monthString = '0' + Number(date.getMonth()+1);
  } else {
    monthString = String(date.getMonth()+1);
  }
  return date.getFullYear()+'-' + monthString + '-'+dtString
}

Nguồn: http://gooplus.fr/vi/2017/07/13/angular2-typescript-isodate-to-html-date/



0
let dt = new Date('2013-03-10T02:00:00Z');
let dd = dt.getDate();
let mm = dt.getMonth() + 1;
let yyyy = dt.getFullYear();

if (dd<10) {
    dd = '0' + dd;
}
if (mm<10) {
    mm = '0' + mm;
}
return yyyy + '-' + mm + '-' + dd;

0

Một phiên bản câu trả lời hay hơn của @Hozefa .

Nếu bạn đã date-fnscài đặt, bạn có thể sử dụng chức năng formatISO

const date = new Date(2019, 0, 2)
import { formatISO } from 'date-fns'
formatISO(date, { representation: 'date' }) // '2019-01-02' string

-4

Sử dụng mã dưới đây. Nó hữu ích cho bạn.

let currentDate = new Date()
currentDate.toISOString()
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.