Java Data e Hora

โšก Resumo Inteligente

Java O tratamento de data e hora combina as classes legadas java.util.Date e SimpleDateFormat com a moderna API java.time introduzida em Java 8, oferecendo aos desenvolvedores tipos imutรกveis โ€‹โ€‹e thread-safe para trabalhos precisos com calendรกrios.

  • ๐Ÿ•’ Data Legada: A classe java.util.Date armazena um instante em milissegundos e imprime uma string padrรฃo atravรฉs do mรฉtodo toString.
  • ๐Ÿ”ค Letras do padrรฃo: O SimpleDateFormat usa letras como aaaa, MM, dd, HH, mm, ss e zzz para definir formatos de saรญda personalizados.
  • โš–๏ธ Comparaรงรฃo: O mรฉtodo compareTo retorna um nรบmero inteiro negativo, zero ou positivo para ordenar duas instรขncias de Date cronologicamente.
  • ๐Ÿ†• API moderna: LocalDate, LocalDateTime, ZonedDateTime e Instant em java.time substituem Date e Calendar por objetos imutรกveis.
  • ๐Ÿงต Seguranรงa da linha: DateTimeFormatter รฉ imutรกvel e seguro para compartilhar, enquanto SimpleDateFormat precisa de sincronizaรงรฃo ou de um wrapper ThreadLocal.
  • ๐Ÿ” Interoperabilidade: Converta entre as APIs antigas e novas usando as funรงรตes auxiliares Date.toInstant, Date.from e Calendar.toInstant.

Java Data e Hora

Lidar com datas e horรกrios em Java ร‰ uma parte rotineira da construรงรฃo da lรณgica de agendamento, registro de data e hora, relatรณrios e trilhas de auditoria. Antes de escrever qualquer cรณdigo, รฉ รบtil conhecer os parรขmetros que compรตem uma data:

  • O ano (em dois ou quatro dรญgitos).
  • O mรชs (com dois dรญgitos, com as trรชs primeiras letras do mรชs ou com o nome completo do mรชs).
  • O dados (o nรบmero do dia do mรชs correspondente).
  • O dia (o nome do dia da semana na data indicada, como Dom, Seg, Ter).

Java Expรตe muitos outros parรขmetros que descrevem um momento na linha do tempo, incluindo era, semana do ano, fuso horรกrio e deslocamento. As seรงรตes abaixo abordam cada um deles com exemplos executรกveis.

Como usar a data em Java

Exibir data em Java

Java fornece uma Date classe na java.util O pacote armazena um instante especรญfico no tempo com precisรฃo de milissegundos e oferece mรฉtodos auxiliares para imprimir, comparar e formatar esse instante. Para obter a data e hora atuais, instancie a classe com seu construtor padrรฃo:

import java.util.Date;

class Date_Ex1 {
    public static void main(String args[]) {
        // Instantiate a Date object by invoking its constructor
        Date objDate = new Date();
        // Display the Date and Time using toString()
        System.out.println(objDate.toString());
    }
}

Saรญda:

Wed Nov 29 06:36:22 UTC 2017

O exemplo imprime a data no formato padrรฃo do toString. Para exibir a mesma data em um formato diferente, primeiro vocรช precisa entender os caracteres de formataรงรฃo que Java usa.

SimpleDateFormat: analisar e formatar datas

O SimpleDateFormat aula em java.text converte um Date converte um objeto em uma string formatada e analisa a string formatada de volta para um objeto. DateEle usa letras padronizadas que correspondem a um componente de data ou hora. A tabela abaixo lista todas as letras suportadas:

