Joda-Time: qual é a diferença entre período, intervalo e duração?

192

No Joda-Time 2, qual é a diferença entre os três tipos de intervalos de tempo:

  • Período
  • Intervalo
  • Duração

    1. Por que precisamos de três aulas?

    2. Qual deles tem melhor desempenho?

    3. Por que a divisão de uma instância de Período ou Duração ou Intervalo não foi implementada? Por exemplop = p.divideBy(2);

Gerard
fonte
3
Observe que essa terminologia de data e hora ainda não foi padronizada. A idéia da duração da norma ISO-8601 é o que a Joda-Time considera a . Uma proposta para padronizar essa terminologia foi levantada, mas ainda não cumprida. Period
Basil Bourque

Respostas:

246

São necessárias três classes, porque representam conceitos diferentes; portanto, é uma questão de escolher o apropriado para o trabalho, e não de desempenho relativo. Da documentação com comentários adicionados por mim em itálico :


Um intervalo no Joda-Time representa um intervalo de tempo de um milésimo de segundo a outro instante. Ambos os instantes são instantes totalmente especificados no continuum datetime, completo com fuso horário. São definidos horários específicos, por exemplo, este pode ser o intervalo entre 20: 00: 00GMT de ontem e 09: 00: 00GMT desta manhã.

Uma duração em Joda-Time representa uma duração medida em milissegundos. A duração é frequentemente obtida a partir de um intervalo. ou seja, podemos subtrair o início do final de um intervalo para derivar uma duração

Um período no Joda-Time representa um período definido em termos de campos, por exemplo, 3 anos, 5 meses, 2 dias e 7 horas. Isso difere da duração, pois é inexato em termos de milissegundos. Um período só pode ser resolvido para um número exato de milissegundos especificando o instante (incluindo cronologia e fuso horário) em que ele é relativo. por exemplo, considere o período de 1 ano; se adicionarmos a 1º de janeiro, sempre chegaremos no próximo 1º de janeiro, mas a duração dependerá de o ano intermediário ser um ano bissexto ou não. Da mesma forma, se adicionarmos 1 mês ao 1º de um mês, chegaremos ao 1º do próximo mês, mas a duração (em milissegundos) variará com base no mês em questão


Para a pergunta 3, um método específico para dividir uma duração não é realmente necessário porque sempre podemos obter o número de milissegundos da duração como a long(usando getMillis()), dividi-lo e construir uma nova duração (usando new Duration(long duration)).

Dividir um período realmente não tem um significado real com base na definição de um período acima. por exemplo, o que é meio mês? (sua duração dependeria de qual mês).

mikej
fonte
1
Acho que dividir um período tem um significado - meio mês ainda é uma unidade de tempo válida, mas exige uma data de início para saber exatamente quanto tempo (exatamente da mesma maneira que um mês é um período válido).
Hadley #
11
O Jodatime considera que um período é uma tupla de campos com valor INTEGER, não permite valores fracionários. Isso é consistente com o uso comum (civil). Praticamente ninguém na vida comum considera que "1 mês e 10 dias" dividido por dois é "meio mês e 5 dias". Se você precisar fazer essa divisão, provavelmente desejará uma duração (tempo físico).
Leonbloy
90

Para adicionar à resposta de mikej :

Uma duração Joda-Time é um intervalo de tempo "físico"; por exemplo:

12000 milliseconds <- esta é uma duração

Um intervalo Joda-Time é na verdade um par de instantes (início instantâneo - final instantâneo). Um instante é, novamente, um conceito "físico", um ponto na linha do tempo. Por exemplo (apenas uma notação possível):

(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC) <- este é um intervalo

Um intervalo , então, pode ser convertido para uma duração , mas não o inverso.

Considere estes dois intervalos:

I1=(2010/3/3 19:00:00.000 UTC ; 2010/3/3 20:00:00.000 UTC)

I2=(2010/3/3 21:00:00.000 UTC ; 2010/3/3 22:00:00.000 UTC)

Como intervalos I1e I2são diferentes, porque os pontos finais são diferentes; mas se eu convertê-los para durações, eu recebo a mesma coisa: 3600000 milliseconds.

(Analogia matemática: os intervalos [10,12]e [95,97]são intervalos diferentes , mas eles têm o mesmo comprimento : o "comprimento do intervalo" é mapeado para a duração ).

Finalmente, um período é um lapso de "tempo civil", expresso como um número de meses, dias, horas etc. Ele não representa por si só um intervalo "físico", portanto, não pode ser convertido diretamente em um duração (os meses têm comprimentos variáveis ​​...).

Isso responde à pergunta 3: você só pode dividir por dois um tempo físico (uma duração).

leonbloy
fonte
Quatro meses divididos por dois seriam dois meses. Por que isso não é válido?
Hadley #
1
Como você calcularia '2 meses; 18 dias dividido por 3? Você não pode obter uma definição consistente para esse tipo de operação.
Leonbloy 7/11
3
Acho que você pode obter uma definição consistente, mas precisa pensar nisso como 1/3 do tempo de "2 meses e 18 dias". Você não será capaz de descobrir exatamente o que é até convertê-lo em um intervalo. Só porque JODA não suporta, isso não significa que é inválido.
Hadley #
@hadley Não existe uma definição civil para "um terço do dia". Por exemplo, nenhum contrato é válido por um terço do dia.
Ipavlic
4
@ Richard Watson Os dias podem durar 23, 24 ou 25 horas, por causa do horário de verão. Portanto, "um terço do dia a partir de ..." é válido, mas apenas "um terço" não é.
Ipavlic