Z có nghĩa là "0 giờ bù giờ" còn được gọi là "giờ Zulu" (UTC). Khi bạn đang truy vấn ngày từ cơ sở dữ liệu, có hai trường hợp có thể xảy ra là ngày thay đổi, trong lớp cơ sở dữ liệu hoặc trên lớp ứng dụng, điều chỉnh nó theo múi giờ bạn đang ở.
Vì vậy, ví dụ:nếu cài đặt cơ sở dữ liệu lưu thời gian tự động thành UTC khi bạn nhận được dữ liệu thực tế, nó sẽ được chuyển đổi sang múi giờ hiện tại của bạn. Nhưng từ ví dụ của bạn 2016-12-20 được chuyển đổi thành 2016-12-19T23:00:00.000Z thì tôi giả sử rằng cài đặt cơ sở dữ liệu của bạn vào ngày đang lưu nó trong một múi giờ nhất định, sau đó chuyển đổi nó thành UTC.
Để khắc phục, hãy thử điều chỉnh logic ứng dụng hoặc cài đặt cơ sở dữ liệu của bạn, đối với tôi, tôi thích làm điều đó ở cấp ứng dụng và duy trì ngày trong DB để được lưu vào UTC.
Hãy thử cách này để thấy sự khác biệt và có thể cung cấp cho bạn gợi ý về cách giải quyết vấn đề của mình:
var currentDate = new Date();
var isoDate = currentDate.toISOString();
console.log(currentDate, isoDate);