CartaComponente de data ou horaExemplo
GDesignador de eraAD
yAno2026
MMรชs no anoJulho ou julho ou 07
wSemana no ano27
WSemana no mรชs2
DDia no ano189
dDia no mรชs10
FDia da semana no mรชs2
ENome do dia na semanaTerรงa ou Terรงa
uNรบmero do dia da semana (1 = Monday, 7 = Domingo)1
aMarcador AM ou PMPM
HHora do dia (0-23)0
kHora do dia (1-24)24
KHora em AM ou PM (0-11)0
hHora em AM ou PM (1-12)12
mMinuto em hora30
sSegundo em minuto55
SMilissegundo978
zFuso horรกrio (nome)Hora padrรฃo do Pacรญfico; PST; GMT-08: 00
ZFuso horรกrio (deslocamento RFC 822)-0800
XFuso horรกrio (deslocamento ISO 8601)-08 ou -0800 ou -08:00

Vocรช nรฃo precisa memorizar a tabela inteira. Consulte-a sempre que criar um novo padrรฃo.

Como usar o SimpleDateFormat

SimpleDateFormat รฉ uma subclasse de DateFormat Isso permite formatar e analisar datas usando as letras padrรฃo acima. Combine as letras para descrever a sequรชncia exata que vocรช deseja produzir ou ler.

Por exemplo:

  1. Formato de data exigido: 2012.10.23/20/20 45:XNUMX:XNUMX PSTO padrรฃo de formato apropriado รฉ yyyy.MM.dd HH:mm:ss zzz.
  2. Formato de data exigido: 09:30:00 AM 23-May-2012O padrรฃo de formato apropriado รฉ hh:mm:ss a dd-MMM-yyyy.

Dica: Atenรงรฃo para maiรบsculas e minรบsculas. M รฉ mรชs, em minรบsculas m รฉ minรบsculo. Maiรบsculo H รฉ um relรณgio de 24 horas, em letras minรบsculas. h ร‰ um relรณgio de 12 horas. Misturรก-los produz resultados incorretos sem aviso prรฉvio.

O programa abaixo imprime a data atual duas vezes, uma vez no formato padrรฃo e outra usando um padrรฃo SimpleDateFormat:

import java.text.SimpleDateFormat;
import java.util.Date;

class TestDates_Format {
    public static void main(String args[]) {
        // Current system date and time is assigned to objDate
        Date objDate = new Date();
        System.out.println(objDate);

        // Build the target pattern and format the date
        String strDateFormat = "hh:mm:ss a dd-MMM-yyyy";
        SimpleDateFormat objSDF = new SimpleDateFormat(strDateFormat);
        System.out.println(objSDF.format(objDate));
    }
}

Saรญda:

Wed Nov 29 06:31:41 UTC 2017
06:31:41 AM 29-Nov-2017

Exemplo de comparaรงรฃo de datas

Exemplo de comparaรงรฃo de datas

A maneira mais confiรกvel de pedir dois Date objetos รฉ o compareTo() O mรฉtodo retorna um nรบmero inteiro negativo quando a data solicitada รฉ anterior, zero quando ambas as datas sรฃo iguais e um nรบmero inteiro positivo quando a data solicitada รฉ posterior. O trecho de cรณdigo abaixo analisa duas strings de data e imprime sua ordem relativa:

import java.text.SimpleDateFormat;
import java.text.ParseException;
import java.util.Date;

class TestDates_Compare {
    public static void main(String args[]) throws ParseException {

        SimpleDateFormat objSDF = new SimpleDateFormat("dd-MM-yyyy");
        Date dt_1 = objSDF.parse("20-08-1981");
        Date dt_2 = objSDF.parse("12-10-2012");

        System.out.println("Date1 : " + objSDF.format(dt_1));
        System.out.println("Date2 : " + objSDF.format(dt_2));

        // compareTo returns > 0 when dt_1 is after dt_2
        if (dt_1.compareTo(dt_2) > 0) {
            System.out.println("Date 1 occurs after Date 2");
        }
        // compareTo returns < 0 when dt_1 is before dt_2
        else if (dt_1.compareTo(dt_2) < 0) {
            System.out.println("Date 1 occurs before Date 2");
        }
        // compareTo returns 0 when both dates are equal
        else {
            System.out.println("Both are the same date");
        }
    }
}

Saรญda:

