La Z significa "compensación de hora cero", también conocida como "hora zulú" (UTC). Cuando consulta la fecha de la base de datos, hay dos escenarios posibles en los que la fecha cambia, ya sea en la capa de la base de datos o en la capa de la aplicación, ajustándola a la zona horaria en la que se encuentra.
Entonces, por ejemplo, si la configuración de la base de datos ahorra tiempo automáticamente a UTC cuando obtuvo los datos reales, se convertirá a su zona horaria actual. Pero a partir de su ejemplo, 2016-12-20 se convierte en 2016-12-19T23:00:00.000Z, entonces asumo que la configuración de su base de datos en la fecha la guarda en una zona horaria determinada y luego la convierte a UTC.
Para solucionarlo, intente ajustar la lógica de su aplicación o la configuración de la base de datos, para mí prefiero hacerlo en el nivel de la aplicación y mantener la fecha en la base de datos para guardarla en UTC.
Prueba esto para ver la diferencia y podría darte una pista para resolver tu problema:
var currentDate = new Date();
var isoDate = currentDate.toISOString();
console.log(currentDate, isoDate);