Nhận chuỗi ở định dạng YYYYMMDD từ đối tượng ngày JS?


398

Tôi đang cố gắng sử dụng JS để biến date objectmột chuỗi thành YYYYMMDDđịnh dạng. Có một cách dễ dàng hơn concatenating Date.getYear(), Date.getMonth()Date.getDay()?


4
Kết hợp ba người đó là con đường để đi
Juan Cortés

5
nếu bạn muốn một chuỗi phân tích đến cùng một ngày, đừng quên tăng tháng. Để khớp với thông số kỹ thuật của bạn, bạn cũng cần phải điền các chữ số đơn trong tháng và ngày với '0'
kennebec

Câu trả lời:


621

Tôi đã sử dụng đoạn mã bị thay đổi:

Date.prototype.yyyymmdd = function() {
  var mm = this.getMonth() + 1; // getMonth() is zero-based
  var dd = this.getDate();

  return [this.getFullYear(),
          (mm>9 ? '' : '0') + mm,
          (dd>9 ? '' : '0') + dd
         ].join('');
};

var date = new Date();
date.yyyymmdd();

16
Bạn nên thay thế [1]bằng .length===2, bởi vì một bộ chỉ mục trên chuỗi không được hỗ trợ đầy đủ. Xem câu trả lời này cho lý do tại sao.
Aidiakapi

6
var mm = (this.getMonth () + 101) .toStrung (). chuỗi con (0, 2);
9dan

7
Đối với bất cứ ai muốn một ví dụ thực tế của sửa chữa @Aidiakapi 's, tôi tạo ra một fiddle đây: jsfiddle.net/pcr8xbt5/1
killercowuk

1
Nếu bạn muốn có dấu phân cách dấu chấm:[this.getFullYear(), mm<10 ? '0'+ mm: mm, dd<10 ? '0'+ dd : dd].join('.')
Kamil Kiełczewski

3
@ 9dan không nên nó đượcvar mm = (this.getMonth() + 101).toString().substring(1, 3)
Pnar SBI Wer

317

Tôi không thích thêm vào nguyên mẫu. Một thay thế sẽ là:

var rightNow = new Date();
var res = rightNow.toISOString().slice(0,10).replace(/-/g,"");

<!-- Next line is for code snippet output only -->
document.body.innerHTML += res;


51
Nếu bạn không cần rightNowbiến xung quanh, bạn có thể gói new Datevà lấy lại tất cả trong một dòng:(new Date()).toISOString().slice(0,10).replace(/-/g,"")
BigBlueHat

5
Tôi muốn YYYYMMDDHHmmSSsss, vì vậy tôi đã làm điều này : var ds = (new Date()).toISOString().replace(/[^0-9]/g, "");. Khá đơn giản, nhưng nên được gói gọn.
Jess

65
Điều này sẽ không hoạt động nói chung như Date.toISOString () tạo ra một ngày được định dạng UTC và do đó có thể vượt qua các ranh giới ngày tùy thuộc vào múi giờ. Ví dụ: trong GMT + 1: (Ngày mới (2013,13, 25)) .ISIString () == '2013-12-24T23: 00: 00.000Z'
weberste

26
Điều này sẽ thất bại nếu ai đó trong năm 10000 sẽ sử dụng mã 'hoài cổ' của bạn.
Trevi Awater

9
Một cải tiến được đề xuất để đối phó với các múi giờ. rightNow.setMinutes(rightNow.getMinutes() - rightNow.getTimezoneOffset()); rightNow.toISOString().slice(0,10)
Andreas

182

Bạn có thể sử dụng toISOStringchức năng:

var today = new Date();
today.toISOString().substring(0, 10);

Nó sẽ cung cấp cho bạn định dạng "yyyy-mm-dd".


24
Trong một số trường hợp, điều này sẽ không bao gồm đúng ngày, vì ánh sáng ban ngày múi giờ, v.v ...
Miguel

1
Có thể sự sáng tạo của tôi bị phá vỡ @Miguel, nhưng tôi không thể nghĩ đến trường hợp điều đó sẽ xảy ra. Bạn có phiền khi cung cấp một ví dụ?
đám mây

