Eu tenho um segundo período e um zoneId, pelo método1. Ele pode ser convertido para LocalDateTime com o zoneId padrão do sistema, mas não encontro uma maneira de converter um segundo período para LocalDateTime pelo método2, porque não há nenhum ZoneOffset.systemDefault
. Acho que é obscuro.
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
val epochSecond = System.currentTimeMillis() / 1000
LocalDateTime.ofInstant(Instant.ofEpochSecond(epochSecond), ZoneId.systemDefault())//method1
LocalDateTime.ofEpochSecond(epochSecond, 0, ZoneOffset.MAX)//method2
import java.time.{Instant, LocalDateTime, ZoneId, ZoneOffset}
funcionar? É umunexpected token
para mim em Java 11.java.time
aqui: stackoverflow.com/a/56508200/145989Respostas:
Aqui está como você pode obter
ZoneOffset
deZoneId
:Instant instant = Instant.now(); //can be LocalDateTime ZoneId systemZone = ZoneId.systemDefault(); // my timezone ZoneOffset currentOffsetForMyZone = systemZone.getRules().getOffset(instant);
NB:
ZoneId
pode ter deslocamento diferente dependendo do momento e da história do lugar particular. Portanto, a escolha de diferentes Instants resultaria em diferentes deslocamentos.NB2:
ZoneId.of()
pode retornar umZoneOffset
, em vez deZoneId
seUTC+3
/GMT+2
/ etc é passado, em oposição a um fuso horário comoAfrica/Cairo
. Portanto, se os deslocamentos UTC / GMT forem passados, as informações históricas / geográficas / de horário de verão doInstant
não serão levadas em consideração - você simplesmente trabalhará com o deslocamento especificado.fonte
ZoneId.systemDefault()
em seu código e ele retorne fusos horários diferentes em máquinas diferentes?Não há mapeamento um para um. Um ZoneId define uma extensão geográfica na qual um conjunto de ZoneOffsets diferentes é usado ao longo do tempo. Se o fuso horário usar o horário de verão, seu ZoneOffset será diferente entre o verão e o inverno.
Além disso, as regras do horário de verão podem ter mudado com o tempo, portanto, o ZoneOffset pode ser diferente para, por exemplo, 13/10/2015 em comparação com 13/10/1980.
Portanto, você só pode encontrar o ZoneOffset para um ZoneId em um determinado Instant.
Veja também https://en.wikipedia.org/wiki/Tz_database
fonte
tl; dr
ZonedDateTime.now( ZoneId.of( "America/Montreal" ) )
... do fuso horário padrão atual ...
Detalhes
A resposta de Stanislav Bshkyrtsev responde correta e diretamente à sua pergunta.
Mas, há questões maiores envolvidas, como sugerido na resposta de Jon Skeet .
LocalDateTime
LocalDateTime
propositalmente não tem conceito de fuso horário ou deslocamento em relação ao UTC. Provavelmente não é o que você quer. ALocal…
significa qualquer localidade, não qualquer uma localidade particular. Esta classe não representa um momento, apenas momentos potenciais ao longo de uma faixa de cerca de 26-27 horas (a faixa de fusos horários ao redor do globo).Instant
Não há necessidade de começar com segundos de época se você estiver tentando obter a hora atual. Obtenha a corrente
Instant
. AInstant
classe representa um momento na linha do tempo em UTC com uma resolução de nanossegundos (até nove (9) dígitos de uma fração decimal).Dentro disso,
Instant
há uma contagem de nanossegundos desde a época. Mas nós realmente não nos importamos.ZonedDateTime
Se você quiser ver aquele momento através das lentes do relógio de parede de uma região em particular, aplique a
ZoneId
para obter aZonedDateTime
.ZoneId z = ZoneId.of( "Europe/Paris" ); ZonedDateTime zdt = instant.atZone( z );
Como um atalho, você pode fazer diretamente para o
ZonedDateTime
.A
ZonedDateTime
tem umInstant
dentro dele. Liguezdt.toInstant()
para obter o mesmo momento no tempo que um valor básico em UTC . Mesmo número de nanossegundos desde a época de qualquer maneira, como aZonedDateTime
ou como aInstant
.Segundos desde a época fornecidos
Se você receber uma contagem de segundos desde a época, e a época for o primeiro momento de 1970 em UTC (
1970-01-01T00:00:00Z
), passe esse número paraInstant
.long secondsSinceEpoch = 1_484_063_246L ; Instant instant = Instant.ofEpochSecond( secondsSinceEpoch ) ;
Sobre java.time
A estrutura java.time é construída em Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.Para saber mais, consulte o Tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
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 cordas, não há necessidade de
java.sql.*
classes.Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como
Interval
,YearWeek
,YearQuarter
, e mais .fonte
Como diz a documentação , "Isso se destina principalmente a conversões de baixo nível, em vez de uso geral de aplicativos."
Seguir via
Instant
faz todo o sentido para mim - seu segundo período é efetivamente uma representação diferente de umInstant
, portanto, converta em umInstant
e depois converta isso em um fuso horário específico.fonte
Espero que as duas primeiras linhas da minha solução abaixo sejam úteis. Meu problema era que eu tinha um
LocalDateTime
e o nome de um fuso horário e precisava de uminstant
para poder construir umjava.util.Date
, porque era isso que o MongoDB queria. Meu código é Scala, mas é tão parecido com Java aqui que acho que não deve haver problemas para entendê-lo:val zid = ZoneId.of(tzName) // "America/Los_Angeles" val zo: ZoneOffset = zid.getRules.getOffset(localDateTime) // ⇒ -07:00 // 2017-03-16T18:03 val odt = OffsetDateTime.of(localDateTime, zo) // ⇒ 2017-03-16T18:03:00-07:00 val instant = odt.toInstant // ⇒ 2017-03-17T01:03:00Z val issued = Date.from(instant)
fonte
O seguinte retorna a quantidade de tempo em milissegundos para adicionar ao UTC para obter a hora padrão neste fuso horário:
TimeZone.getTimeZone(ZoneId.of("Europe/Amsterdam")).getRawOffset()
fonte
ZonedDateTime
da segunda época e Id da zonaZoneOffset
deZonedDateTime
Demo:
import java.time.Instant; import java.time.ZoneId; import java.time.ZoneOffset; import java.time.ZonedDateTime; public class Main { public static void main(String[] args) { // Get ZonedDateTime from epoch second and Zone Id ZonedDateTime zdt = Instant.ofEpochSecond(1597615462L).atZone(ZoneId.of("Europe/London")); // Get ZoneOffset from ZonedDateTime ZoneOffset offset = zdt.getOffset(); System.out.println(offset); } }
Resultado:
+01:00
fonte