Au temps joda, comment convertir le fuseau horaire sans changer de temps

J’obtiens l’horodatage UTC de la firebase database que je suis en train de configurer dans une instance JodaTime DateTime

 DateTime dt = new DateTime(timestamp.getTime()); 

Il stocke l’heure parfaitement à 10:00 AM mais avec le fuseau horaire local. Par exemple, je suis dans le fuseau horaire IST qui est +5: 30 de UTC

J’ai essayé beaucoup de choses pour changer le fuseau horaire mais à chaque changement, le temps passe de 10:00 AM à autre chose en utilisant la différence +5: 30.

Existe-t-il un moyen de modifier TimeZone sans affecter l’heure actuelle?

EDIT: Si mon heure actuelle est:

 2013-09-25 11:27:34 AM UTC 

Voici le résultat lorsque j’utilise ce new DateTime(timestamp.getTime());

 2013-09-25 11:27:34 AM Asia/Kolkata 

Et voici le résultat lorsque j’utilise ce new DateTime(timestamp.getTime(), DateTimeZone.UTC) ;

 2013-09-25 05:57:34 AM UTC 

Vous pouvez utiliser la classe LocalDateTime

 LocalDateTime dt = new LocalDateTime(t.getTime()); 

et convertir LocalDateTime en DateTime

 DateTime dt = new LocalDateTime(timestamp.getTime()).toDateTime(DateTimeZone.UTC); 

Joda DateTime traite tout moment en millis comme “millis depuis 1970 dans le fuseau horaire actuel “. Ainsi, lorsque vous créez une instance DateTime , celle-ci est créée avec le fuseau horaire actuel.

Vous pouvez utiliser la méthode withZoneRetainFields() de DateTime pour modifier le fuseau horaire sans modifier les chiffres de la date.

Si votre horodatage est: 2015-01-01T00: 00: 00.000-0500 (ceci est l’heure locale [pour moi])

Essaye ça:

 DateTime localDt = new DateTime(timestamp.getTime()) .withZoneRetainFields(DateTimeZone.UTC) .withZone(DateTimeZone.getDefault()); 

2014-12-31T19: 00: 00.000-05: 00

Breaking Down: Cela vous donne un DateTime correspondant à votre horodatage, en spécifiant qu’il est en UTC:

 new DateTime(timestamp.getTime()) .withZoneRetainFields(DateTimeZone.UTC) 

2015-01-01T00: 00: 00.000Z

Cela vous donne un DateTime mais avec l’heure convertie à votre heure locale:

 new DateTime(timestamp.getTime()) .withZoneRetainFields(DateTimeZone.UTC) .withZone(DateTimeZone.getDefault()); 

2014-12-31T19: 00: 00.000-05: 00

Voici comment je le fais:

 private DateTime convertLocalToUTC(DateTime eventDateTime) { // get your local timezone DateTimeZone localTZ = DateTimeZone.getDefault(); // convert the input local datetime to utc long eventMillsInUTCTimeZone = localTZ.convertLocalToUTC(eventDateTime.getMillis(), false); DateTime evenDateTimeInUTCTimeZone = new DateTime(eventMillsInUTCTimeZone); return evenDateTimeInUTCTimeZone.toDate(); } 

J’ai aussi une autre approche qui m’a été très utile. Je souhaitais que mon thread de workflow devienne temporairement un fuseau horaire spécifique (en conservant l’heure), puis, à la fin de mon code, définissez à nouveau le fuseau horaire d’origine. Il se trouve que lorsque vous utilisez des bibliothèques joda, vous faites:

 TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone)); TimeZone.setDefault(timeZone); 

Ce n’est pas assez. Nous devons également modifier TimeZone dans DateTimeZone comme suit:

 @Before public void setUp() throws Exception { timeZone = TimeZone.getDefault(); dateTimeZone = DateTimeZone.getDefault(); } @After public void tearDown() throws Exception { TimeZone.setDefault(timeZone); DateTimeZone.setDefault(dateTimeZone); } @Test public void myTest() throws Exception { TimeZone.setDefault(TimeZone.getTimeZone(myTempTimeZone)); DateTimeZone.setDefault(DateTimeZone.forID(myTempTimeZone)); //TODO // my code with an specific timezone conserving time } 

J’espère que cela aidera aussi quelqu’un d’autre.

J’ai eu le même problème. Après avoir lu cet ensemble de réponses utiles, et compte tenu de mes besoins particuliers et des objects disponibles, je l’ai résolu en utilisant un autre constructeur DateTime:

 new DateTime("2012-04-23T18:25:46.511Z", DateTimeZone.UTC)