35
Nếu bạn ở múi giờ +1 và có ngày [2015-09-01 00:00:00 GMT + 1], thì phương thức toISOString () sẽ trả về chuỗi '2015-08-31T23: 00: 00.000Z 'bởi vì ngày được chuyển đổi thành UTC / 0-offset trước khi được xâu chuỗi.
Luke Baulch

Ngắn hơn một chút ... var hôm nay = (ngày mới ()). ToISOString (). Chuỗi con (0, 10);
teawithfruit

Thất bại với GMT khác nhau
Tobia

133

Moment.js có thể là bạn của bạn

var date = new Date();
var formattedDate = moment(date).format('YYYYMMDD');

18
Vâng, DID đã thêm 40kb (rút gọn, không phải gZip) vào app.js của tôi, nhưng tôi đã dùng nó, cảm ơn :).
Bart

câu trả lời tốt nhất cho đến nay!
TrulyXax

9
Tôi thậm chí không bận tâm chờ đợi cho đến khi tôi chắc chắn cần khoảnh khắc nữa, tôi chỉ cần thêm nó vào lúc bắt đầu của một dự án :)
martinedwards

1
Bạn có thể làm cho nó dễ dàng hơn:var formattedDate = moment().format('YYYYMMDD');
ns16

37

Nếu bạn không cần một giải pháp JS thuần túy, bạn có thể sử dụng Giao diện người dùng jQuery để thực hiện công việc như sau:

$.datepicker.formatDate('yymmdd', new Date());

Tôi thường không muốn nhập quá nhiều thư viện. Nhưng jQuery UI rất hữu ích, bạn có thể sẽ sử dụng nó ở một nơi khác trong dự án của bạn.

Truy cập http://api.jqueryui.com/datepicker/ để biết thêm ví dụ


37

Đây là một dòng mã duy nhất mà bạn có thể sử dụng để tạo một YYYY-MM-DDchuỗi ngày hôm nay.

var d = new Date().toISOString().slice(0,10);

^ này! FTW! +1 .. cần phải kiểm tra một chút mặc dù.
Gogol

21
Cảnh báo khó khăn, nếu ngày của bạn là 2016-01-01 00:00:00 GMT +2, nó sẽ trở lại 2015-12-31toISOString()sẽ cung cấp cho 2015-12-31T22: 00: 00 GMT +0 (hai giờ trước).
Jérôme Gillard

29
new Date('Jun 5 2016').
  toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).
  replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');

// => '2016-06-05'

5
Tâm hồn tốt nhất.
زياد

Vì một số lý do, cần thêm thời gian (ngay cả khi 00:00) để chuyển đổi không bỏ qua một ngày trở lại, khi tôi chạy công thức ở đây, bờ biển phía đông Hoa Kỳ. Khi tôi đã làm điều đó, nó bắt đầu làm việc đáng tin cậy. Điều tôi thích ở đây là nó có thể lấy ngày đầu vào ở nhiều định dạng, vì vậy tôi không phải lo lắng về điều đó nữa. new Date('Sun Mar 31 2019 00:00:00.000').toLocaleString('en-us', {year: 'numeric', month: '2-digit', day: '2-digit'}).replace(/(\d+)\/(\d+)\/(\d+)/, '$3-$1-$2');
nenea

24

Ngoài câu trả lời của oo, tôi muốn khuyên bạn nên tách các hoạt động logic khỏi trả về và thay vào đó đặt chúng làm ternary trong các biến.

Ngoài ra, sử dụng concat()để đảm bảo nối các biến an toàn

Date.prototype.yyyymmdd = function() {
  var yyyy = this.getFullYear();
  var mm = this.getMonth() < 9 ? "0" + (this.getMonth() + 1) : (this.getMonth() + 1); // getMonth() is zero-based
  var dd = this.getDate() < 10 ? "0" + this.getDate() : this.getDate();
  return "".concat(yyyy).concat(mm).concat(dd);
};

Date.prototype.yyyymmddhhmm = function() {
  var yyyymmdd = this.yyyymmdd();
  var hh = this.getHours() < 10 ? "0" + this.getHours() : this.getHours();
  var min = this.getMinutes() < 10 ? "0" + this.getMinutes() : this.getMinutes();
  return "".concat(yyyymmdd).concat(hh).concat(min);
};