Date1 : 20-08-1981
Date2 : 12-10-2012
Date 1 occurs before Date 2

Observaรงรฃo: O cรณdigo original utilizava o padrรฃo dd-mm-yyyy. As letras minรบsculas mm A letra representa o minuto, nรฃo o mรชs, entรฃo o analisador sintรกtico gerou silenciosamente o valor errado para o mรชs. A correรงรฃo acima usa letras maiรบsculas. MM para o mรชs, que รฉ a letra do padrรฃo correto.

Java 8 API moderna de data e hora (java.time)

Java 8 introduziu o java.time O pacote apresenta uma API redesenhada inspirada na biblioteca Joda-Time. As novas classes sรฃo imutรกveis, thread-safe e separam o calendรกrio humano da linha do tempo da mรกquina. Os tipos mais comuns sรฃo:

  • LocalDate Para uma data sem hora ou fuso horรกrio especificados (por exemplo, um aniversรกrio).
  • LocalTime Para exibir a hora em um relรณgio de parede, sem data ou fuso horรกrio.
  • LocalDateTime Para uma data e hora sem fuso horรกrio.
  • ZonedDateTime para uma data e hora com um fuso horรกrio especรญfico.
  • OffsetDateTime Para uma data e hora com um deslocamento UTC, mas sem fuso horรกrio nomeado.
  • Instant para um registro de data e hora da mรกquina medido a partir da รฉpoca UNIX.
  • Duration e Period para valores baseados em tempo e em data.

O exemplo abaixo imprime a data, hora, carimbo de data/hora e fuso horรกrio atuais usando a API moderna:

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.ZonedDateTime;
import java.time.Instant;
import java.time.ZoneId;

class ModernDateDemo {
    public static void main(String args[]) {
        LocalDate today = LocalDate.now();
        LocalDateTime now = LocalDateTime.now();
        ZonedDateTime zoned = ZonedDateTime.now(ZoneId.of("Asia/Kolkata"));
        Instant epoch = Instant.now();

        System.out.println("LocalDate     : " + today);
        System.out.println("LocalDateTime : " + now);
        System.out.println("ZonedDateTime : " + zoned);
        System.out.println("Instant       : " + epoch);
    }
}

Cada tipo possui mรฉtodos de fรกbrica (now, of, parse) e operaรงรตes imutรกveis โ€‹โ€‹(plusDays, minusHours, withYear) que retornam um novo valor em vez de modificar o objeto original.

Formatador de Data e Hora: Formate datas no formato moderno Java

DateTimeFormatter in java.time.format substitui SimpleDateFormatEla usa o mesmo estilo de letras padrรฃo, รฉ imutรกvel e pode ser compartilhada com seguranรงa entre threads sem sincronizaรงรฃo adicional. A classe tambรฉm expรตe constantes prontas para uso, como ISO_LOCAL_DATE e ISO_ZONED_DATE_TIME para formatos padrรฃo.

import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

class FormatterDemo {
    public static void main(String args[]) {
        LocalDateTime now = LocalDateTime.now();

        DateTimeFormatter iso = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
        DateTimeFormatter human = DateTimeFormatter.ofPattern("hh:mm:ss a dd-MMM-yyyy");

        System.out.println(now.format(iso));
        System.out.println(now.format(human));

        LocalDateTime parsed = LocalDateTime.parse("2026-07-04T09:30:00", iso);
        System.out.println("Parsed back : " + parsed);
    }
}

Para comparar duas datas na API moderna, chame isBefore, isAfter, ou isEqualEsses mรฉtodos sรฃo mais fรกceis de ler do que compareTo e trabalhar com todos java.time classe.

Seguranรงa de roscas e melhores prรกticas para Java Data e Hora

