Tenho milissegundos em determinado arquivo de log gerado no servidor, também sei o código de idioma de onde o arquivo de log foi gerado. Meu problema é converter milissegundos para a data no formato especificado. O processamento desse log está acontecendo no servidor localizado em fuso horário diferente. Enquanto a conversão para o programa "SimpleDateFormat" está ocorrendo a data da máquina, essa data formatada não representa a hora correta do servidor. Existe alguma maneira de lidar com isso com elegância?
long yourmilliseconds = 1322018752992l;
//1322018752992-Nov 22, 2011 9:25:52 PM
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss,SSS",Locale.US);
GregorianCalendar calendar = new GregorianCalendar(TimeZone.getTimeZone("US/Central"));
calendar.setTimeInMillis(yourmilliseconds);
System.out.println("GregorianCalendar -"+sdf.format(calendar.getTime()));
DateTime jodaTime = new DateTime(yourmilliseconds,
DateTimeZone.forTimeZone(TimeZone.getTimeZone("US/Central")));
DateTimeFormatter parser1 = DateTimeFormat.forPattern("yyyy-MM-dd HH:mm:ss,SSS");
System.out.println("jodaTime "+parser1.print(jodaTime));
Resultado:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
GregorianCalendar
,SimpleDateFormat
etc.) quanto a excelente biblioteca Joda-Time agora são substituídas pelas modernas classes java.time .Respostas:
fonte
final Calendar calendar = Calendar.getInstance();
1515436200000l
, eu estou recebendocalendar.get(Calendar.MONTH))
como0
!java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .Você pode usar
java.util.Date
classe e, em seguida, usarSimpleDateFormat
para formatar oDate
.Podemos usar o pacote java.time (tutorial) - APIs DateTime introduzidas no Java SE 8.
// Format the date
fonte
java.util.Date
são depreciados. (Há APIs de data e hora aprimoradas nos JDK8java.time
))java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .tl; dr
Detalhes
As outras respostas usam classes obsoletas ou incorretas.
Evite as classes de data e hora antigas, como java.util.Date/.Calendar. Eles provaram ser mal projetados, confusos e problemáticos.
java.time
A estrutura java.time é incorporada ao Java 8 e posterior. Grande parte da funcionalidade é suportada para Java 6 e 7 e mais adaptada para Android . Feito por algumas das mesmas pessoas que fizeram o Joda-Time .
An
Instant
é um momento na linha do tempo no UTC com uma resolução de nanossegundos . Sua época é o primeiro momento de 1970 no UTC.Assumindo que seus dados de entrada são uma contagem de milissegundos de 01-01-2009T00: 00: 00Z (não está claro na pergunta), podemos instanciar facilmente um
Instant
.A cadeia de caracteres no formato ISO 8601
Z
padrão é abreviada e significa UTCZulu
.Aplique um fuso horário usando um nome de fuso horário adequado para obter um
ZonedDateTime
.Veja este código executado ao vivo em IdeOne.com .
Asia/Kolkata
fuso horário ?Suponho que o seu fuso horário na Índia esteja afetando seu código. Vemos aqui que o ajuste no
Asia/Kolkata
fuso horário gera a mesma hora do dia que você informa,08:55
cinco horas e meia antes do valor UTC03:25
.Zona padrão
Você pode aplicar o fuso horário padrão atual da JVM. Cuidado: o padrão pode mudar a qualquer momento durante o tempo de execução . Qualquer código em qualquer encadeamento de qualquer aplicativo na JVM pode alterar o padrão atual. Se importante, peça ao usuário o fuso horário desejado / esperado.
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como
java.util.Date
,Calendar
, eSimpleDateFormat
.O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Com um driver JDBC em conformidade com o JDBC 4.2 ou posterior, você pode trocar objetos java.time diretamente com seu banco de dados. Não há necessidade de strings ou classes java.sql. *.
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como
Interval
,YearWeek
,YearQuarter
, e mais .fonte
ZoneId.systemDefault()
. Veja a nova seção adicionada ao final da minha resposta.A maneira mais fácil de fazer isso é usar a classe Joda DateTime e especificar o registro de data e hora em milissegundos e o DateTimeZone desejado.
Eu recomendo fortemente evitar as classes Java Date e Calendar internas; Eles são terríveis.
fonte
Se o valor em milissegundos for o número de milissegundos desde 1º de janeiro de 1970 GMT, como é padrão para a JVM, isso será independente do fuso horário. Se você deseja formatá-lo com um fuso horário específico, basta convertê-lo em um objeto GregorianCalendar e definir o fuso horário. Depois disso, existem várias maneiras de formatá-lo.
fonte
Minha solução
fonte
Eu faço assim:
Você também pode usar
getDateInstance(int style)
com os seguintes parâmetros:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
fonte
A classe SimpleDateFormat possui um método chamado SetTimeZone (TimeZone) herdado da classe DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
fonte
Caminho mais fácil:
fonte
Abaixo está minha solução para obter a data de milissegundos para o formato de data. Você precisa usar a Biblioteca Joda para executar esse código.
fonte
Você pode tentar java.time api;
fonte