Là đối tượng ngày Javascript luôn luôn nghỉ một ngày?


238

Trong ứng dụng Java Script của tôi, tôi có ngày được lưu trữ theo định dạng như vậy:

2011-09-24

Bây giờ khi tôi thử sử dụng giá trị trên để tạo một đối tượng Ngày mới (để tôi có thể truy xuất ngày ở định dạng khác), ngày luôn quay trở lại vào một ngày. Xem bên dưới:

var doo = new Date("2011-09-24");
console.log(doo);

nhật ký:

Fri Sep 23 2011 20:00:00 GMT-0400 (Eastern Daylight Time)

11
Lớp ngày của Javascript không đại diện cho một ngày, nó đại diện cho dấu thời gian (giống trong Java). Để làm cho nó một ngày, nó sử dụng múi giờ và đó là nguyên nhân của vấn đề của bạn. Nó phân tích cú pháp với múi giờ GMT / UTC (ngày 24 tháng 9 năm 2011, 00:00 giờ UTC) và sau đó xuất ra nó với múi giờ khác là 4 giờ (ngày 23 tháng 9 năm 2011, 20 : 00 GMT-0400).
Codo

2
Tôi nhận được "ngày không hợp lệ". Thay thế các ký tự '-' bằng các ký tự '/' và thử lại. Hoặc chia ngày thành các bit của nó và đặt riêng các thành phần (nếu bạn làm điều đó, hãy trừ 1 từ số tháng).
RobG

@Codo - vâng, trả lời tốt. ECMA-262 15.9.1.15 được áp dụng. OP nên sử dụng "2011-09-24T20: 00: 00-04: 00" hoặc tương tự.
RobG

1
Tôi thấy rằng định dạng "ngày 24 tháng 9 năm 2011" sẽ trả về ngày thích hợp. Xem ở đây để được giải thích: stackoverflow.com/questions/2587345/javascript-date-parse
christurnerio

Câu trả lời:


98

Lưu ý rằng Giờ ban ngày miền Đông là -4 hoursvà giờ vào ngày bạn quay lại 20.

20h + 4h = 24h

đó là nửa đêm 2011-09-24. Ngày được phân tích cú pháp trong UTC (GMT) vì bạn đã cung cấp chuỗi chỉ ngày mà không có bất kỳ chỉ báo múi giờ nào. Nếu bạn đã đưa ra một chuỗi ngày / thời gian thay vào đó là một chỉ báo (new Date("2011-09-24T00:00:00") ), thì nó sẽ được phân tích cú pháp trong múi giờ địa phương của bạn. (Trong lịch sử đã có sự không nhất quán ở đó, không chỉ bởi vì thông số kỹ thuật đã thay đổi nhiều lần, nhưng các trình duyệt hiện đại sẽ ổn; hoặc bạn luôn có thể bao gồm chỉ báo múi giờ.)

Bạn đang nhận đúng ngày, bạn không bao giờ chỉ định múi giờ chính xác.

Nếu bạn cần truy cập các giá trị ngày, bạn có thể sử dụng getUTCDate()hoặc bất kỳ getUTC*()chức năng nào khác :

var d,
    days;
d = new Date('2011-09-24');
days = ['Sun', 'Mon', 'Tues', 'Wed', 'Thurs', 'Fri', 'Sat'];
console.log(days[d.getUTCDay()]);

24
Làm thế nào để bạn "chỉ định múi giờ chính xác"? Hàm tạo ngày luôn diễn giải chuỗi ngày là UTC, nhưng sau đó điều chỉnh theo múi giờ. Tôi thậm chí có thể thực hiện 'Ngày mới (' 2012-01 / 02 EDT ') và vẫn chuyển nó trở lại ngày hôm trước do áp dụng bù cho tiết kiệm ánh sáng ban ngày, điều này vô nghĩa vì nếu tôi nói với bạn đó là ngày theo múi giờ địa phương hiện tại của EDT, sau đó không áp dụng một phần bù bổ sung cho nó. Tôi nói với nó múi giờ là EDT nhưng nó vẫn áp dụng một phầnbổ sung di chuyển nó trở lại một ngày.
AaronLS

