Z berarti "offset nol jam" juga dikenal sebagai "waktu Zulu" (UTC). Saat Anda menanyakan tanggal dari database, ada dua kemungkinan skenario bahwa tanggal berubah, baik di lapisan database atau di lapisan aplikasi, menyesuaikannya dengan zona waktu Anda.
Jadi misalnya jika pengaturan database menghemat waktu secara otomatis ke UTC ketika Anda mendapatkan data aktual, itu akan dikonversi ke zona waktu Anda saat ini. Tapi dari contoh Anda 2016-12-20 dikonversi ke 2016-12-19T23:00:00.000Z maka saya berasumsi bahwa pengaturan database Anda pada tanggal menyimpannya di zona waktu tertentu kemudian mengonversinya ke UTC.
Untuk memperbaikinya coba sesuaikan logika aplikasi atau pengaturan basis data Anda, bagi saya saya lebih suka melakukannya di level aplikasi dan mempertahankan tanggal di DB untuk disimpan ke UTC.
Coba ini untuk melihat perbedaannya dan dapat memberikan petunjuk untuk memecahkan masalah Anda:
var currentDate = new Date();
var isoDate = currentDate.toISOString();
console.log(currentDate, isoDate);