
A data é estranha em JavaScript. Nos incomoda tanto que buscamos bibliotecas (como Date-fns e Moment ) no momento (ha!) Precisamos trabalhar com data e hora.
Mas nem sempre precisamos usar bibliotecas. A data pode ser bastante simples se você souber o que deve estar atento. Neste artigo, mostrarei tudo o que você precisa saber sobre o objeto Date.
Primeiro, vamos reconhecer a existência de fusos horários.
# Fusos horários
Existem centenas de fusos horários no nosso mundo. Em JavaScript, nos importamos apenas com dois – Hora Local e Tempo Universal Coordenado ( UTC ).
- A hora local refere-se ao fuso horário no qual seu computador está.
- UTC é sinônimo de Greenwich Mean Time ( GMT ) na prática.
Por padrão, quase todo método de data em JavaScript (exceto um) fornece uma data / hora na hora local. Você só recebe o UTC se especificar o UTC .
Com isso, podemos falar sobre a criação de datas.
# Criando uma data
Você pode criar uma data com new Date()
. Existem quatro maneiras possíveis de usar new Date()
:
- Com uma string de data
- Com argumentos de data
- Com um timestamp
- Sem argumentos
# O método de string de data
No método date-string, você cria uma data passando uma string de data para new Date
.
new Date('1988-03-21')
Nós tendemos para o método date-string quando escrevemos datas. Isso é natural porque estamos usando strings de data toda a nossa vida.
Se eu escrevo 21-03-1988
, você não tem problemas em deduzir o dia 21 de março de 1988. Sim? Mas se você escrever 21-03-1988
em JavaScript, você consegue Invalid Date
.

new Date('21-03-1988')
Retorna Data Inválida.Há uma boa razão para isso.
Nós interpretamos seqüências de datas de maneira diferente em diferentes partes do mundo. Por exemplo, 11-06-2019
é 11th June, 2019
ou 6th November 2019
. Mas você não pode ter certeza de qual deles eu estou me referindo, a menos que você saiba o sistema de data que estou usando.
Em JavaScript, se você quiser usar uma string de data, precisará usar um formato aceito em todo o mundo. Um desses formatos é o formato estendido ISO 8601 .
// ISO 8601 Extended format
`YYYY-MM-DDTHH:mm:ss:sssZ`
Veja o que os valores significam:
YYYY
: Ano de 4 dígitosMM
: Mês de 2 dígitos (onde janeiro é 01 e dezembro é 12)DD
: Data de 2 dígitos (0 a 31)-
: Delimitadores de dataT
: Indica o início do tempoHH
: Hora de 24 dígitos (0 a 23)mm
: Minutos (0 a 59)ss
: Segundos (0 a 59)sss
: Milissegundos (0 a 999):
: Delimitadores de tempoZ
: SeZ
estiver presente, a data será definida como UTC. SeZ
não estiver presente, será a hora local. (Isso só se aplica se o tempo for fornecido).
Horas, minutos, segundos e milissegundos são opcionais se você estiver criando uma data. Então, se você quiser criar uma data para11 de junho de 2019, você pode escrever isto:
new Date('2019-06-11')
Preste especial atenção aqui. Há um grande problema em criar datas com strings de data. Você pode identificar o problema se você console.log
esta data.
Se você mora em uma área que está por trás do GMT , você receberá uma data que diz 10th June
.

new Date('2019-06-11')
produz 10 de junho, se você estiver em um lugar atrás GMT.Se você mora em uma área que está à frente do GMT , você terá uma data que diz 11th June
.

new Date('2019-06-11')
produz 11 de junho, se você estiver em um lugar depois do GMT .Isso acontece porque o método date-string tem um comportamento peculiar: se você criar uma data (sem especificar a hora), você obtém uma data definida no UTC .
No cenário acima, quando você escreve new Date('2019-06-11')
, você realmente cria uma data que diz 11th June, 2019, 12am UTC
. É por isso que as pessoas que moram em áreas por trás do GMT recebem um em 10th June
vez de 11th June
.
Se você quiser criar uma data na hora local com o método de string de data, precisará incluir a hora. Quando você inclui o tempo, precisa escrever o HH
e mm
no mínimo (ou o Google Chrome retorna uma data inválida).
new Date('2019-06-11T00:00')

Todo o tempo local versus UTC com strings de data pode ser uma possível fonte de erro que é difícil de entender. Por isso, recomendo que você não crie datas com strings de data.
(A propósito, o MDN avisa sobre a abordagem de string de data, uma vez que os navegadores podem analisar strings de data de maneira diferente).

