Artigo original: https://www.freecodecamp.org/news/the-ultimate-guide-to-javascript-date-and-moment-js/

Boas-vindas ao guia definitivo para o objeto Date e para o Moment.js. Este tutorial ensinará tudo o que você precisa saber para trabalhar com datas em seus projetos.

Como criar um objeto Date

Retornar a data e hora atual

const agora = new Date();

// Fri Jun 09 2023 14:17:20 GMT-0300 (Brasilia Standard Time)

Retornar a data e hora com valores individuais

const dataEspecifica = new Date(2023, 5, 9, 15, 0, 0, 0);

// Fri Jun 09 2023 15:00:00 GMT-0300 (Brasilia Standard Time)

A sintaxe é: Date(ano, mês, dia, hora, minuto, segundo, milissegundo).

Note que os meses são indexados iniciando pelo zero, ou seja, começam com janeiro sendo 0 e finalizam com dezembro sendo 11.

Retornar a data e hora de um timestamp

const unixEpoch = new Date(0);

O epoch representa a hora que ocorreu na quinta-feira, 1º de janeiro de 1970 (UTC), ou seja, o tempo conhecido como Epoch Unix (ou Unix time). O Epoch Unix é importante porque é o que o JavaScript, o Python, o PHP e outras linguagens e sistemas usam internamente para calcular o horário atual.

new Date(ms) retorna a data do epoch mais o número de milissegundos que você passar. Em um dia, há 86.400.000 milissegundos, então:

const diaDepoisDoEpoch = new Date(86400000);

retornará Friday, January 2nd, 1970 (UTC) (Sexta-feira, 2 de Janeiro de 1970).

Obtenha uma data e hora a partir de uma string

const stringParaData = new Date('May 29, 2019 15:00:00');

// Wed May 29 2019 15:00:00 GMT-0400 (Eastern Daylight Time)

Obter a data dessa maneira é muito flexível. Todos os exemplos abaixo retornam objetos do tipo Date válidos:

new Date('2019-06') // June 1st, 2019 00:00:00
new Date('2019-06-16') // June 16th, 2019
new Date('2019') // January 1st, 2019 00:00:00
new Date('JUNE 16, 2019')
new Date('6/23/2019')

Você pode também usar o método Date.parse() a fim de retornar o número de milissegundos desde o epoch (1 de Janeiro de 1970):

Date.parse('1970-01-02') // 86400000
Date.parse('6/16/2019') // 1560610800000

Definindo um fuso horário

Quando você passa uma string de data sem definir um fuso horário, o JavaScript assumirá que a data/tempo está usando o UTC, antes de convertê-la para o fuso horário que seu navegador está utilizando:

const dataDeNascimentoExata = new Date('6/13/2018 06:27:00');

console.log(dataDeNascimentoExata) // Wed Jun 13 2018 06:27:00 GMT+0900 (Korean Standard Time)

Isso pode levar a alguns erros quando a data a ser retornada desvia-se por muitas horas. Para evitar isso, passe um fuso horário junto da string:

const dataDeNascimentoExata = new Date('6/13/2018 06:27:00 GMT-1000');

console.log(dataDeNascimentoExata) // Thu Jun 14 2018 01:27:00 GMT+0900 (Korean Standard Time)

/*
Outros formatos que também funcionam:

new Date('6/13/2018 06:27:00 GMT-10:00');
new Date('6/13/2018 06:27:00 -1000');
new Date('6/13/2018 06:27:00 -10:00');
*/

Você também pode passar alguns, mas não todos os fusos horários existentes:

const dataDeNascimentoExata = new Date('6/13/2018 06:27:00 PDT');

console.log(dataDeNascimentoExata) // Thu Jun 14 2018 01:27:00 GMT+0900 (Korean Standard Time)

Métodos do objeto Date

Em diversos momentos você não precisará da data completa, apenas de parte dela, como o dia, semana ou mês. Felizmente, existem diversos métodos para se fazer isso:

const dataDeNascimento = new Date('6/13/2018 06:27:39');

dataDeNascimento.getMonth() // 5 (0 é janeiro)
dataDeNascimento.getDate() // 13
dataDeNascimento.getDay() // 3 (0 é domingo)
dataDeNascimento.getFullYear() // 2018
dataDeNascimento.getTime() // 1528838859000 (milisegundos desde o epoch)
dataDeNascimento.getHours() // 6
dataDeNascimento.getMinutes() // 27
dataDeNascimento.getSeconds() // 39
dataDeNascimento.getTimezoneOffset() // -540 (deslocamento do fuso horário em minutos com base na localização do seu navegador)

Facilite o trabalho com datas com o Moment.js

Acertar datas e horários não é uma tarefa fácil. Cada país tem uma maneira diferente de formatar datas e contabilizar diferentes fusos horários (como, por exemplo, o horário de verão) leva muito tempo. É aí que o Moment.js brilha – ele facilita a análise, formatação e a exibição de datas.

