Pergunta

Existe uma maneira sensata de grupo longo UTC datas por dia?

Eu faria Mod-los por 86400 mas que não leva segundos bissextos em conta.

Alguém tem alguma outra idéia, eu estou usando java para que eu pudesse analisá-los em Data Objects, mas estou um pouco preocupado a sobrecarga de usar a classe data desempenho.

Além disso, há uma maneira mais eficiente do que comparando o mês eo dia ano para peças de um objeto Date?

Foi útil?

Solução

A sua fonte de dados definitivamente incluem segundo salto para começar? Algumas APIs fazer, e alguns não - Joda Time (que eu recomendo sobre o built-in Data APIs / hora) não usa segundos bissextos , por exemplo. Os data e hora APIs Java "às vezes" fazer - eles suportam 60 e 61 como valores de "segundo em minutos", mas o apoio depende do sistema operacional (veja abaixo). Se você tem alguns valores boa amostra, eu iria verificar que o primeiro se eu fosse você. Obviamente, apenas dividindo é bastante mais simples do que qualquer outra coisa.

Se você do necessidade de criar objetos Date (ou DateTime em Joda) Eu faria referência que antes de fazer qualquer outra coisa. Você pode muito bem achar que o desempenho é realmente perfeitamente adequada. Não há nenhum ponto em desperdiçar tempo otimizando algo que é bom para seus dados. Claro, você precisa decidir o tamanho dos dados que você precisa de apoio, e quão rápido ele precisa ser primeiro:)

Mesmo o apoio java.util.Date para segundos bissextos é algo indeterminado. De os docs :

Embora a classe Data tem a intenção de refletir o tempo universal coordenado (UTC), não pode fazê-lo exatamente, dependendo do ambiente de acolhimento de o Java Virtual Machine. Quase todos sistemas operacionais modernos assumir que 1 dia = 24 × 60 × 60 = 86400 em segundo todos os casos. Em UTC, no entanto, cerca de uma vez cada ano ou dois, há um extra segundo, chamado de "segundo bissexto". o segundo salto é sempre adicionado como o último segundo do dia, e sempre em 31 de Dezembro ou 30 de junho, por exemplo, o último minuto do ano 1995 foi de 61 segundos de duração, graças a um adicionada segundo salto. A maioria dos relógios dos computadores são não o suficiente precisa para ser capaz de reflectem a distinção salto de segundo.

Há um bastante bom post no blog sobre a confusão com Java e segundo salto que você pode querer ler também.

Outras dicas

Eu faria Mod-los por 86400 mas que não leva segundos bissextos em conta ....

Eu tenho certeza que isso vai ficar bem. A documentação da API para Date realmente não deve incluir qualquer coisa sobre segundo salto, porque o fato é que ele emula um padrão ticker tempo Unix que não inclui segundos bissextos em seu valor. O que ele faz é em vez de ter um segundo 59 que tem a duração de dois segundos, definindo o valor ticker de volta por 1 segundo no início de um segundo salto (como o link no post anterior descreve).

Portanto, você pode assumir que o valor que você recebe de Date.getTime() é feita só de 86400 segundos dias. Se você realmente precisa saber se um particular, dia teve um segundo salto, existem várias mesas disponíveis na Internet (houve apenas 23-24 desde 1972, e as datas de computador antes que raramente levou para conta de qualquer maneira).

HIH

Winston

tl; dr

Instant.ofEpochSecond( 1_493_367_302L )            // Convert a count of whole seconds from epoch of 1970 into a date-time value in UTC.
       .atZone( ZoneId.of( "Pacific/Auckland" ) )  // Adjust into the time zone as a context for determining a date.
       .toLocalDate()                              // Extract a date-only value by which we can sort/collect/organize our date-time values.

Fuso horário

A classe java.util.Date representa um momento na linha do tempo em UTC. Então, pedindo-lhe para uma data você recebe uma data que só faz sentido no UTC. Naquele mesmo momento pode ser uma data anterior em Québec ou uma data posterior em Auckland, Nova Zelândia.

Fuso horário é crucial para determinar uma data, e seu Pergunta ignora esta questão.

Usando java.time

A classe java.util.Date faz parte dos incômodos aulas de data e hora de idade que estão agora legado, suplantado pelas classes java.time.

Como para segundos bissextos, como as outras respostas sugeriram, a maioria das fontes de contagem de-época fazer não contagem salto segundos. Portanto, verificar a sua fonte.

Se você tem uma contagem de segundos inteiros da época de 1970-01-01T00:00:00, em seguida, usar o método estático para criar um objeto Instant.

Instant instant = Instant.ofEpochSecond( 1_493_367_302L ) ;

instant.toString (): 2017-04-28T08: 15: 02Z

Atribuir um fuso horário para criar o contexto em que podemos determinar uma data. Para qualquer dado momento, a data varia em todo o mundo por zona.

Especifique um tempo apropriado nome de zona no formato de continent/region, como America/Montreal , Africa/Casablanca , ou Pacific/Auckland. Nunca utilize o 3-4 letras, como EST ou IST como eles são não fusos horários verdadeiros, não padronizados, e nem mesmo únicos (!).

ZoneId z = ZoneId.of( "America/Montreal" ); 
ZonedDateTime zdt = instant.atZone( z );

zdt.toString (): 2017-04-28T01: 15: 02-07: 00 [America / Los_Angeles]

Com de monte desses ZonedDateDate objetos, você pode comparar por data. Você pode extrair um objeto LocalDate. A LocalDate classe representa uma data-only valor sem hora do dia e sem fuso horário.

LocalDate ld = zdt.toLocalDate();

ld.toString (): 2017/04/28

Assim, você poderá fazer uma Map com LocalDate como a chave e um List ou Set de objetos ZonedDateTime como o valor. E com a sintaxe lambda moderno, você poderia usar Streams para fazer esse mapeamento.


Sobre java.time

O java.time quadro é construído em Java 8 e posterior. Essas classes suplantar o problemático idade legados aulas de data e hora, como java.util.Date , Calendar , e SimpleDateFormat .

O Joda-Time projeto, agora em modo de manutenção , aconselha migração para o java.time classes.

Para saber mais, consulte a a Oracle Tutorial . E busca Stack Overflow para muitos exemplos e explicações. Especificação é JSR 310 .

Onde obter as classes java.time?

O ThreeTen-Extra projeto estende java.time com aulas adicionais. Este projeto é um campo de provas para possíveis adições futuras para java.time. Você pode encontrar algumas classes úteis aqui, como Interval , YearWeek , YearQuarter , e mais .

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top