Se você quiser criar datas, use argumentos ou carimbos de data / hora.
# Criando datas com argumentos
Você pode passar até sete argumentos para criar uma data / hora.
- Ano: ano de 4 dígitos.
- Mês: Mês do ano (0-11). Mês é indexado com zero. O padrão é 0 se omitido.
- Dia: dia do mês (1-31). O padrão é 1 se omitido.
- Hora: hora do dia (0 a 23). O padrão é 0 se omitido.
- Minutos: Minutos (0-59). O padrão é 0 se omitido.
- Segundos: Segundos (0 a 59). O padrão é 0 se omitido.
- Milissegundos: Milissegundos (0 a 999). O padrão é 0 se omitido.
// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)
Muitos desenvolvedores (inclusive eu) evitam a abordagem de argumentos porque parececomplicada. Mas na verdade é bem simples.
Tente ler números da esquerda para a direita. À medida que você vai da esquerda para a direita, você insere valores em magnitude decrescente: ano, mês, dia, horas, minutos, segundos e milissegundos.
new Date(2017, 3, 22, 5, 23, 50)
// This date can be easily read if you follow the left-right formula.
// Year: 2017,
// Month: April (because month is zero-indexed)
// Date: 22
// Hours: 05
// Minutes: 23
// Seconds: 50
A parte mais problemática com data é que o valor do mês é zero indexados, como, January === 0
, February === 1
, March === 2
e assim por diante.
Não sabemos por que mês em JavaScript é indexado em zero, mas é. Em vez de discutir por que janeiro deve ser 1 (e não 0), é melhor aceitar que o mês seja indexado com zero em JavaScript. Depois de aceitar esse fato, as datas ficam muito mais fáceis de se trabalhar.
Aqui estão mais alguns exemplos para você se familiarizar:
// 21st March 1988, 12am, Local Time.
new Date(1988, 2, 21)
// 25th December 2019, 8am, Local Time.
new Date(2019, 11, 25, 8)
// 6th November 2023, 2:20am, Local Time
new Date(2023, 10, 6, 2, 20)
// 11th June 2019, 5:23:59am, Local Time
new Date(2019, 5, 11, 5, 23, 59)
As datas de aviso criadas com argumentos estão todas no Local Time?
Essa é uma das vantagens de usar argumentos – você não ficará confuso entre o horário local e o UTC. Se você precisar do UTC , crie uma data no UTC desta maneira:
// 11th June 2019, 12am, UTC.
new Date(Date.UTC(2019, 5, 11))
# Criando datas com carimbos de data e hora
Em JavaScript, um registro de data e hora é a quantidade de milissegundos decorridos desde 1º de janeiro de 1970 (1º de janeiro de 1970 é também conhecido como horário Unix epoch). Da minha experiência, você raramente usa timestamps para criar datas. Você só usa timestamps para comparar datas diferentes (mais sobre isso mais tarde).
// 11th June 2019, 8am (in my Local Time, Singapore)
new Date(1560211200000)
# Sem argumentos
Se você criar uma data sem nenhum argumento, obterá uma data definida para a hora atual (na hora local).
new Date()

