Atenção para usar getFullYear() (que retorna 2018), em vez de getYear(), que retorna o valor do ano indexado em 1900 (ou seja, neste caso, retornaria 118).
Também usei a função padStart para completar com zero à esquerda os valores menores que 10 (assim, 5 é mostrado como 05). Infelizmente isso não funciona no IE, mas você pode substituir por esta função:
A resposta do Sam sugere criar outra data com o valor do timestamp modificado. De fato ela mostra o valor que você quer, mas esteja ciente de um detalhe.
Lembre-se o que é o timestamp: um valor que representa um único instante, e que é o mesmo no mundo todo. Ao criar uma data com outro valor de timestamp, você está criando um objeto que se refere a um instante diferente.
Para entender melhor, uma analogia: suponha que meu computador esteja configurado com o fuso horário errado (estou no Brasil, mas o fuso horário do sistema operacional está configurado para Londres).
Agora no Brasil são 2 da tarde, mas em Londres são 4 da tarde, então meu computador está mostrando que são 4 da tarde. O que eu posso fazer para arrumar? Há duas opções:
Ambas vão fazer com que o relógio mostre "2 da tarde", mas a segunda opção está na verdade me mostrando um horário correspondente a 2 horas no passado: ele me mostra que é 2 da tarde, mas no fuso horário de Londres. Só que agora em Londres são 4 da tarde (no Brasil é que ainda são 2 da tarde). Quem olha só para os números do relógio acha que está tudo certo, sem saber que na verdade meu relógio está atrasado 2 horas.
É isso que acontece quando você subtrai um valor do timestamp: a data criada está no passado, só que como você está olhando ela do ponto de vista de outro timezone, ela parece estar certa (os números mostrados estão "certos").
Repare que d2 corresponde a um instante "no passado", se comparado a d. Você criou uma data que corresponde a um instante completamente diferente. Graças ao método getTimezoneOffset(), foi possível obter o valor exato a ser subtraído para que os valores de data e hora de d2 em UTC sejam iguais os valores de data e hora de d no fuso horário brasileiro. Mas de qualquer forma, d e d2 correspondem a instantes diferentes.
Isso é errado? Bom, vai de cada um. Se você não vai usar d2 para mais nada, não é tão problemático assim. Mas se for usá-lo depois, cuidado, pois ele não representa o mesmo instante que d. Ao fazer isso, você só "atrasou o relógio", quando o correto seria usar o timezone que você precisa (e foi o que fiz ao usar os getters, pois eles retornam os valores no timezone do browser, que é o que você quer).
Se quiser, você pode usar a biblioteca Moment.js, que na minha opinião é "tudo que o JavaScript deveria ter nativamente para lidar com datas" (um pouco exagerado, mas enfim).