1
@AaronLS, EDTthời gian tiết kiệm ánh sáng ban ngày (còn được gọi là thời gian mùa hè) , ESTlà múi giờ áp dụng vào tháng Giêng.
zzzzBov

1
Tạo nó như chỉ là UTC từ một chuỗi sẽ là điều tôi muốn làm, do đó tại sao tôi hỏi "Làm thế nào để bạn" chỉ định múi giờ chính xác "?" liên quan đến nơi bạn đã nêu "bạn chỉ không bao giờ chỉ định múi giờ chính xác.". Nếu tôi làm điều new Date('2012-01-01 GMT')đó vẫn áp dụng bù trừ vì nó chuyển đổi nó thành giờ ngày địa phương của người dùng.
AaronLS

7
@AaronLS, nếu bạn buộc phải sử dụng các get*phương thức và cần nó để trả về ngày / giờ chính xác bao gồm cả phần bù múi giờ chưa biết, chỉ cần thêm vào phần bù múi giờ chưa biết: d = new Date('2013-01-08 GMT'); d.setMinutes(d.getMinutes() + d.getTimezoneOffset());Điều này sẽ bình thường hóa ngày vào vị trí của người dùng để .get*phương thức trả về giá trị mong đợi. Các .getUTC*phương pháp sau đó sẽ không chính xác, vì vậy hãy cẩn thận.
zzzzBov

1
Có một sự khác biệt giữa việc xác định hành vi để cung cấp một tham chiếu và sử dụng nó như một lối thoát khi những người thực hiện không thực hiện đúng một cái gì đó. Và nó không giống như đại diện nếu dữ liệu không đúng với mong đợi.
Cơn thịnh nộ bất đồng chính kiến

252

một số điều điên rồ xảy ra với đối tượng JS DATE chuyển đổi chuỗi, ví dụ, hãy xem xét ngày sau bạn đã cung cấp

Lưu ý: Các ví dụ sau có thể có hoặc không TẮT MỘT NGÀY tùy thuộc vào múi giờ và thời gian hiện tại của BẠN .

new Date("2011-09-24"); // Year-Month-Day
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Tuy nhiên, nếu chúng tôi sắp xếp lại định dạng chuỗi thành Tháng-Năm ...

new Date("09-24-2011");
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Một cái lạ khác

new Date("2011-09-24");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF AS BEFORE.

new Date("2011/09/24"); // change from "-" to "/".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Chúng tôi có thể dễ dàng thay đổi dấu gạch ngang trong ngày của bạn "2011-09-24" khi thực hiện một ngày mới

new Date("2011-09-24".replace(/-/g, '\/')); // => "2011/09/24".
=> // Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

Điều gì xảy ra nếu chúng ta có chuỗi ngày như "2011-09-24T00: 00: 00"

new Date("2011-09-24T00:00:00");
// => Fri Sep 23 2011 17:00:00 GMT-0700 (MST) - ONE DAY OFF.

Bây giờ thay đổi dấu gạch nối để chuyển tiếp dấu gạch chéo như trước; chuyện gì xảy ra

new Date("2011/09/24T00:00:00");
// => Invalid Date

Tôi thường phải quản lý định dạng ngày 2011-09-24T00: 00: 00 vì vậy đây là những gì tôi làm.

new Date("2011-09-24T00:00:00".replace(/-/g, '\/').replace(/T.+/, ''));
// => Sat Sep 24 2011 00:00:00 GMT-0700 (MST) - CORRECT DATE.

CẬP NHẬT

Nếu bạn cung cấp các đối số riêng cho hàm tạo Ngày, bạn có thể nhận các đầu ra hữu ích khác như được mô tả bên dưới