Você pode dizer pela imagem que é 25 de maio, 11h10 em Cingapura quando escrevi este artigo.
# Resumo sobre como criar datas
- Você pode criar data com
new Date()
. - Existem quatro sintaxes possíveis:
- Com uma string de data
- Com argumentos
- Com timestamp
- Sem argumentos
- Nunca crie uma data com o método de string de data.
- É melhor criar datas com o método arguments.
- Lembre-se (e aceite) esse mês é indexado com zero em JavaScript.
Em seguida, vamos falar sobre como converter uma data em uma string legível.
# Formatando uma data
A maioria das linguagens de programação fornece uma ferramenta de formatação para criar qualquer formato de data desejado. Por exemplo, no PHP , você pode escrever date("d M Y")
para uma data como 23 Jan 2019
.
Mas não há maneira fácil de formatar uma data em JavaScript.
O objeto Date nativo vem com sete métodos de formatação. Cada um desses sete métodos fornece um valor específico (e eles são completamente inúteis).
const date = new Date(2019, 0, 23, 17, 23, 42)
toString
da-teWed Jan 23 2019 17:23:42 GMT+0800 (Singapore Standard Time)
toDateString
da-teWed Jan 23 2019
toLocaleString
da-te23/01/2019, 17:23:42
toLocaleDateString
da-te23/01/2019
toGMTString
da-teWed, 23 Jan 2019 09:23:42 GMT
toUTCString
da-teWed, 23 Jan 2019 09:23:42 GMT
toISOString
da-te2019-01-23T09:23:42.079Z
Se você precisar de um formato personalizado, precisará criá-lo você mesmo.
# Escrevendo um formato de data personalizado
Vamos dizer que você quer algo parecido Thu, 23 January 2019
. Para criar esse valor, você precisa conhecer (e usar) os métodos de data que vêm com o objeto Date.
Para obter datas, você pode usar estes quatro métodos:
getFullYear
: Obtém um ano de 4 dígitos de acordo com a hora localgetMonth
: Obtém o mês do ano (0-11) de acordo com a hora local. Mês é indexado com zero.getDate
: Obtém o dia do mês (1-31) de acordo com a hora local.getDay
: Obtém o dia da semana (0-6) de acordo com a hora local. Dia da semana começa com domingo (0) e termina com sábado (6).
É simples de criar 23
e 2019
para Thu, 23 January 2019
. Nós podemos usar getFullYear
e getDate
obtê-los.
const d = new Date(2019, 0, 23)
const year = d.getFullYear() // 2019
const date = d.getDate() // 23
É mais difícil de conseguir Thu
e January
.
Para obter January
, você precisa criar um objeto que mapeie o valor de todos os doze meses para seus respectivos nomes.
const months = {
0: 'January',
1: 'February',
2: 'March',
3: 'April',
4: 'May',
5: 'June',
6: 'July',
7: 'August',
8: 'September',
9: 'October',
10: 'November',
11: 'December'
}
Como Month é indexado como zero, podemos usar uma matriz em vez de um objeto. Produz os mesmos resultados.
const months = [
'January',
'February',
'March',
'April',
'May',
'June',
'July',
'August',
'September',
'October',
'November',
'December'
]
Para obter January
, você precisa:
- Use
getMonth
para obter o mês com índice zero a partir da data. - Obter o nome do mês de
months
const monthIndex = d.getMonth()
const monthName = months[monthIndex]
console.log(monthName) // January
A versão condensada:
const monthName = months(d.getMonth())
console.log(monthName) // January
Você faz o mesmo para conseguir Thu
. Desta vez, você precisa de um array que contenha sete dias da semana.
const days = [
'Sun',
'Mon',
'Tue',
'Wed',
'Thu',
'Fri',
'Sat'
]
Então você:
- Fique
dayIndex
comgetDay
- Use
dayIndex
para obterdayName
const dayIndex = d.getDay()
const dayName = days[dayIndex] // Thu
Versão curta:
const dayName = days[d.getDay()] // Thu
Em seguida, você combina todas as variáveis criadas para obter a string formatada.
const formatted = `${dayName}, ${date} ${monthName} ${year}`
console.log(formatted) // Thu, 23 January 2019
Sim, é tedioso. Mas não é impossível quando você pega o jeito.
Se você precisar criar um horário personalizado, use os seguintes métodos:
getHours
: Obtém horas (0-23) de acordo com a hora local.getMinutes
: Obtém os minutos (0 a 59) de acordo com a hora local.getSeconds
: Obtém segundos (0 a 59) de acordo com a hora local.getMilliseconds
: Obtém-se milissegundos (0 a 999), de acordo com a hora local.
Em seguida, vamos falar sobre a comparação de datas.
# Comparando datas
Se você quiser saber se uma data vem antes ou depois de outra data, você pode compará-los diretamente com >
, <
, >=
e <=
.
const earlier = new Date(2019, 0, 26)
const later = new Date(2019, 0, 27)
console.log(earlier < later) // true
É mais difícil se você quiser verificar se duas datas caem exatamente ao mesmo tempo. Você não pode compará-los com ==
ou ===
.
const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)
console.log(a == b) // false
console.log(a === b) // false
Para verificar se duas datas caem exatamente ao mesmo tempo, você pode verificar seus timestamps com getTime
.
const isSameTime = (a, b) => {
return a.getTime() === b.getTime()
}
const a = new Date(2019, 0, 26)
const b = new Date(2019, 0, 26)
console.log(isSameTime(a, b)) // true
Se você quiser verificar se duas datas caem no mesmo dia, você pode verificar suas getFullYear
, getMonth
e getDate
valores.
const isSameDay = (a, b) => {
return a.getFullYear() === b.getFullYear() &&
a.getMonth() === b.getMonth() &&
a.getDate()=== b.getDate()
}
const a = new Date(2019, 0, 26, 10) // 26 Jan 2019, 10am
const b = new Date(2019, 0, 26, 12) // 26 Jan 2019, 12pm
console.log(isSameDay(a, b)) // true
Há uma última coisa que temos que cobrir.
# Obtendo uma data a partir de outra data
Existem dois cenários possíveis em que você deseja obter uma data a partir de outra data.
- Defina um valor de data / hora específico a partir de outra data.
- Adicionar / subtrair um delta de outra data.
# Definir uma data / hora específica
Você pode usar esses métodos para definir uma data / hora a partir de outra data:
setFullYear
: Definir ano de 4 dígitos na hora local.setMonth
: Definir mês do ano na hora local.setDate
: Definir o dia do mês na hora local.setHours
: Definir horas na hora local.setMinutes
: Definir minutos na hora local.setSeconds
: Definir segundos na hora local.setMilliseconds
: Definir milissegundos na hora local.
Por exemplo, se você deseja definir uma data para os 15 th do mês, você pode usar setDate(15)
.
const d = new Date(2019, 0, 10)
d.setDate(15)
console.log(d) // 15 January 2019
Se você quiser definir o mês para junho, você pode usar setMonth
. (Lembre-se, mês em JavaScript é zero-indexado!)
const d = new Date(2019, 0, 10)
d.setMonth(5)
console.log(d) // 10 June 2019
Nota: Os métodos setter acima alteram o objeto de data original. Na prática, não devemos mudar objetos ( mais sobre por que aqui ). Devemos realizar essas operações em um novo objeto de data.
const d = new Date(2019, 0, 10)
const newDate = new Date(d)
newDate.setMonth(5)
console.log(d) // 10 January 2019
console.log(newDate) // 10 June 2019
# Adicionando / subtraindo delta de outra data
Um delta é uma mudança. Ao adicionar / subtrair delta de outra data, quero dizer: você deseja obter uma data que seja X de outra data. Pode ser X ano, X mês, X dia, etc.
Para obter um delta, você precisa saber o valor da data atual. Você pode obtê-lo usando estes métodos:
getFullYear
: Obtém um ano de 4 dígitos de acordo com a hora localgetMonth
: Obtém o mês do ano (0-11) de acordo com a hora local.getDate
: Obtém o dia do mês (1-31) de acordo com a hora local.getHours
: Obtém horas (0-23) de acordo com a hora local.getMinutes
: Obtém os minutos (0 a 59) de acordo com a hora local.getSeconds
: Obtém segundos (0 a 59) de acordo com a hora local.getMilliseconds
: Obtém-se milissegundos (0 a 999), de acordo com a hora local.
Existem duas abordagens gerais para adicionar / subtrair um delta. A primeira abordagem é mais popular no Stack Overflow. É conciso, mas mais difícil de entender. A segunda abordagem é mais detalhada, mas mais fácil de entender.
Vamos percorrer as duas abordagens.
Digamos que você queira marcar uma data de três dias a partir de hoje. Para este exemplo, vamos supor também hoje é28 de março de 2019. (É mais fácil explicar quando estamos trabalhando com uma data fixa).
A primeira abordagem (a abordagem definida)
// Assumes today is 28 March 2019
const today = new Date(2019, 2, 28)
Primeiro, criamos um novo objeto Date (para não alterar a data original)
const finalDate = new Date(today)
Em seguida, precisamos saber o valor que queremos mudar. Já que estamos mudando dias, podemos começar o dia com getDate
.
const currentDate = today.getDate()
Queremos uma data de três dias a partir de hoje. Vamos usar adicionar o delta (3) à data atual.
finalDate.setDate(currentDate + 3)
Código completo para a abordagem definida:
const today = new Date(2019, 2, 28)
const finalDate = new Date(today)
finalDate.setDate(today.getDate() + 3)
console.log(finalDate) // 31 March 2019
A segunda abordagem (a nova abordagem de data)
Aqui, usamos getFullYear
, getMonth
, getDate
e outros métodos getter até atingirmos o tipo de valor que deseja alterar. Então, usamos criar a data final com new Date
.
const today = new Date(2019, 2, 28)
// Getting required values
const year = today.getFullYear()
const month = today.getMonh()
const day = today.getDate()
// Creating a new Date (with the delta)
const finalDate = new Date(year, month, day + 3)
console.log(finalDate) // 31 March 2019
Ambas as abordagens funcionam. Escolha um e fique com ele.
# Correção automática de data
Se você fornecer a Data com um valor que esteja fora de seu intervalo aceitável, o JavaScript recalculará automaticamente a data para você.
Aqui está um exemplo. Digamos que nós definimos a data para33 de março de 2019. (Não há 33 rd de março no calendário). Neste caso, JavaScript ajusta 33 rd Março a 2 nd abril automaticamente.
// 33rd March => 2nd April
new Date(2019, 2, 33)

Isso significa que você não precisa se preocupar com o cálculo de minutos, horas, dias, meses etc. ao criar um delta. JavaScript lida com isso automaticamente.
// 33rd March => 2nd April
new Date(2019, 2, 30 + 3)

E isso é tudo que você precisa saber sobre o objeto Date nativo do JavaScript.
# Interessado em aprender mais JavaScript?
Se você achou útil essa introdução, pode adorar Aprender JavaScript , um curso que criei para ensinar às pessoas tudo o que elas precisam saber sobre JavaScript.
No curso, eu abordo os conceitos básicos do que você precisa saber, então eu mostro a você como usar os conceitos aprendidos para construir componentes do mundo real.
Dar uma olhada. Você pode achar útil.
Enquanto isso, se você tiver alguma dúvida sobre JavaScript, sinta-se à vontade para entrar em contato comigo . Farei o melhor para criar artigos gratuitos para responder às suas perguntas.