Ambos java.util.Date e SimpleDateFormat anteriores aos modernos contemporรขneos JavaE cada uma delas tem suas desvantagens conhecidas. Siga as prรกticas abaixo para manter o tratamento de datas correto no cรณdigo de produรงรฃo:

  • Prefira java.time a Date e Calendar. Os novos tipos sรฃo imutรกveis โ€‹โ€‹e seguros para uso em mรบltiplas threads, e modelam o domรญnio com maior precisรฃo (datas sem horรกrios, horรกrios sem fusos horรกrios, etc.).
  • Nรฃo compartilhe um SimpleDateFormat entre tรณpicos diferentes. A classe armazena o estado interno da anรกlise sintรกtica e nรฃo รฉ thread-safe. Envolva-a em um ThreadLocal, sincronize na instรขncia ou mude para DateTimeFormatter.
  • Sempre especifique uma localidade. Os nomes dos meses e dias mudam de acordo com a localidade padrรฃo da JVM, o que cria padrรตes como MMM e EEE nรฃo portรกtil. Passe uma localidade explicitamente (por exemplo, Locale.ENGLISH).
  • Seja explรญcito quanto aos fusos horรกrios. LocalDateTime Nรฃo possui zona, entรฃo converta para ZonedDateTime or Instant Sempre que o momento exato importa, especialmente para registros, colunas de banco de dados e dados de rede.
  • Converta entre as duas APIs com cuidado. Uso date.toInstant(), Date.from(instant) e calendar.toInstant().atZone(zone) na fronteira entre o cรณdigo legado e o cรณdigo moderno.
  • Armazene os registros de data e hora em UTC. Persista e transmit datas como UTC (um Instant ou uma string ISO 8601) e converter para a zona do usuรกrio somente ao exibir.

Perguntas Frequentes

Chame LocalDateTime.now() do pacote java.time para obter uma data e hora no fuso horรกrio do sistema, ou LocalDate.now() para obter apenas a data. Em versรตes mais antigas do sistema, isso pode ser feito chamando LocalDateTime.now() do pacote java.time. Java, use new java.util.Date() para obter o instante atual.

java.util.Date representa um instante em milissegundos desde a รฉpoca Unix e รฉ mutรกvel. LocalDate modela uma data de calendรกrio sem hora ou fuso horรกrio, รฉ imutรกvel e thread-safe, e oferece mรฉtodos mais claros como plusDays e isBefore.

Nรฃo. O SimpleDateFormat mantรฉm um estado de anรกlise mutรกvel e produz resultados incorretos quando compartilhado entre threads. Envolva-o em um ThreadLocal, sincronize na instรขncia ou mude para DateTimeFormatter, que รฉ imutรกvel e seguro.

Passe a string exata โ€œyyyy-MM-ddโ€. MM em maiรบsculo representa o mรชs e mm em minรบsculo representa os minutos. Para a data e hora completas, use โ€œyyyy-MM-dd HH:mm:ssโ€. Sempre especifique uma localidade para que os nomes dos meses permaneรงam consistentes.

Com o mรฉtodo `Date` legado, use `compareTo`, que retorna um inteiro negativo, zero ou positivo. Com `java.time`, chame `isBefore`, `isAfter` ou `isEqual` em um `LocalDate` ou `Instant`. Ambas as abordagens respeitam a ordem cronolรณgica.

Chame `date.toInstant().atZone(ZoneId.systemDefault()).toLocalDateTime()`. Para voltar no tempo, use `Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant())`. Selecione o fuso horรกrio explicitamente sempre que o momento exato for importante.

Modelos de IA treinados em corpora de logs e documentos inferem o padrรฃo provรกvel a partir de strings de amostra e retornam um padrรฃo DateTimeFormatter correspondente. Classificadores de aprendizado de mรกquina tambรฉm sinalizam campos ambรญguos, como a ordem mรชs-dia versus dia-mรชs.

Sim. O GitHub Copilot sugere padrรตes DateTimeFormatter, conversรตes ZonedDateTime e JUnit Testes para saรญda sensรญvel ร  localizaรงรฃo. RevConfira cada sugestรฃo para as letras do padrรฃo correto, localidade e fuso horรกrio antes de confirmar.

Resuma esta postagem com: