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