Lưu ý: đối số có thể là kiểu Số hoặc Chuỗi. Tôi sẽ đưa ra các ví dụ với các giá trị hỗn hợp.

Nhận tháng đầu tiên và ngày của một năm nhất định

new Date(2011, 0); // Normal behavior as months in this case are zero based.
=> // Sat Jan 01 2011 00:00:00 GMT-0700 (MST)

Nhận tháng cuối cùng và ngày của một năm

new Date((2011 + 1), 0, 0); // The second zero roles back one day into the previous month's last day.
=> // Sat Dec 31 2011 00:00:00 GMT-0700 (MST)

Ví dụ về số, đối số chuỗi. Lưu ý tháng là tháng ba vì không dựa trên tháng nữa.

new Date(2011, "02"); 
=> // Tue Mar 01 2011 00:00:00 GMT-0700 (MST)

Nếu chúng ta làm điều tương tự nhưng với một ngày bằng không, chúng ta sẽ có được điều gì đó khác biệt.

new Date(2011, "02", 0); // again the zero roles back from March to the last day of February.
=> // Mon Feb 28 2011 00:00:00 GMT-0700 (MST)

Thêm một ngày bằng không vào bất kỳ đối số năm và tháng nào sẽ có được ngày cuối cùng của tháng trước. Nếu bạn tiếp tục với số âm, bạn có thể tiếp tục quay lại vào một ngày khác

new Date(2011, "02", -1);
=> // Sun Feb 27 2011 00:00:00 GMT-0700 (MST)

12
Điều này thực sự đã giúp tôi tốt nhất. Tôi vừa thêm .replace (/ - / g, '\ /'). Thay thế (/ T. + /, '') Vào cuối dữ liệu của tôi khi tôi thực hiện một ngày mới. Siêu dễ!
Devin Prejean

64
Wow - javascript không nhất quán khủng khiếp.
psparrow

2
Các cuộc gọi .replace () thực sự giúp ích rất nhiều cho buổi tối hôm nay.
không sử dụng

2
vâng tôi đã kiểm tra tất cả điều này, và nó thực sự kỳ lạ.
chintan adatiya

26
Tất cả điều này là do hành vi của Date.parse () đang cố gắng tuân theo ISO 8601. Khi chuỗi ngày theo định dạng yyyy-mm-dd, nó được coi là ISO 8601 với UTC ẩn 00:00. Khi chuỗi lệch khỏi định dạng (ví dụ: mm-dd-yyyy hoặc dấu gạch chéo thay vì dấu gạch nối), nó sẽ rơi trở lại trình phân tích cú pháp lỏng hơn theo RFC 2822, sử dụng thời gian cục bộ khi không có múi giờ. Phải thừa nhận rằng, tất cả điều này sẽ khá phức tạp đối với một người bình thường.
Mizstik

71