Date.prototype.yyyymmddhhmmss = function() {
  var yyyymmddhhmm = this.yyyymmddhhmm();
  var ss = this.getSeconds() < 10 ? "0" + this.getSeconds() : this.getSeconds();
  return "".concat(yyyymmddhhmm).concat(ss);
};

var d = new Date();
document.getElementById("a").innerHTML = d.yyyymmdd();
document.getElementById("b").innerHTML = d.yyyymmddhhmm();
document.getElementById("c").innerHTML = d.yyyymmddhhmmss();
<div>
  yyyymmdd: <span id="a"></span>
</div>
<div>
  yyyymmddhhmm: <span id="b"></span>
</div>
<div>
  yyyymmddhhmmss: <span id="c"></span>
</div>


Nếu ai đó thích sử dụng điều đó, tôi đề nghị DRY ở đây, sử dụng lại các chức năng đã được tạo thay vì làm lại như vậy.
RiZKiT

@RiZKiT DRY là một nguyên tắc và không phải là một mô hình nhưng chắc chắn, điều này có thể được cải thiện rất nhiều. Nếu tôi sử dụng cái này ở đâu thì có lẽ tôi sẽ sử dụng một mẫu khác và di chuyển các phương thức ra khỏi nguyên mẫu. Tôi chủ yếu viết ví dụ để chỉ ra ở đó những cách khác để giải quyết vấn đề. Nơi mọi người mang nó từ đó là tùy thuộc vào chính họ
Eric Herlitz

Đẹp! Tôi sử dụng ("00" + (this.getDate())).slice(-2)để có được các số có hai chữ số. Không có câu lệnh "if" hoặc "?:" Và ít lệnh gọi đến hàm .getX (). Nếu không nhanh hơn một chút, thì ít nhất nó cũng dễ đọc hơn.
le hollandais volant

22

Tôi không thích sửa đổi các đối tượng bản địa và tôi nghĩ rằng phép nhân rõ ràng hơn chuỗi đệm giải pháp được chấp nhận.

function yyyymmdd(dateIn) {
  var yyyy = dateIn.getFullYear();
  var mm = dateIn.getMonth() + 1; // getMonth() is zero-based
  var dd = dateIn.getDate();
  return String(10000 * yyyy + 100 * mm + dd); // Leading zeros for mm and dd
}

var today = new Date();
console.log(yyyymmdd(today));

Câu đố: http://jsfiddle.net/gbdarren/Ew7Y4/


4
Câu trả lời này đã bị đánh giá thấp và tôi không biết tại sao. Tôi cảm thấy toán học nhanh hơn và rõ ràng hơn thao tác chuỗi. Nếu bất cứ ai biết tại sao đây là một câu trả lời xấu, xin vui lòng cho tôi biết.
Darren Griffith

4
Bộ nhân 10000 có sẵn để dịch chuyển trái YYYY theo 4 vị trí (mỗi chữ số tháng và ngày cần 2 chữ số) và không liên quan gì đến lỗi Y10K. Tôi thích câu trả lời này và nó xứng đáng được tôn trọng!
A. Masson

1
Cảm ơn câu trả lời này, tôi đã tạo ra fiddle ở đây jsfiddle.net/amwebexpert/L6j0omb4
A. Masson

1
Tôi hoàn toàn không cần phép nhân và tôi không hiểu tại sao nó lại ở đó. jsfiddle.net/neefjax2/gbqmv0t5 Nếu không, hãy bỏ qua nó, và đây là một câu trả lời tuyệt vời và giúp tôi rất nhiều.
vapcguy

1
@ D-Money Ah, tôi đã hiểu ý của bạn - bạn đang thực hiện ghép một loại khác bằng cách cộng các số lại với nhau để tránh chúng thực hiện một phép toán khác nhau - một thao tác không cho phép một phép toán bình thường ' ve đã làm họ bối rối Làm tốt lắm! Của tôi hoạt động vì tôi đang sử dụng các dấu phân cách (mà tôi phải thực hiện .replace('-', '')để làm cho nó trả lời câu hỏi của OP), trong khi bạn đúng với câu hỏi ban đầu của OP và nó sẽ không yêu cầu thêm bước đó. Thông minh!
vapcguy

