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.

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.
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:
| Carta | Componente de data ou hora | Exemplo |
|---|---|---|
| G | Designador de era | AD |
| y | Ano | 2026 |
| M | Mรชs no ano | Julho ou julho ou 07 |
| w | Semana no ano | 27 |
| W | Semana no mรชs | 2 |
| D | Dia no ano | 189 |
| d | Dia no mรชs | 10 |
| F | Dia da semana no mรชs | 2 |
| E | Nome do dia na semana | Terรงa ou Terรงa |
| u | Nรบmero do dia da semana (1 = Monday, 7 = Domingo) | 1 |
| a | Marcador AM ou PM | PM |
| H | Hora do dia (0-23) | 0 |
| k | Hora do dia (1-24) | 24 |
| K | Hora em AM ou PM (0-11) | 0 |
| h | Hora em AM ou PM (1-12) | 12 |
| m | Minuto em hora | 30 |
| s | Segundo em minuto | 55 |
| S | Milissegundo | 978 |
| z | Fuso horรกrio (nome) | Hora padrรฃo do Pacรญfico; PST; GMT-08: 00 |
| Z | Fuso horรกrio (deslocamento RFC 822) | -0800 |
| X | Fuso 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:
- 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. - 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
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:
LocalDatePara uma data sem hora ou fuso horรกrio especificados (por exemplo, um aniversรกrio).LocalTimePara exibir a hora em um relรณgio de parede, sem data ou fuso horรกrio.LocalDateTimePara uma data e hora sem fuso horรกrio.ZonedDateTimepara uma data e hora com um fuso horรกrio especรญfico.OffsetDateTimePara uma data e hora com um deslocamento UTC, mas sem fuso horรกrio nomeado.Instantpara um registro de data e hora da mรกquina medido a partir da รฉpoca UNIX.DurationePeriodpara 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 paraDateTimeFormatter. - 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
MMMeEEEnรฃo portรกtil. Passe uma localidade explicitamente (por exemplo,Locale.ENGLISH). - Seja explรญcito quanto aos fusos horรกrios.
LocalDateTimeNรฃo possui zona, entรฃo converta paraZonedDateTimeorInstantSempre 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)ecalendar.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
Instantou uma string ISO 8601) e converter para a zona do usuรกrio somente ao exibir.


