Tengo milisegundos en cierto archivo de registro generado en el servidor, también conozco la configuración regional desde donde se generó el archivo de registro, mi problema es convertir milisegundos a la fecha en el formato especificado. El procesamiento de ese registro está ocurriendo en el servidor ubicado en una zona horaria diferente. Mientras que la conversión al programa "SimpleDateFormat" toma la fecha de la máquina ya que la fecha formateada no representa la hora correcta del servidor. ¿Hay alguna manera de manejar esto con elegancia?
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));
Salida:
Gregorian Calendar -2011-11-23 08:55:52,992
jodaTime 2011-11-22 21:25:52,992
GregorianCalendar
,SimpleDateFormat
, etc.) y la excelente biblioteca Joda-Time están sustituidas por las modernas java.time clases.Respuestas:
fuente
final Calendar calendar = Calendar.getInstance();
1515436200000l
, me estoy poniendocalendar.get(Calendar.MONTH))
como0
!java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .Puede usar
java.util.Date
class y luego usarSimpleDateFormat
para formatear elDate
.Podemos usar el paquete java.time (tutorial): API DateTime introducidas en Java SE 8
// Format the date
fuente
java.util.Date
se deprecian. (Se han mejorado las API de fecha y hora en los JDK8java.time
)java.util.Date
,java.util.Calendar
yjava.text.SimpleDateFormat
ahora son heredadas , suplantadas por las clases java.time integradas en Java 8 y posteriores. Ver Tutorial de Oracle .tl; dr
Detalles
Las otras respuestas usan clases pasadas de moda o incorrectas.
Evite las antiguas clases de fecha y hora, como java.util.Date/.Calendar. Han demostrado ser pobremente diseñados, confusos y problemáticos.
java.time
El framework java.time viene integrado en Java 8 y versiones posteriores. Gran parte de la funcionalidad es compatible con Java 6 y 7 y se adapta aún más a Android . Hecho por algunas de las mismas personas que habían hecho Joda-Time .
Un
Instant
es un momento en la línea de tiempo en UTC con una resolución de nanosegundos . Su época es el primer momento de 1970 en UTC.Suponiendo que sus datos de entrada son un recuento de milisegundos desde 1970-01-01T00: 00: 00Z (no está claro en la pregunta), entonces podemos instanciar fácilmente un
Instant
.El
Z
en esa norma ISO 8601 cadena con formato es la abreviatura deZulu
y significa UTC .Aplique una zona horaria utilizando un nombre de zona horaria adecuado para obtener a
ZonedDateTime
.Vea este código en vivo en IdeOne.com .
Asia/Kolkata
zona horaria ?Supongo que su zona horaria de India afecta su código. Vemos aquí que ajustarse a la
Asia/Kolkata
zona horaria representa la misma hora del día que informa,08:55
que es cinco horas y media antes de nuestro valor UTC03:25
.Zona predeterminada
Puede aplicar la zona horaria predeterminada actual de la JVM. Tenga en cuenta que el valor predeterminado puede cambiar en cualquier momento durante el tiempo de ejecución . Cualquier código en cualquier subproceso de cualquier aplicación dentro de la JVM puede cambiar el valor predeterminado actual. Si es importante, solicite al usuario su zona horaria deseada / esperada.
Sobre java.time
El marco java.time está integrado en Java 8 y versiones posteriores. Estas clases suplantar la vieja problemáticos heredados clases de fecha y hora como
java.util.Date
,Calendar
, ySimpleDateFormat
.El proyecto Joda-Time , ahora en modo de mantenimiento , aconseja la migración a las clases java.time .
Para obtener más información, consulte el Tutorial de Oracle . Y busque Stack Overflow para obtener muchos ejemplos y explicaciones. La especificación es JSR 310 .
Con un controlador JDBC que cumpla con JDBC 4.2 o posterior, puede intercambiar objetos java.time directamente con su base de datos. No necesita cadenas ni clases java.sql. *.
¿Dónde obtener las clases java.time?
El proyecto ThreeTen-Extra extiende java.time con clases adicionales. Este proyecto es un campo de pruebas para posibles adiciones futuras a java.time. Usted puede encontrar algunas clases útiles aquí, como
Interval
,YearWeek
,YearQuarter
, y más .fuente
ZoneId.systemDefault()
. Vea la nueva sección agregada al final de mi respuesta.La forma más fácil de hacer esto es usar la clase Joda DateTime y especificar tanto la marca de tiempo en milisegundos como la DateTimeZone que desee.
Recomiendo evitar las clases Java Date y Calendar incorporadas; son terribles.
fuente
Si el valor de milis es el número de milis desde el 1 de enero de 1970 GMT, como es estándar para la JVM, entonces eso es independiente de la zona horaria. Si desea formatearlo con una zona horaria específica, simplemente puede convertirlo en un objeto GregorianCalendar y establecer la zona horaria. Después de eso hay numerosas formas de formatearlo.
fuente
Mi solución
fuente
Lo hago así:
También se puede usar
getDateInstance(int style)
con los siguientes parámetros:DateFormat.SHORT
DateFormat.MEDIUM
DateFormat.LONG
DateFormat.FULL
DateFormat.DEFAULT
fuente
La clase SimpleDateFormat tiene un método llamado SetTimeZone (TimeZone) que se hereda de la clase DateFormat. http://docs.oracle.com/javase/6/docs/api/java/text/DateFormat.html
fuente
La manera más fácil:
fuente
A continuación se muestra mi solución para obtener la fecha de milisegundos a formato de fecha. Tienes que usar Joda Library para ejecutar este código.
fuente
Puedes probar java.time api;
fuente