15

Giải pháp Plain JS (ES5) mà không có bất kỳ sự cố nhảy ngày nào có thể xảy ra do in Date.toISOString () trong UTC:

var now = new Date();
var todayUTC = new Date(Date.UTC(now.getFullYear(), now.getMonth(), now.getDate()));
return todayUTC.toISOString().slice(0, 10).replace(/-/g, '');

Điều này để đáp lại nhận xét của @ weberste về câu trả lời của @Pierre Guilbert.


now.getMonth () sẽ trả về 0 cho tháng 1, nó sẽ là (now.getMonth () + 1)
Jas

2
Sai lầm. Hàm UTC của ngày dự kiến ​​tháng sẽ nằm trong khoảng từ 0 đến 11 (nhưng cho phép <0 và> 11 khác).
túc xá

Tại sao bạn thay thế nhiều dấu gạch ngang bằng một dấu gạch ngang? Có thể toISOStringtrả lại nhiều dấu gạch nối tiếp nhau?
Michaël Witrant

Michael - anh ta đang thay thế mỗi dấu gạch nối được tìm thấy bằng một dấu gạch nối duy nhất. Vẫn không biết tại sao (có lẽ chuỗi thay thế chỉ là một trình giữ chỗ cho dấu phân cách). 'G' có nghĩa là tất cả các lần xuất hiện. Mẫu bạn đang nghĩ đến là / [-] + / g
Gerard ONeill

2
Bạn làm cho ngày của tôi. Tôi đã tìm kiếm nhiều ngày để tìm cách đơn giản để vượt qua việc xử lý TimeZone khủng khiếp trong Javascript và đây là một mẹo nhỏ!
Guillaume F.

10

