Eu sei disso:
- O Instant é uma representação "técnica" de carimbo de data / hora (nanossegundos) para a computação.
- LocalDateTime é uma representação de data / relógio, incluindo fusos horários para humanos.
Ainda no final, o IMO pode ser considerado como um tipo para a maioria dos casos de uso de aplicativos. Como exemplo: no momento, estou executando um trabalho em lotes no qual preciso calcular uma próxima execução com base nas datas e lutando para encontrar prós / contras entre esses dois tipos (além da vantagem de precisão em nanossegundos do Instant e da parte do fuso horário LocalDateTime).
Você pode citar alguns exemplos de aplicativos, onde apenas Instant ou LocalDateTime devem ser usados?
Edit: Cuidado com as documentações mal interpretadas do LocalDateTime sobre precisão e fuso horário
LocalDateTime
se não tiver um fuso horário!Respostas:
tl; dr
Instant
eLocalDateTime
são dois animais completamente diferentes: um representa um momento, o outro não.Instant
representa um momento, um ponto específico na linha do tempo.LocalDateTime
representa uma data e uma hora do dia. Mas, sem um fuso horário ou deslocamento do UTC, essa classe não pode representar um momento . Representa momentos em potencial ao longo de um intervalo de cerca de 26 a 27 horas, o intervalo de todos os fusos horários do mundo.Presunção incorreta
Sua declaração está incorreta: A não
LocalDateTime
possui fuso horário . Não ter fuso horário é o ponto principal dessa classe.Para citar o documento dessa classe:
Então
Local…
significa "não zoneado, sem deslocamento".Instant
An
Instant
é um momento na linha do tempo no UTC , uma contagem de nanossegundos desde a época do primeiro momento de 1970 no UTC (basicamente, consulte a classe doc para obter detalhes minuciosos). Como a maior parte da lógica de negócios, armazenamento de dados e troca de dados deve estar no UTC, essa é uma classe útil a ser usada com frequência.OffsetDateTime
A turma da
OffsetDateTime
turma representa um momento como data e hora com um contexto de um número de horas-minutos-segundos antes ou atrás do UTC. A quantidade de deslocamento, o número de horas-minutos-segundos, é representada pelaZoneOffset
classe.Se o número de horas-minutos-segundos for zero, um
OffsetDateTime
representa um momento no UTC igual a umInstant
.ZoneOffset
A
ZoneOffset
classe representa um deslocamento do UTC , um número de horas-minutos-segundos antes do UTC ou atrás do UTC.A
ZoneOffset
é apenas um número de horas-minutos-segundos, nada mais. Uma zona é muito mais, com um nome e um histórico de alterações a serem compensadas. Portanto, sempre é preferível usar uma zona do que usar um mero deslocamento.ZoneId
Um fuso horário é representado pela
ZoneId
classe.Um novo dia amanhece mais cedo em Paris do que em Montreal , por exemplo. Portanto, precisamos mover os ponteiros do relógio para refletir melhor o meio-dia (quando o Sol está diretamente no alto) para uma determinada região. Quanto mais distante o leste / oeste da linha UTC no oeste da Europa / África, maior o deslocamento.
Um fuso horário é um conjunto de regras para lidar com ajustes e anomalias, conforme praticado por uma comunidade ou região local. A anomalia mais comum é a loucura popular, conhecida como Horário de Verão (DST) .
Um fuso horário tem o histórico de regras passadas, regras presentes e regras confirmadas em um futuro próximo.
Essas regras mudam com mais frequência do que você poderia esperar. Certifique-se de manter as regras da sua biblioteca de data e hora, geralmente uma cópia do banco de dados 'tz' , atualizada. Manter-se atualizado é mais fácil do que nunca agora no Java 8, com o Oracle lançando uma Ferramenta de Atualização do Fuso Horário .
Especifique um nome próprio fuso horário no formato
Continent/Region
, comoAmerica/Montreal
,Africa/Casablanca
, ouPacific/Auckland
. Nunca use o 2-4 letras, comoEST
ouIST
como eles são não zonas verdadeiros tempo, não padronizados, e nem mesmo única (!).ZonedDateTime
Pense
ZonedDateTime
conceitualmente como umInstant
com um atribuídoZoneId
.Para capturar o momento atual como visto no relógio de parede usado pelas pessoas de uma região específica (um fuso horário):
Quase todo o seu back-end, banco de dados, lógica de negócios, persistência de dados e troca de dados devem estar no UTC. Mas para a apresentação aos usuários, você precisa ajustar o fuso horário esperado pelo usuário. Esse é o objetivo da
ZonedDateTime
classe e das classes do formatador usadas para gerar representações de String desses valores de data e hora.Você pode gerar texto no formato localizado usando
DateTimeFormatter
.LocalDate
,LocalTime
,LocalDateTime
As classes de data e hora "locais",
LocalDateTime
,LocalDate
,LocalTime
, são um tipo diferente de criatura. O não está vinculado a nenhuma localidade ou fuso horário. Eles não estão vinculados à linha do tempo. Eles não têm significado real até que você os aplique a uma localidade para encontrar um ponto na linha do tempo.A palavra "Local" nesses nomes de classe pode ser contra-intuitiva para os não iniciados. A palavra significa qualquer localidade, ou toda localidade, mas não uma localidade específica.
Portanto, para aplicativos de negócios, os tipos "Local" geralmente não são usados, pois representam apenas a idéia geral de uma possível data ou hora, não um momento específico na linha do tempo. Os aplicativos de negócios tendem a se importar com o momento exato em que uma fatura chegou, um produto enviado para transporte, um funcionário foi contratado ou o táxi saiu da garagem. Portanto, os desenvolvedores de aplicativos de negócios usam
Instant
eZonedDateTime
classificam com mais frequência.Então, quando usaríamos
LocalDateTime
? Em três situações: onde queremos aplicar uma determinada data e hora do dia em vários locais, onde estamos agendando compromissos ou onde temos um fuso horário ainda indeterminado. Observe que nenhum desses três casos é um único ponto específico na linha do tempo; nenhum deles é um momento.Uma hora do dia, vários momentos
Às vezes, queremos representar uma determinada hora do dia em uma determinada data, mas queremos aplicá-la em várias localidades em fusos horários.
Por exemplo, "O Natal começa à meia-noite de 25 de dezembro de 2015" é a
LocalDateTime
. A meia-noite ocorre em diferentes momentos em Paris do que em Montreal, e novamente diferente em Seattle e Auckland .Outro exemplo, "A Acme Company tem uma política de que a hora do almoço começa às 12h30 em cada uma de suas fábricas em todo o mundo" é a
LocalTime
. Para ter um significado real, é necessário aplicá-lo à linha do tempo para calcular o momento das 12:30 na fábrica de Stuttgart ou 12:30 na fábrica de Rabat ou 12:30 na fábrica de Sydney .Marcação de marcações
Outra situação a ser usada
LocalDateTime
é para reservar eventos futuros (por exemplo: consultas com dentistas). Essas nomeações podem estar suficientemente longe no futuro, para que você arrisque os políticos a redefinir o fuso horário. Os políticos costumam dar pouco aviso prévio, ou mesmo nenhum aviso. Se você quer dizer "15:00 no próximo dia 23 de janeiro", independentemente de como os políticos possam jogar com o relógio, não é possível gravar um momento - isso faria as 15:00 se transformarem em 14:00 ou 16:00 se a região adotasse ou diminuísse o horário de verão, por exemplo.Para compromissos, armazene ae
LocalDateTime
aZoneId
, mantidos separadamente. Mais tarde, ao gerar uma programação, determine rapidamente um momento chamandoLocalDateTime::atZone( ZoneId )
para gerar umZonedDateTime
objeto.Se necessário, você pode ajustar para UTC. Extraia um
Instant
doZonedDateTime
.Zona desconhecida
Algumas pessoas podem usar
LocalDateTime
em uma situação em que o fuso horário ou deslocamento é desconhecido.Considero este caso inadequado e imprudente. Se uma zona ou deslocamento for planejado, mas indeterminado, você terá dados incorretos. Seria como armazenar o preço de um produto sem saber a moeda pretendida. Não é uma boa ideia.
Todos os tipos de data e hora
Para garantir a integridade, aqui está uma tabela de todos os tipos possíveis de data e hora, modernos e herdados em Java, além daqueles definidos pelo padrão SQL. Isso pode ajudar a colocar as classes
Instant
&LocalDateTime
em um contexto maior.Observe as escolhas ímpares feitas pela equipe Java no design do JDBC 4.2. Eles escolheram dar suporte a todos os tempos java.time … exceto pelas duas classes mais usadas:
Instant
&ZonedDateTime
.Mas não se preocupe. Podemos facilmente converter para frente e para trás.
Convertendo
Instant
.Convertendo
ZonedDateTime
.Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de strings, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
O projeto ThreeTen-Extra estende o java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como
Interval
,YearWeek
,YearQuarter
, e mais .fonte
Local
nome. Minha intuição porLocal
meios em relação a onde estou E quando estou (?!), O que me leva a acreditar que seria realmente o queZonedDateTime
é.DateTime
nome da classe usado por seu antecessor Joda-Time (produtorZonedDateTime
), para enfatizar a diferença das classes "Local". Pense no nome "Local" como abreviação de "precisando ser aplicado a alguma localidade específica".Local
também pode ter sido uma maneira de diferenciar o pacote java.util, embora, de alguma forma, eu ache que poderia haver uma melhor escolha de palavra.Uma diferença principal é a
Local
parte deLocalDateTime
. Se você mora na Alemanha e cria umaLocalDateTime
instância e alguém mora nos EUA e cria outra instância no mesmo momento (desde que os relógios estejam configurados corretamente) - o valor desses objetos seria realmente diferente. Isso não se aplica aInstant
, calculado independentemente do fuso horário.LocalDateTime
armazena data e hora sem fuso horário, mas seu valor inicial depende do fuso horário.Instant
não é.Além disso,
LocalDateTime
fornece métodos para manipular componentes de data, como dias, horas, meses. UmInstant
não.Ambas as classes têm a mesma precisão.
LocalDateTime
não armazena fuso horário. Leia os javadocs completamente, pois você pode cometer um grande erro com essas suposições inválidas: Instant e LocalDateTime .fonte
LocalDateTime stores date and time without timezone, but it's initial value is timezone dependent
? qual é o valor inicial e como é dependente do fuso horário? Obrigado.Você está errado
LocalDateTime
: ele não armazena nenhuma informação de fuso horário e possui precisão de nanossegundos. Citando o Javadoc (ênfase minha):A diferença entre os dois é que
Instant
representa um deslocamento da época (01-01-1970) e, como tal, representa um instante específico na linha do tempo. DoisInstant
objetos criados no mesmo momento em dois lugares diferentes da Terra terão exatamente o mesmo valor.fonte
Instant
corresponde ao tempo no meridiano de Greenwich (Greenwich).Considerando que, em
LocalDateTime
relação às configurações de fuso horário do SO, efonte