-
Data e Hora Global (UTC): Armazenada sem considerar o fuso horário, a data global é representada em um formato ISO, como
2024-08-18T12:00:00.000Z
, onde o "Z" indica o Tempo Universal Coordenado (UTC). -
Data e Hora Local: Inclui o fuso horário do sistema, sendo representada, por exemplo, como
Sun Aug 18 2024 12:00:00 GMT-0300 (Brasília Standard Time)
.
A diferença entre essas duas datas pode ser calculada para determinar a duração, ou seja, o tempo decorrido entre os dois instantes.
- Utilize a data local quando o fuso horário não é relevante para pessoas em outros fusos horários.
- Exemplos: Sistemas de região única e planilhas como Excel.
- Utilize a data global quando o momento exato é relevante para pessoas em outros fusos horários, pois o dado se adaptará ao fuso horário do servidor que o processar.
- Exemplos: Sistemas multi-região e aplicações web.
-
GMT (Greenwich Mean Time): É o tempo médio de Greenwich, usado como referência para fusos horários ao redor do mundo. Baseado no tempo solar médio no meridiano de Greenwich, Londres.
-
UTC (Tempo Universal Coordenado): É o padrão de tempo usado mundialmente como referência para fusos horários. Ele é baseado em uma combinação precisa do tempo atômico internacional (TAI) e o tempo solar médio no meridiano de Greenwich (semelhante ao GMT, mas mais exato).
Fusos horários ao redor do mundo são determinados com base no UTC (Tempo Universal Coordenado) e, historicamente, no GMT (Hora Média de Greenwich).
- Brasília, Brasil: Durante o horário padrão, Brasília segue o fuso horário UTC-3, ou seja, três horas atrás do UTC.
- Reino Unido: Durante o horário padrão, o Reino Unido segue o UTC, mas durante o horário de verão, os relógios são adiantados em uma hora, ficando no fuso horário UTC+1.
Muitas linguagens de programação e tecnologias usam nomes específicos para fusos horários no formato Região/Cidade
. Esses nomes ajudam a identificar corretamente o fuso horário e ajustar datas e horários de acordo com mudanças regionais e horários de verão. Exemplos incluem:
US/Pacific
: Refere-se ao fuso horário do Pacífico nos Estados Unidos.America/Sao_Paulo
: Refere-se ao fuso horário de São Paulo, Brasil.
Esses nomes são úteis para garantir precisão e compatibilidade em aplicações que precisam lidar com diferentes fusos horários globalmente.
O padrão ISO 8601 é uma norma internacional para a representação de datas e horas. Ele define formatos claros e consistentes para expressar datas e horários, tanto locais quanto globais. Obs: Caso queira que uma data converta-se para o padrão ISO 8601, use o toString(), pois, por padrão as classes gerarão o texto para o padrão em destaque.
2022-07-21
: Representa uma data sem uma hora específica.2022-07-21T14:52
: Representa uma data e hora local, sem segundos.2022-07-22T14:52:09
: Representa uma data e hora local, incluindo segundos.2022-07-22T14:52:09.4073
: Representa uma data e hora local, incluindo milissegundos.
2022-07-23T14:52:09Z
: Representa uma data e hora em UTC, com "Z" indicando que está em Tempo Universal Coordenado.2022-07-23T14:52:09.254935Z
: Representa uma data e hora em UTC, com precisão de microsegundos.2022-07-23T14:52:09-03:00
: Representa uma data e hora com o deslocamento de fuso horário, indicando que está 3 horas atrás do UTC.
Com o lançamento do Java 8, a linguagem trouxe um novo pacote de classes para manipulação de datas e horas, denominado java.time
. Este pacote resolve muitas das limitações do antigo java.util.Date
e java.util.Calendar
, oferecendo uma API mais intuitiva, segura e orientada a objetos. A seguir, exploraremos os principais tipos de data e hora introduzidos, incluindo suas funcionalidades e cenários de uso.
- Descrição:
LocalDate
representa uma data (dia, mês, ano) sem qualquer informação de horário ou fuso horário. É ideal para representar aniversários, datas de vencimento e outras datas significativas que não precisam de um horário específico. - Exemplo de uso:
LocalDate agora = LocalDate.now(); // Retorna a data atual no formato YYYY-MM-DD //Passando uma string para LocalDate LocalDate conversao = LocalDate.parse("2024-07-20"); //Formato YYYY/MM/DD LocalDate aniversário = LocalDate.of(1990, Month.AUGUST, 18); // Cria uma data específica
- Descrição:
LocalDateTime
combina uma data (dia, mês, ano) com uma hora (hora, minuto, segundo e nanossegundo), mas ainda sem qualquer fuso horário. Ele é usado para representar momentos específicos no tempo, como agendamentos ou marcações de eventos locais. - Exemplo de uso:
LocalDateTime agora = LocalDateTime.now(); // Retorna a data e hora atual no formato YYYY-MM-DDTHH:MM:SS LocalDateTime convertido = LocalDateTime.parse("2024-07-20T01:30:26");//Formato YYYY/MM/DDTHH:MM:SS LocalDateTime reuniao = LocalDateTime.of(2024, Month.AUGUST, 18, 15, 30); // Cria uma data e hora específica
- Descrição:
Instant
representa um ponto específico na linha do tempo em UTC (Tempo Universal Coordenado). Ele é útil para registrar momentos em sistemas distribuídos onde a exatidão temporal entre fusos horários é crucial. UmInstant
é uma boa escolha para representar timestamps ou datas que precisam ser consistentes globalmente. - Exemplo de uso:
Instant timestamp = Instant.now(); // Retorna o momento atual no UTC -YYYY-MM-DDTHH:MM:SSZ Instant converte = Instant.parse("2024-07-20T01:30:26Z");//Apenas converte Instant converteInstant= Instant.parse("2024-08-19T17:05:26-03:00");//Converte o horário que passo para o UTC.**** Instant momentoEspecifico = Instant.parse("2024-08-18T15:30:00Z"); // Cria um instante específico
- Descrição:
Duration
representa um intervalo de tempo, normalmente medido em segundos ou nanossegundos. Ele é utilizado para calcular a diferença entre doisInstant
ouLocalDateTime
. Este tipo é útil para operações como medir tempos de execução, agendar tarefas com intervalo fixo ou determinar o tempo decorrido entre dois eventos. - Exemplo de uso:
Duration duration = Duration.ofHours(5); // Cria uma duração de 5 horas Duration between = Duration.between(startTime, endTime); // Calcula a duração entre dois instantes
- Descrição:
ZoneId
representa um fuso horário específico, como "America/Sao_Paulo" ou "Europe/London". Ele é usado em combinação com outras classes de data e hora para aplicar o fuso horário correto a uma data ou hora. - Exemplo de uso:
ZoneId zoneId = ZoneId.of("America/Sao_Paulo"); // Cria uma zona para o fuso horário de São Paulo ZonedDateTime zdt = ZonedDateTime.of(LocalDateTime.now(), zoneId); // Combina a data e hora com o fuso horário
- Descrição:
ChronoUnit
é uma enumeração que define unidades de tempo, como dias, meses, anos, horas, etc. Ele é útil para realizar operações de cálculo, como adicionar ou subtrair períodos de tempo. - Exemplo de uso:
LocalDate nextWeek = LocalDate.now().plus(1, ChronoUnit.WEEKS); // Adiciona uma semana à data atual long daysBetween = ChronoUnit.DAYS.between(startDate, endDate); // Calcula o número de dias entre duas datas
Usa-se como referência o DateTimeFormatter, seguindo o link para acesso: DateTimeFormatter]
Para criar uma formatação, basta importar o DateTimeFormatter, nele você colocar o padrão que quer, onde deve-se colocar as strings recomendadas pela documentação, conforme exemplo:
//Formatação para LocalDate
DateTimeFormatter formatacao = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate conversao = LocalDate.parse("20/07/2024", formatacao);
//Formatação para LocalDateTime
DateTimeFormatter formatacao2 = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm");
LocalDateTime conversao2 = LocalDateTime.parse("20/07/2024 02:30", formatacao2);
Obs: o DateTimeFormatter também pode ser passado dentro dos parenteses.
//Formatação para LocalDate
DateTimeFormatter formatacao = DateTimeFormatter.ofPattern("dd/MM/yyyy");
LocalDate conversao = LocalDate.parse("20/07/2024", DateTimeFormatter.ofPattern("dd/MM/yyyy"));