Executando verificação de segurança...
2

Em nenhum ponto do texto eu afirmo isso. Eu só disse que não há uma norma oficial sobre como a aritmética de datas deve funcionar, e que em outro comentário foi citado como "aritmética universal".

Ah, sim. É que eu tinha visto noutro comentário, mas peço perdão pelo equívoco. Neste ponto não há realmente consenso pelo que estudei então há convergência nas informações. (Não quero me sobressair, apenas em caso de divergência é uma oportunidade para eu aprender.)

Enfim, ZoneOffset representa apenas um offset específico, e ZoneId representa um timezone, com todo o histórico de offsets.

Realmente tinha sido este o entendimento que eu tive, mas acho que na minha própria anotação não deixei tão claro, isso iria me atrapalhar em possiveis revisões (eu entendo as anotações porque ainda está fresco na mente). E sobre o ZoneId guardar o histórico de Offset das regiões eu não fazia ideia que as "informações completas" incluiam isso.

Por último, obrigado pelos artigos, tô com um acumulado pra ler, mas logo mais darei uma atenção a eles.

Carregando publicação patrocinada...
3

Complementando mais um pouco...

A ideia do TemporalAccessor é ser uma interface bem básica que define uma maneira genérica de obter os valores numéricos correspondentes aos campos de data. Tanto que os únicos métodos que vc precisa implementar recebem um TemporalField, e um indica se o campo é suportado, enquanto outro retorna seu valor.

É a funcionalidade mais básica, que permite que se obtenha qualquer campo de uma classe que represente datas/horas, quando suportado.

Já a interface Temporal adiciona métodos para modificar campos (na verdade, para retornar outra instância modificada, já que as classes do java.time são imutáveis) e somar/subtrair uma unidade de tempo.

Mas na documentação de ambas diz para evitar usá-las diretamente - salvo raras exceções, e de fato na prática eu acabo usando tipos específicos para cada caso (LocalDate, ZonedDateTime, Instant, etc). Inclusive, os getters de cada classe são mais fáceis de usar do que o get genérico de TemporalAccessor (que também quase não uso na prática).


Sobre o histórico de offsets, podemos fazer um pequeno código para ver a diferença. Primeiro com um timezone:

// obtém a lista de mudanças de offset
List<ZoneOffsetTransition> mudancas = ZoneId.of("America/Sao_Paulo").getRules().getTransitions();
System.out.println(mudancas.size()); // 91
for (ZoneOffsetTransition tr : mudancas) {
    System.out.println(tr);
}

A quantidade exata de mudanças vai variar conforme a versão do Java e do TZDB que estiver instalada, já que isso é sempre atualizado. Mas enfim, no timezone America/Sao_Paulo tem uma lista bem grande de alterações.

Agora se usarmos um offset:

List<ZoneOffsetTransition> mudancas = ZoneOffset.ofHours(-3).getRules().getTransitions();
System.out.println(mudancas.size()); // 0
for (ZoneOffsetTransition tr : mudancas) {
    System.out.println(tr);
}

A lista terá zero mudanças, e o for não vai imprimir nada. Isso porque o offset é fixo, nunca muda.


Aliás, essa é uma das pouquíssimas API's que fazem esta distinção. A maioria simplesmente assume que offset é o mesmo que timezone e acabam ficando incompletas e até mesmo incorretas. Não é raro ter apenas uma única classe para ambos (isso quando tem, pois há API's que nem sequer permitem manipular o timezone).

Eu particularmente considero o java.time uma das mais completas e bem pensadas API's de data existentes, por esse e vários outros detalhes.

2

Concordo que seja bem pensada, ainda mais pelo fato dela contemplar tudo o que existe em datas. E por eu ter dedicado fucking 2 ou 3 dias estudando todas as suas variações, estranhei a complicação excessiva nesta coisa de data (menos Chronology, pois acho que será beem raro ao ponto de ser possível de eu nunca precisar utilizar um calendário diferente do ISO). O que me pegou mesmo foi saber a diferença de data e um ponto específico no tempo, mas agora já tenho uma ideia do que é.

Entretanto, ainda assim, quanto mais se estuda sobre esta documentação, pior fica. Parece um conteúdo infinito de camada abaixo de camada kkkkk e isso tem me apavorado e estou quase saindo deste método de estudo de ir na documentação e se aprofundar em seus métodos e voltar a fazer os cursos que só passa uma explicação rasa por cima do que faz e já era. Desta forma me sinto mais aprofundado, mas come muuuito tempo que eu poderia estar estudando coisas e frameworks que o mercado pede para entrar logo na área. O que acha?

2

Como vc já pegou os conceitos básicos (entende que data e ponto no tempo são diferentes, timezone e offset não são a mesma coisa, etc), já está na frente de muita gente :-)

Eu sei como é se perder na documentação, a API é bem grande e completa, e não dá pra pegar todos os conceitos de uma vez. Data/hora é um assunto complicado e muito mais extenso do que as pessoas imaginam.

Minha sugestão é que agora vc pode ir estudando sob demanda: quando surgir a necessidade de fazer algo com datas, pesquise como é nesta API. Os casos de uso mais comuns estão implementados lá, e vários outros não tão comuns assim também.