studio obtener ingresar hora formato actual java jodatime

java - ingresar - obtener hora android studio



JodaTime-cómo obtener la hora actual en UTC (7)

Desde aquí: http://www.joda.org/joda-time/userguide.html#Changing_TimeZone

// get current moment in default time zone DateTime dt = new DateTime(); // translate to London local time DateTime dtLondon = dt.withZone(DateTimeZone.forID("Europe/London"));

El valor resultante dtLondon tiene el mismo tiempo absoluto de milisegundos, pero un conjunto diferente de valores de campo.

Puede sustituir ''Europa / Londres'' por la zona horaria que desee (UTC). Ver esta lista de nombres de zona horaria adecuada .

Quiero obtener la hora actual en UTC. Lo que hago hasta ahora es lo siguiente (solo para propósitos de prueba):

DateTime dt = new DateTime(); DateTimeZone tz = DateTimeZone.getDefault(); LocalDateTime nowLocal = new LocalDateTime(); DateTime nowUTC = nowLocal.toDateTime(DateTimeZone.UTC); Date d1 = nowLocal.toDate(); Date d2 = nowUTC.toDate(); L.d("tz: " + tz.toString()); L.d("local: " + d1.toString()); L.d("utc: " + d2.toString());

  • d1 es mi hora local, esta bien
  • d2 es mi hora local + 1, pero debería ser la hora local - 1 ...

