Pergunta

Preciso de um método para converter o objeto GregianCalendar em tempo Unix (ou seja, um longo). Também precisa de um método para converter o tempo do Unix (longo) de volta ao objeto GregorianCalendar. Existem métodos por aí que isso faz isso? Caso contrário, como posso fazer isso? Qualquer ajuda seria muito apreciada.

Link para a classe GregoriaCalendar -> http://download.oracle.com/javase/1.4.4

Obrigado.

Foi útil?

Solução

Os métodos getTimeInMillis() e setTimeInMillis(long) Deixará você obter e definir o tempo em milissegundos, que é o tempo do Unix multiplicado por 1000. Você precisará ajustar manualmente, pois o tempo do Unix não inclui milissegundos - apenas segundos.

long unixTime = gregCal.getTimeInMillis() / 1000;
gregCal.setTimeInMillis(unixTime * 1000);

Aparte: Se você usar muito as datas em seu aplicativo, especialmente se você estiver convertendo datas ou usando vários fusos horários, eu recomendo usar o Jodatime biblioteca. É muito completo e um pouco mais natural de entender do que o sistema de calendário que vem com Java.

Outras dicas

Acredito que Gregoriancalendar.gettimeinmillis () e Gregoriancalendar.setTimeInmillis () Deixará você obter e definir valores longos da maneira que você deseja.

Confira as funções SettimeInmillis e GetTimeInmillis: http://download.oracle.com/javase/6/docs/api/java/util/calendar.html#gettimeinmillis()

Calendar.gettimeinmillis () deve ser o que você está procurando.

tl; dr

myGregCal.toZonedDateTime().toEpochSecond()                     // Convert from troublesome legacy `GregorianCalendar` to modern `ZonedDateTime`.

E indo para a outra direção ...

GregorianCalendar.from(                                         // Convert from modern `ZonedDateTime` to troublesome legacy class `GregorianCalendar`.
    Instant.ofEpochSecond( yourCountOfWholeSecondsSinceEpoch )  // Moment in UTC.
        .atZone(                                                // Apply `ZoneId` to `Instant` to produce a `ZonedDateTime` object.
            ZoneId.of( "Africa/Tunis" ) 
        )
)                                                              

Evite aulas de data para data do legado

As outras respostas são corretas e curtas. Mas, para sua informação, as aulas problemáticas e antigas de encontro, como java.util.Date, java.util.Calendar, e java.text.SimpleDateFormat são agora legado, suplantado pelo Java.Time Aulas construídas em Java 8 e Java 9.

Então, aqui está como converter e usar as classes modernas para o seu problema.

Java.Time

Converter da aula do Legacy GregorianCalendar para a classe moderna ZonedDateTime. Ligue para novos métodos adicionados às classes antigas.

ZonedDateTime zdt = myGregCal.toZonedDateTime() ;

E indo para a outra direção ...

GregorianCalendar myGregCal = GregorianCalendar.from( zdt ) ;

Se por “Tempo Unix” você quis dizer uma contagem de segundos inteiros desde referência de época do primeiro momento de 1970 na UTC, 1970-01-01T00: 00: 00Z, depois ligue toEpochSecond.

long secondsSinceEpoch = zdt.toEpochSecond() ;

Se você quis dizer uma contagem de milissegundos desde 1970 começou no UTC, extrair um Instant. o Instant 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).

Instant instant = zdt.toInstant() ;

Agora Peça a contagem de milissegundos.

long millisecondsSinceEpoch = instant.toEpochMill() ;

Lembre -se de que pedir segundos inteiros ou milissegundos pode envolver perda de dados. o ZonedDateTime e Instant Ambos resolvem nanossegundos. Então, qualquer microssegundos ou nanossegundos que possam estar presentes serão ignorados ao contar seus segundos inteiros ou milissegundos.


Sobre Java.Time

o Java.Time A estrutura é incorporada ao Java 8 e mais tarde. Essas aulas suplantam o velho problemático legado classes de data de data, como java.util.Date, Calendar, & SimpleDateFormat.

o Joda-Time Projeto, agora em Modo de manutenção, aconselha a migração para o Java.Time Aulas.

Para saber mais, consulte o Oracle Tutorial. E Pesquise o excesso de pilha para muitos exemplos e explicações. Especificação é JSR 310.

Usando um Driver JDBC em conformidade com JDBC 4.2 ou mais tarde, você pode trocar Java.Time objetos diretamente com seu banco de dados. Não há necessidade de strings nem java.sql.* Classes.

Onde obter as aulas de Java.Time?

  • Java SE 8, Java SE 9, e depois
    • Construídas em.
    • Parte da API Java padrão com uma implementação agrupada.
    • O Java 9 adiciona alguns recursos e correções menores.
  • Java SE 6 e Java SE 7
    • Grande parte da funcionalidade Java.Time está em volta para Java 6 e 7 em Threeten-Backport.
  • Android
    • Versões posteriores das implementações do pacote Android das classes Java.Time.
    • Para o Android anterior, o Threetenabp Adaptação do projeto Threeten-Backport (Mencionado acima). Ver Como usar o threetenabp….

o Threeten-Extra O projeto estende Java.Time com classes adicionais. Este projeto é um terreno de prova para possíveis adições futuras ao Java.Time. Você pode encontrar algumas aulas úteis aqui, como Interval, YearWeek, YearQuarter, e mais.

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