Para começar a usar o Moment.js, instale-o por meio de um gerenciador de pacotes, como o npm, ou adicione-o ao seu site por meio de uma CDN. Consulte a documentação do Moment.js para mais detalhes.

Obter a data e hora atual com o Moment.js

const agora = moment();

Isso retorna um objeto com a data e a hora com base na localização do navegador, juntamente com outras informações de localidade. É semelhante ao new Date() do JavaScript.

Obter uma data e hora de um timestamp com o Moment.js

Semelhante ao new Date(ms), você pode passar o número de milissegundos desde o epoch até o moment():

const diaDepoisDoEpoch = moment(86400000);

Se você quiser obter uma data e hora usando um timestamp do Unix em segundos, você pode usar o método unix():

const diaDepoisDoEpoch = moment.unix(86400);

Obter uma data e hora de uma string com Moment.js

Analisar uma data no formato de uma string com o Moment.js é fácil e a biblioteca aceita strings no formato da ISO 8601 ou da RFC 2822, juntamente com qualquer string aceita pelo objeto Date do JavaScript.

Strings no formato da ISO 8601 são recomendadas, uma vez que são um formato amplamente aceito. Aqui estão alguns exemplos:

moment('2019-04-21');
moment('2019-04-21T05:30');
moment('2019-04-21 05:30');

moment('20190421');
moment('20190421T0530');

Definindo um fuso horário com o Moment.js

Até agora, temos utilizado o Moment.js no modo local, o que significa que assumimos que qualquer input é uma data ou hora local, de modo semelhante ao do funcionamento do objeto Date do JavaScript.

const momentoExatoDoNascimento = moment('2018-06-13 06:27:00');

console.log(momentoExatoDoNascimento) // Wed Jun 13 2018 06:27:00 GMT+0900 (Korean Standard Time)

No entanto, para definir um fuso horário, você primeiro precisa pegar o objeto Moment no modo UTC:

const momentoExatoDoNascimento = moment.utc('2018-06-13 06:27:00');

console.log(momentoExatoDoNascimento) // Wed Jun 13 2018 15:27:00 GMT+0900 (Korean Standard Time)

Então, você pode ajustar a diferença nos fusos horários com o método utcOffset():

const momentoExatoDoNascimento = moment.utc('2018-06-13 06:27:00').utcOffset('+10:00');

console.log(momentoExatoDoNascimento) // Wed Jun 13 2018 06:27:00 GMT+0900 (Korean Standard Time)

Você também pode definir a diferença dos fusos horários (UTC offset) como um número ou uma string:

moment.utc().utcOffset(10) // Número de horas de diferença
moment.utc().utcOffset(600) // Número de minutos de diferença
moment.utc().utcOffset('+10:00') // Número de horas de diferença como string

Para usar fusos horários nomeados (America/Los_Angeles) ou códigos de fusos horários (PDT) com objetos Moment, configure a biblioteca Moment Timezone.

Formatando a data e hora com o Moment.js

Uma das principais vantagens do Moment.js em relação aos objetos Date nativos do JavaScript é a facilidade de formatar a data e a hora de saída. Basta encadear o método format() para um objeto de data do Moment e passar uma string de formato como parâmetro:

moment().format('MM-DD-YY'); // "08-13-19"
moment().format('MM-DD-YYYY'); // "08-13-2019"
moment().format('MM/DD/YYYY'); // "08/13/2019"
moment().format('MMM Do, YYYY') // "Aug 13th, 2019"
moment().format('ddd MMMM Do, YYYY HH:mm:ss') // "Tues August 13th, 2019 19:29:20"
moment().format('dddd, MMMM Do, YYYY -- hh:mm:ss A') // "Tuesday, August 13th, 2019 -- 07:31:02 PM"

Aqui está uma tabela com alguns tokens de formatação comuns:

ENTRADA SAÍDA DESCRIÇÃO
YYYY 2019 Ano de 4 algarismos
YY 19 Ano de 2 algarismos
MMMM August Nome completo do mês
MMM Aug Nome do mês abreviado
MM 08 Mês com 2 algarismos
M 8 Mês com 1 algarismo
DDD 225 Dia do ano
DD 13 Dia do mês
Do 13th Dia do mês com ordinal
dddd Wednesday Nome completo do dia
ddd Wed Nome do dia abreviado
HH 17 Hora no formato de 24 horas
hh 05 Hora no formato de 12 horas
mm 32 Minutos
ss 19 Segundos
a am / pm Antes e depois do meio-dia
A AM / PM Antes e depois do meio-dia capitalizados
ZZ +0900 Deslocamento do fuso horário a partir do UTC
X 1410715640.579 Unix timestamp em segundos
XX 1410715640579 Unix timestamp em milissegundos

Acesse a documentação do Moment.js para saber mais sobre os tokens de formatação.

Trabalhar com objetos Date do JavaScript e com o Moment.js não precisa consumir todo o seu tempo. Agora, você deve saber mais do que o suficiente para começar com ambos.