Mi zona horaria local es UTC + 1 (según la salida de depuración y la lista aquí: http://joda-time.sourceforge.net/timezones.html ) ...

¿Cómo convierto correctamente de una zona horaria a otra (incluyendo la representación de milisegundos)?

EDITAR

Necesito la fecha / milisegundos ... NO se trata de mostrar la hora correctamente ...

Editar 2

Ahora, con la ayuda de un comentario y una respuesta, intenté seguir:

DateTimeZone tz = DateTimeZone.getDefault(); DateTime nowLocal = new DateTime(); LocalDateTime nowUTC = nowLocal.withZone(DateTimeZone.UTC).toLocalDateTime(); DateTime nowUTC2 = nowLocal.withZone(DateTimeZone.UTC); Date dLocal = nowLocal.toDate(); Date dUTC = nowUTC.toDate(); Date dUTC2 = nowUTC2.toDate(); L.d(Temp.class, "------------------------"); L.d(Temp.class, "tz : " + tz.toString()); L.d(Temp.class, "local : " + nowLocal + " | " + dLocal.toString()); L.d(Temp.class, "utc : " + nowUTC + " | " + dUTC.toString()); // <= WORKING SOLUTION L.d(Temp.class, "utc2 : " + nowUTC2 + " | " + dUTC2.toString());

SALIDA

tz : Europe/Belgrade local : 2015-01-02T15:31:38.241+01:00 | Fri Jan 02 15:31:38 MEZ 2015 utc : 2015-01-02T14:31:38.241 | Fri Jan 02 14:31:38 MEZ 2015 utc2 : 2015-01-02T14:31:38.241Z | Fri Jan 02 15:31:38 MEZ 2015

Lo que quería era que la fecha local muestre las 15 en punto y la fecha de utc muestre las 14 en punto ... Por ahora, esto parece funcionar ...

----- EDIT3 - Solución final -----

Con suerte, esta es una buena solución ... Creo que respeta todos los consejos que recibí ...

DateTimeZone tz = DateTimeZone.getDefault(); DateTime nowUTC = new DateTime(DateTimeZone.UTC); DateTime nowLocal = nowUTC.withZone(tz); // This will generate DIFFERENT Dates!!! As I want it! Date dLocal = nowLocal.toLocalDateTime().toDate(); Date dUTC = nowUTC.toLocalDateTime().toDate(); L.d("tz : " + tz.toString()); L.d("local : " + nowLocal + " | " + dLocal.toString()); L.d("utc : " + nowUTC + " | " + dUTC.toString());

Salida:

tz : Europe/Belgrade local : 2015-01-03T21:15:35.170+01:00 | Sat Jan 03 21:15:35 MEZ 2015 utc : 2015-01-03T20:15:35.170Z | Sat Jan 03 20:15:35 MEZ 2015


He arreglado esto con este convertidor

public class DateTimeConverter implements AttributeConverter<DateTime, Date> { @Override public Date convertToDatabaseColumn(DateTime attribute) { return attribute == null ? null : new Date(attribute .withZone(DateTimeZone.UTC) .withZoneRetainFields(DateTimeZone.getDefault()) .getMillis()); } @Override public DateTime convertToEntityAttribute(Date dbData) { return dbData == null ? null : new DateTime(dbData.getTime()) .withZoneRetainFields(DateTimeZone.UTC) .withZone(DateTimeZone.getDefault()); } }

Las fechas se almacenan como UTC y se recuperan con su zona horaria actual


Lo estás haciendo mucho más complicado de lo que necesitas para:

DateTime dt = new DateTime(DateTimeZone.UTC);

No se requiere conversión en absoluto. Si encuentra que realmente necesita convertir, puede usar withZone . Sin embargo, le sugiero que evite ir a través de LocalDateTime , ya que de esa manera puede perder información debido a las transiciones de la zona horaria (dos instantes diferentes pueden tener la misma hora local en la misma zona horaria, porque los relojes retroceden y repiten la hora local).

Habiendo dicho todo esto, por motivos de comprobabilidad, personalmente me gusta usar una interfaz de Clock que me permite obtener la hora actual (por ejemplo, como un Instant ). Luego puede usar la inyección de dependencia para inyectar un reloj del sistema real cuando se ejecuta en producción, y un reloj falso con un tiempo predeterminado para las pruebas. El paquete java.time Java 8 tiene esta idea incorporada, por cierto.


Por favor, trate de escuchar a Jon Skeets buenos consejos y comentarios. Aquí una explicación adicional. Su edit-2 contiene un error:

DateTimeZone tz = DateTimeZone.getDefault(); DateTime nowLocal = new DateTime(); LocalDateTime nowUTC = nowLocal.withZone(DateTimeZone.UTC).toLocalDateTime(); DateTime nowUTC2 = nowLocal.withZone(DateTimeZone.UTC); Date dLocal = nowLocal.toDate(); Date dUTC = nowUTC.toDate(); Date dUTC2 = nowUTC2.toDate();

Si llama toDate() en un objeto nowUTC de tipo LocalDateTime entonces puede obtener sorpresas - vea javadoc . Joda-Time afirma que usa the same fields en java.util.Date como en nowUTC . ¿Qué significa esto? Analicemos

nowUTC.toString() produce 2015-01-02T14:31:38.241 Eso es sin zona horaria (note la Z que falta al final), por lo que es solo una marca de tiempo local. Por contexto, sabemos que fue generado en UTC. Sin embargo, en su próximo paso, lo convierte a java.util.Date utilizando el método mencionado anteriormente. Este método combina la marca de tiempo local con la zona horaria del sistema (Belgrado) PRESERVANDO LOS CAMPOS, por lo tanto CAMBIANDO el instante. Así que finalmente has corregido mal tu instante. Y tu segunda línea es incorrecta.

Si solo quieres

la fecha utc muestra las 14 horas

entonces no utilice el método de conversión cuestionable y engañoso que ofrece Joda-Time. Utilice en su lugar un formateador dedicado con el patrón "EEE MMM dd HH: mm: ss zzz yyyy" o similar (Joda-Time ofrece DateTimeFormatter ). Establezca el offset UTC en este formateador e imprima. Hecho. Abandonar completamente cualquier llamada de java.util.Date.toString() . De esta manera, ni siquiera necesitas hacer ninguna conversión peligrosa.


También puede usar el método estático now que lo hace aún más legible

DateTime.now(DateTimeZone.UTC)


Utilizar esta

DateTime.now().withZone(DateTimeZone.UTC)

y si quieres formatear, puedes usar

DateTime.now().withZone(DateTimeZone.UTC).toString("yyyyMMddHHmmss")


SimpleDateFormat sdf = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" ); // or SimpleDateFormat sdf = new SimpleDateFormat( "MM/dd/yyyy KK:mm:ss a Z" ); sdf.setTimeZone( TimeZone.getTimeZone( "UTC" ) ); System.out.println( sdf.format( new Date() ) );

En lugar de System.out.println (sdf.format (new Date ()) ponga su fecha local