Để bình thường hóa ngày và loại bỏ phần bù không mong muốn (được thử nghiệm tại đây: https://jsfiddle.net/7xp1xL5m/ ):

var doo = new Date("2011-09-24");
console.log(  new Date( doo.getTime() + Math.abs(doo.getTimezoneOffset()*60000) )  );
// Output: Sat Sep 24 2011 00:00:00 GMT-0400 (Eastern Daylight Time)

Điều này cũng hoàn thành tương tự và tín dụng cho @tpartee (đã thử nghiệm tại đây: https://jsfiddle.net/7xp1xL5m/1/ ):

var doo = new Date("2011-09-24");
console.log( new Date( doo.getTime() - doo.getTimezoneOffset() * -60000 )  );

Điều này đã làm điều đó cho tôi - tôi đã phải làm việc với các ngày từ một API sau đó sắp xếp / so sánh chúng, vì vậy chỉ cần thêm phần bù múi giờ hoạt động tốt nhất.
chakena

Điều này làm việc cho tôi ngoại trừ tôi phải trừ thời gianZone Offerset, không thêm nó
ErikAGriffin

@ErikAGriffin Bạn có ở múi giờ tích cực, IE GMT + 0X00 thay vì GMT-0X00 không?
AaronLS

Tôi đã làm một cái gì đó tương tự:doo.setMinutes(doo.getMinutes() + doo.getTimezoneOffset())
Dissident Rage

2
@AaronLS Bạn đã đi đúng hướng nhưng logic hơi sai. Để bù cho TZ bù, logic chính xác là: console.log (Ngày mới (doo.getTime () - doo.getTimezone Offerset () * -60000)); - Dấu của phần bù rất quan trọng và không thể được loại bỏ hoàn toàn nhưng bạn cũng cần có dấu nghịch đảo để hiệu chỉnh để chúng tôi nhân số bù với -60000 để áp dụng dấu nghịch đảo.
sinh viên

28

Nếu bạn muốn nhận giờ 0 của một số ngày trong múi giờ địa phương, hãy chuyển các phần ngày riêng lẻ cho nhà Datexây dựng.

new Date(2011,08,24); // month value is 0 based, others are 1 based.

26

Chỉ muốn thêm rằng dường như thêm một khoảng trắng ở cuối chuỗi sẽ sử dụng UTC để tạo.

new Date("2016-07-06")
> Tue Jul 05 2016 17:00:00 GMT-0700 (Pacific Daylight Time)

new Date("2016-07-06 ")
> Wed Jul 06 2016 00:00:00 GMT-0700 (Pacific Daylight Time)

Chỉnh sửa: Đây không phải là một giải pháp được đề xuất, chỉ là một câu trả lời thay thế. Xin vui lòng không sử dụng phương pháp này vì nó không rõ ràng những gì đang xảy ra. Có một số cách mà ai đó có thể tái cấu trúc điều này vô tình gây ra lỗi.


Đối với ví dụ có khoảng trống ở cuối, bảng điều khiển trả về "Ngày không hợp lệ = $ 2"
Rủi ro Brian

1
hoạt động rất tốt Ngày mới (data.Date + "") .toLocaleDateString ("en-US")
Nakres

Công bằng mà nói, đây chỉ là một câu trả lời thay thế, và không phải là một giải pháp được đề xuất.
Kyle Shrader

25

Tôi tin rằng nó phải làm với điều chỉnh múi giờ. Ngày bạn đã tạo là GMT và thời gian mặc định là nửa đêm, nhưng múi giờ của bạn là EDT, vì vậy nó trừ đi 4 giờ. Hãy thử điều này để xác minh:

var doo = new Date("2011-09-25 EDT");

3
Đây là câu trả lời tốt nhất ở đây. + 1 triệu cho việc sử dụng chuỗi nội địa hóa múi giờ tích hợp thay vì chuyển đổi theo chương trình.
hỏi

2
Cái này giúp. Nó hoạt động như thế này: $ scope.dat = new Date (datestring + 'EDT'). Lưu ý sự khác biệt giữa EDT và EST mặc dù: liên kết
Weihui Guo

Tôi không biết những gì xảy ra đằng sau hậu trường, nhưng nó hoạt động hoàn hảo.
the_haystacker

Điều này tôi sẽ nói là đơn giản nhất của câu trả lời và ít định dạng lại mã.
Michael

Cảm ơn, tôi xem xét cách tốt nhất cho tôi.
Janderson Constantino

11

Vấn đề của bạn là đặc biệt với múi giờ. Lưu ý một phần GMT-0400- đó là bạn chậm 4 giờ so với GMT. Nếu bạn thêm 4 giờ vào ngày / giờ được hiển thị, bạn sẽ nhận được chính xác nửa đêm 2011/09/24. Sử dụng toUTCString()phương pháp thay thế để có được chuỗi GMT:

var doo = new Date("2011-09-24");
console.log(doo.toUTCString());

6

Đây có lẽ không phải là một câu trả lời hay, nhưng tôi chỉ muốn chia sẻ kinh nghiệm của mình với vấn đề này.

Ứng dụng của tôi trên toàn cầu sử dụng ngày utc với định dạng 'YYYY-MM-DD', trong khi plugin datepicker tôi chỉ sử dụng chấp nhận ngày js, thật khó để tôi xem xét cả utc và js. Vì vậy, khi tôi muốn chuyển một ngày được định dạng 'YYYY-MM-DD' sang công cụ hẹn hò của mình, trước tiên tôi chuyển đổi nó thành định dạng 'MM / DD / YYYY' bằng cách sử dụng khoảnh khắc hoặc bất cứ điều gì bạn thích, và ngày hiện tại chính xác. Ví dụ của bạn

var d = new Date('2011-09-24'); // d will be 'Fri Sep 23 2011 20:00:00 GMT-0400 (EDT)' for my lacale
var d1 = new Date('09/24/2011'); // d1 will be 'Sat Sep 24 2011 00:00:00 GMT-0400 (EDT)' for my lacale

Rõ ràng d1 là những gì tôi muốn. Hy vọng điều này sẽ hữu ích cho một số người.


Chỉ cần chuyển đổi các định dạng như bạn đã làm, làm việc tương tự cho tôi. Thật ki cục.
jAC

5

Điều này thông qua tôi cho một vòng lặp, +1 trên câu trả lời của zzzBov. Đây là một chuyển đổi đầy đủ của một ngày làm việc cho tôi bằng các phương pháp UTC:

//myMeeting.MeetingDate = '2015-01-30T00:00:00'

var myDate = new Date(myMeeting.MeetingDate);
//convert to JavaScript date format
//returns date of 'Thu Jan 29 2015 19:00:00 GMT-0500 (Eastern Standard Time)' <-- One Day Off!

myDate = new Date(myDate.getUTCFullYear(), myDate.getUTCMonth(), myDate.getUTCDate());
//returns date of 'Fri Jan 30 2015 00:00:00 GMT-0500 (Eastern Standard Time)' <-- Correct Date!

4

Điều đó có nghĩa là 2011-09-24 00:00:00 GMT, và vì bạn đang ở GMT -4đó, nó sẽ là 20:00ngày hôm trước.

Cá nhân, tôi nhận được 2011-09-24 02:00:00, bởi vì tôi đang sống GMT +2.


3

Mặc dù trong trường hợp của OP, múi giờ là EDT, nhưng không đảm bảo người dùng thực thi tập lệnh của bạn sẽ là int múi giờ EDT, do đó, việc mã hóa phần bù không nhất thiết phải hoạt động. Giải pháp tôi tìm thấy chia tách chuỗi ngày và sử dụng các giá trị riêng biệt trong hàm tạo Ngày.

var dateString = "2011-09-24";
var dateParts = dateString.split("-");
var date = new Date(dateParts[0], dateParts[1] - 1, dateParts[2]);

Lưu ý rằng bạn phải tính đến một điều kỳ lạ khác của JS: tháng là không dựa trên.


2

Tôi đã gặp phải vấn đề chính xác này khi khách hàng của tôi đang ở trong Giờ chuẩn Đại Tây Dương. Giá trị ngày mà khách hàng đã truy xuất là "2018-11-23" và khi mã được chuyển vào new Date("2018-11-23")đầu ra cho máy khách là cho ngày hôm trước. Tôi đã tạo một hàm tiện ích như trong đoạn trích đã chuẩn hóa ngày, cung cấp cho khách hàng ngày dự kiến.

date.setMinutes(date.getMinutes() + date.getTimezoneOffset());

var normalizeDate = function(date) {
  date.setMinutes(date.getMinutes() + date.getTimezoneOffset());
  return date;
};

var date = new Date("2018-11-23");

document.getElementById("default").textContent = date;
document.getElementById("normalized").textContent = normalizeDate(date);
<h2>Calling new Date("2018-11-23")</h2>
<div>
  <label><b>Default</b> : </label>
  <span id="default"></span>
</div>
<hr>
<div>
  <label><b>Normalized</b> : </label>
  <span id="normalized"></span>
</div>


2

nếu bạn chỉ muốn đảm bảo các phần riêng biệt của ngày giữ nguyên cho mục đích hiển thị, * điều này dường như hoạt động, ngay cả khi tôi thay đổi múi giờ của mình:

var doo = new Date("2011-09-24 00:00:00")

chỉ cần thêm các số không trong đó.

Trong mã của tôi, tôi làm điều này:

let dateForDisplayToUser = 
  new Date( `${YYYYMMDDdateStringSeparatedByHyphensFromAPI} 00:00:00` )
  .toLocaleDateString( 
    'en-GB', 
    { day: 'numeric', month: 'short', year: 'numeric' }
  )

Và tôi chuyển xung quanh múi giờ của mình trên máy tính và ngày vẫn giống như chuỗi ngày yyyy-mm-dd tôi nhận được từ API.

Nhưng tôi có thiếu một cái gì đó / đây có phải là một ý tưởng tồi?

* ít nhất là bằng chrome. Điều này không hoạt động trong Safari! khi viết bài này


Khi bạn làm .toISOString(), nó sẽ quay lại 1 ngày.
vivek_23

new Date('2019/11/18 05:30:00').toISOString();làm việc cho tôi
vivek_23

1

Cách tốt nhất để xử lý việc này mà không cần sử dụng nhiều phương thức chuyển đổi,

 var mydate='2016,3,3';
 var utcDate = Date.parse(mydate);
 console.log(" You're getting back are 20.  20h + 4h = 24h :: "+utcDate);

Bây giờ chỉ cần thêm GMT trong ngày của bạn hoặc bạn có thể nối nó.

 var  mydateNew='2016,3,3'+ 'GMT';
 var utcDateNew = Date.parse(mydateNew);
 console.log("the right time that you want:"+utcDateNew)

Trực tiếp: https://jsfiddle.net/gajender/2kop9vrk/1/


1

Tôi phải đối mặt với một số vấn đề như thế này. Nhưng vấn đề của tôi là thiết lập tắt trong khi nhận được ngày từ cơ sở dữ liệu.

cái này được vuốt trong cơ sở dữ liệu và nó ở định dạng UTC.

2019-03-29 19: 00: 00.0000000: 00

Vì vậy, khi tôi nhận được từ cơ sở dữ liệu và kiểm tra ngày, nó sẽ thêm offset và gửi lại cho javascript.

nhập mô tả hình ảnh ở đây

Nó được thêm +05: 00 vì đây là múi giờ máy chủ của tôi. Khách hàng của tôi ở múi giờ khác +07: 00.

2019-03-28T19: 00: 00 + 05: 00 // đây là những gì tôi nhận được trong javascript.

Vì vậy, đây là giải pháp của tôi những gì tôi làm với vấn đề này.

var dates = price.deliveryDate.split(/-|T|:/);
var expDate = new Date(dates[0], dates[1] - 1, dates[2], dates[3], dates[4]);
var expirationDate = new Date(expDate);

Vì vậy, khi ngày đến từ máy chủ và có máy chủ bù, vì vậy tôi tách ngày và xóa máy chủ và sau đó chuyển đổi thành ngày. Nó giải quyết vấn đề của tôi.


1

Nếu bạn cần một giải pháp đơn giản cho việc này, hãy xem:

new Date('1993-01-20'.split('-')); 

nhập mô tả hình ảnh ở đây


0

Bạn đang sử dụng định dạng chuỗi ngày ISO, theo trang này , khiến ngày được xây dựng bằng múi giờ UTC:

Lưu ý: phân tích chuỗi ngày với hàm tạo Ngày (và Date.parse, chúng tương đương nhau) không được khuyến khích mạnh mẽ do sự khác biệt và không nhất quán của trình duyệt. Hỗ trợ cho các chuỗi định dạng RFC 2822 chỉ theo quy ước. Hỗ trợ cho các định dạng ISO 8601 khác nhau trong các chuỗi chỉ ngày đó (ví dụ: "1970-01-01") được coi là UTC, không phải cục bộ.

Nếu bạn định dạng văn bản khác nhau, chẳng hạn như "Jan 01 1970", thì (ít nhất là trên máy của tôi), nó sẽ sử dụng múi giờ địa phương của bạn.


0

Cố gắng thêm 2 xu của tôi vào chủ đề này (xây dựng trên câu trả lời @ paul-wintz).

Dường như với tôi rằng khi hàm tạo Ngày nhận được một chuỗi khớp với phần đầu tiên của định dạng ISO 8601 (phần ngày), nó thực hiện chuyển đổi ngày chính xác theo múi giờ UTC với 0 thời gian. Khi ngày đó được chuyển đổi thành giờ địa phương, sự thay đổi ngày có thể xảy ra nếu UTC nửa đêm là ngày sớm hơn theo múi giờ địa phương.

new Date('2020-05-07')
Wed May 06 2020 20:00:00 GMT-0400 (Eastern Daylight Time)

Nếu chuỗi ngày ở bất kỳ định dạng "lỏng lẻo" nào khác (sử dụng "/" hoặc ngày / tháng không được đệm bằng 0) thì nó tạo ra ngày theo múi giờ địa phương, do đó không có vấn đề dịch chuyển ngày.

new Date('2020/05/07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-07')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-5-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)
new Date('2020-05-7')
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

Vì vậy, một cách khắc phục nhanh, như đã đề cập ở trên, là thay thế "-" bằng "/" trong chuỗi chỉ ngày được định dạng ISO của bạn.

new Date('2020-05-07'.replace('-','/'))
Thu May 07 2020 00:00:00 GMT-0400 (Eastern Daylight Time)

0

Lưu trữ yyyy-mm-ddở định dạng Ngày MySql bạn phải làm như sau:

const newDate = new Date( yourDate.getTime() + Math.abs(yourDate.getTimezoneOffset()*60000) );
console.log(newDate.toJSON().slice(0, 10)); // yyyy-mm-dd

-1

Nhật ký của bạn xuất ra GMT để bạn muốn chỉ định múi giờ của mình:

var doo = new Date("2011-09-24 EST");

3
Câu hỏi này đã có rất nhiều câu trả lời. Nếu bạn vẫn muốn trả lời câu hỏi, bạn nên đề cập đến một điều mới mà các câu trả lời khác không có. Câu trả lời hàng đầu đã giải thích vấn đề với múi giờ chi tiết hơn nhiều.
Calvin Godfrey

Câu trả lời này gần như chính xác như stackoverflow.com/a/7556642/8828658
một con nhện đá

Ai quan tâm nếu lời giải thích của anh ta sâu hơn ... mã của anh ta vẫn khác với tôi. Của tôi đơn giản hơn nhiều. Và yeah đá arachnid bạn là chính xác. Lỗi của tôi.
bmacx7

-3

đừng bận tâm, đã không chú ý đến GMT -0400, vì đó là ngày hôm qua

Bạn có thể thử đặt "thời gian" mặc định là 12:00:00


Vâng, tôi đã hơi nhanh với câu trả lời của mình, xin lỗi về điều đó. Sửa lại câu trả lời của tôi.
ChrisH

-3

Sau đây làm việc cho tôi -

    var doo = new Date("2011-09-24").format("m/d/yyyy");

Nó vẫn không hoạt động miễn là bạn không mân mê múi giờ.
Gar
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.