Z betyder "noll timmars offset" även känd som "Zulu-tid" (UTC). När du frågar efter datumet från databasen finns det två möjliga scenarier där datumet ändras, antingen i databasskiktet eller på applikationslagret, anpassa det till den tidszon du befinner dig i.
Så till exempel om databasinställningen sparar tid automatiskt till UTC när du fick den faktiska informationen kommer den att konverteras till din nuvarande tidszon. Men från ditt exempel konverteras 2016-12-20 till 2016-12-19T23:00:00.000Z så antar jag att din databasinställning på datum sparar den i en viss tidszon och konverterar den sedan till UTC.
För att fixa det, försök justera din applikationslogik eller databasinställning, för mig gör jag det hellre på applikationsnivå och behåller datumet i DB för att sparas till UTC.
Prova detta för att se skillnaden och kan ge dig tips om hur du löser ditt problem:
var currentDate = new Date();
var isoDate = currentDate.toISOString();
console.log(currentDate, isoDate);