Z znamená „posunutí nulové hodiny“ také známé jako „čas Zulu“ (UTC). Když se dotazujete na datum z databáze, existují dva možné scénáře, kdy se datum změní, buď v databázové vrstvě, nebo na aplikační vrstvě a přizpůsobí se časovému pásmu, ve kterém se nacházíte.
Pokud tedy například nastavení databáze automaticky uloží čas do UTC, když získáte aktuální data, bude převedena do vašeho aktuálního časového pásma. Ale z vašeho příkladu je 2016-12-20 převedeno na 2016-12-19T23:00:00.000Z, pak předpokládám, že vaše databázové nastavení jej uloží v určitém časovém pásmu a poté jej převede na UTC.
Chcete-li to opravit, zkuste upravit svou aplikační logiku nebo nastavení databáze, pro mě to raději dělám na úrovni aplikace a v DB udržuji datum, které se má uložit do UTC.
Vyzkoušejte toto, abyste viděli rozdíl a mohlo by vám pomoci vyřešit váš problém:
var currentDate = new Date();
var isoDate = currentDate.toISOString();
console.log(currentDate, isoDate);