// UTC/GMT 0
document.write('UTC/GMT 0: ' + (new Date()).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812013509

// Client local time
document.write('<br/>Local time: ' + (new Date(Date.now()-(new Date()).getTimezoneOffset() * 60000)).toISOString().slice(0, 19).replace(/[^0-9]/g, "")); // 20150812113509


Đây là câu trả lời tôi đã sử dụng. Một lớp lót có tính đến múi giờ. Để trả lời câu hỏi của người gửi ban đầu, chúng tôi có thể làm: (Ngày mới (Date.now () - (Ngày mới ()). GetTimezone Offerset () * 60000)). ToISOString (). Thay thế (/ [^ 0-9] / g, "") .slice (0,8)
tomwood

thx, để có được YYYY-MM-DD tôi đã sử dụng: Ngày mới (Date.now () - (Ngày mới ()). getTimezone Offerset () * 60000) .toISOString (). lát (0, 10) .replace (/ [ ^ 0-9] / g, "-")
Nick Humphrey

7

var someDate = new Date();
var dateFormated = someDate.toISOString().substr(0,10);

console.log(dateFormated);


Rất thông minh. Cảm ơn bạn
JMaylin

4
Sẽ không hoạt động vì Ngày mới () có múi giờ và Ngày.toISOString () là UTC. Xem câu trả lời của tôi.
túc xá

@Dormouse không phải là cách khác? new Date()tạo một đối tượng ngày mới chỉ là một trình bao bọc xung quanh nr. của ms kể từ 1970/01/01 00: 00: 00.000 UTC. Sau đó toISOStringin ra trong múi giờ địa phương.
Stijn de Witt

Không in, Date.toISOString () in bằng UTC.
túc xá

7

Một cách khác là sử dụng toLocaleDateStringvới một miền địa phương có tiêu chuẩn định dạng ngày cuối lớn , chẳng hạn như Thụy Điển, Litva, Hungary, Hàn Quốc, ...:

date.toLocaleDateString('se')

Để loại bỏ các dấu phân cách ( -) chỉ là vấn đề thay thế các chữ số không:

console.log( new Date().toLocaleDateString('se').replace(/\D/g, '') );

Điều này không có lỗi tiềm ẩn mà bạn có thể gặp phải với các định dạng ngày UTC: ngày UTC có thể được nghỉ một ngày so với ngày trong múi giờ địa phương.


6

Bạn chỉ có thể sử dụng mã một dòng này để lấy ngày trong năm

var date = new Date().getFullYear() + "-" + (parseInt(new Date().getMonth()) + 1) + "-" + new Date().getDate();

5

Phiên bản đơn giản hóa một chút cho câu trả lời phổ biến nhất trong chủ đề này https://stackoverflow.com/a/3067896/5437379 :

function toYYYYMMDD(d) {
    var yyyy = d.getFullYear().toString();
    var mm = (d.getMonth() + 101).toString().slice(-2);
    var dd = (d.getDate() + 100).toString().slice(-2);
    return yyyy + mm + dd;
}

5

dateformat là một gói rất được sử dụng.

Cách sử dụng:

Tải xuống và cài đặt dateformattừ NPM. Yêu cầu nó trong mô-đun của bạn:

const dateFormat = require('dateformat');

và sau đó chỉ định dạng công cụ của bạn:

const myYYYYmmddDate = dateformat(new Date(), 'yyyy-mm-dd');


4

Anh chàng này ở đây => http://blog.stevenlevithan.com/archives/date-time-format đã viết một format()chức năng cho JavascriptDate đối tượng , vì vậy nó có thể được sử dụng với các định dạng theo nghĩa đen quen thuộc.

Nếu bạn cần định dạng Ngày đầy đủ tính năng trong Javascript của ứng dụng, hãy sử dụng nó. Mặt khác, nếu những gì bạn muốn làm là một cái, thì việc ghép getYear (), getMonth (), getDay () có lẽ là dễ nhất.


4

Làm việc từ câu trả lời của @ oo, điều này sẽ trả lại cho bạn chuỗi ngày theo chuỗi định dạng. Bạn có thể dễ dàng thêm regex năm 2 chữ số cho năm & mili giây và tương tự nếu bạn cần chúng.

Date.prototype.getFromFormat = function(format) {
    var yyyy = this.getFullYear().toString();
    format = format.replace(/yyyy/g, yyyy)
    var mm = (this.getMonth()+1).toString(); 
    format = format.replace(/mm/g, (mm[1]?mm:"0"+mm[0]));
    var dd  = this.getDate().toString();
    format = format.replace(/dd/g, (dd[1]?dd:"0"+dd[0]));
    var hh = this.getHours().toString();
    format = format.replace(/hh/g, (hh[1]?hh:"0"+hh[0]));
    var ii = this.getMinutes().toString();
    format = format.replace(/ii/g, (ii[1]?ii:"0"+ii[0]));
    var ss  = this.getSeconds().toString();
    format = format.replace(/ss/g, (ss[1]?ss:"0"+ss[0]));
    return format;
};

d = new Date();
var date = d.getFromFormat('yyyy-mm-dd hh:ii:ss');
alert(date);

Tuy nhiên, tôi không biết nó hiệu quả đến mức nào, đặc biệt là rất khôn ngoan vì nó sử dụng rất nhiều regex. Nó có thể sử dụng một số công việc tôi không thành thạo js thuần túy.


4

Mã này được sửa theo câu trả lời của Pierre Guilbert:

(nó hoạt động ngay cả sau 10000 năm)

YYYYMMDD=new Date().toISOString().slice(0,new Date().toISOString().indexOf("T")).replace(/-/g,"")


3

Tôi thường sử dụng mã dưới đây khi tôi cần làm điều này.

var date = new Date($.now());
var dateString = (date.getFullYear() + '-'
    + ('0' + (date.getMonth() + 1)).slice(-2)
    + '-' + ('0' + (date.getDate())).slice(-2));
console.log(dateString); //Will print "2015-09-18" when this comment was written

Để giải thích, .slice (-2) cung cấp cho chúng ta hai ký tự cuối cùng của chuỗi.

Vì vậy, không có vấn đề gì, chúng ta có thể thêm "0" vào ngày hoặc tháng và chỉ yêu cầu hai lần cuối vì đó luôn là hai số chúng ta muốn.

Vì vậy, nếu MyDate.getMonth () trả về 9, nó sẽ là:

("0" + "9") // Giving us "09"

vì vậy việc thêm .slice (-2) vào đó sẽ cho chúng ta hai ký tự cuối cùng là:

("0" + "9").slice(-2)

"09"

Nhưng nếu date.getMonth () trả về 10, nó sẽ là:

("0" + "10") // Giving us "010"

vì vậy việc thêm .slice (-2) cho chúng ta hai ký tự cuối cùng, hoặc:

("0" + "10").slice(-2)

"10"

3

Nếu sử dụng AngularJs (tối đa 1,5), bạn có thể sử dụng bộ lọc ngày :

var formattedDate = $filter('date')(myDate, 'yyyyMMdd')

3

Trả lời khác cho đơn giản và dễ đọc.
Ngoài ra, việc chỉnh sửa các thành viên lớp được xác định trước bằng các phương thức mới không được khuyến khích:

function getDateInYYYYMMDD() {
    let currentDate = new Date();

    // year
    let yyyy = '' + currentDate.getFullYear();

    // month
    let mm = ('0' + (currentDate.getMonth() + 1));  // prepend 0 // +1 is because Jan is 0
    mm = mm.substr(mm.length - 2);                  // take last 2 chars

    // day
    let dd = ('0' + currentDate.getDate());         // prepend 0
    dd = dd.substr(dd.length - 2);                  // take last 2 chars

    return yyyy + "" + mm + "" + dd;
}

var currentDateYYYYMMDD = getDateInYYYYMMDD();
console.log('currentDateYYYYMMDD: ' + currentDateYYYYMMDD);


2

Nếu bạn không bao gồm một thư viện bổ sung (nhưng nhỏ), Sugar.js cung cấp nhiều chức năng hay để làm việc với các ngày trong JavaScript. Để định dạng một ngày, sử dụng chức năng định dạng :

new Date().format("{yyyy}{MM}{dd}")

2

yyyymmdd=x=>(f=x=>(x<10&&'0')+x,x.getFullYear()+f(x.getMonth()+1)+f(x.getDate()));
alert(yyyymmdd(new Date));


1
thêm một số mô tả vào câu trả lời của bạn sẽ giúp bạn tăng cường cố gắng mô tả một chút những gì bạn đang làm trong mã này để những người khác có thể hiểu rõ hơn về nó.
Muhammad Omer Aslam

Trong chế độ nghiêm ngặt hoặc bản đánh máy, hãy sử dụng "let f, yyyymmdd = x => ...". Hàm yyyymmdd và f không được xác định.
Tối đa


2

Sử dụng padStart :

Date.prototype.yyyymmdd = function() {
    return [
        this.getFullYear(),
        (this.getMonth()+1).toString().padStart(2, '0'), // getMonth() is zero-based
        this.getDate().toString().padStart(2, '0')
    ].join('-');
};

1

Đây là một cách tiếp cận chung hơn cho phép cả hai thành phần ngàythời gian và có thể sắp xếp giống hệt nhau theo số hoặc chuỗi.

Dựa trên thứ tự số của định dạng ISO ngày, chuyển đổi thành múi giờ địa phương và xóa các chữ số không. I E:

// monkey patch version
Date.prototype.IsoNum = function (n) {
    var tzoffset = this.getTimezoneOffset() * 60000; //offset in milliseconds
    var localISOTime = (new Date(this - tzoffset)).toISOString().slice(0,-1);
    return localISOTime.replace(/[-T:\.Z]/g, '').substring(0,n || 20); // YYYYMMDD
}

Sử dụng

var d = new Date();
// Tue Jul 28 2015 15:02:53 GMT+0200 (W. Europe Daylight Time)
console.log(d.IsoNum(8));  // "20150728"
console.log(d.IsoNum(12)); // "201507281502"
console.log(d.IsoNum());   // "20150728150253272"

1

Javascript gốc:

new Date().toLocaleString('zu-ZA').slice(0,10).replace(/-/g,'');

1
Điều này không đệm tháng với 0 để đảm bảo tháng có 2 chữ số.
Attila Szeremi

Bạn đúng. Sau này tôi nhận thấy điều này. Bạn phải cẩn thận kiểm tra định dạng ngày trên hai chữ số tháng và ngày.
Lonnie hay nhất
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.