web-dev-qa-db-fra.com

Comment analyser la date de GMT TimeZone à IST TimeZone et vice-versa dans Android

Je travaille sur un projet qui extrait Date/Time du backend dans IST (heure standard indienne), comme indiqué par "2013-01-09T19:32:49.103+05:30". Cependant, quand je l’analyse en utilisant DateFormat suivant 

DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

suivi de l'analyse ..

Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");


System.out.println("XYZ ==============>"+date);

sa date d’affichage au format GMT en sortie, c.-à-d.

Wed Jan 09 14:02:49 GMT+00:00 2013.

Je l'ai essayé en utilisant la classe TimeZone en tant que ..

TimeZone timeZone=TimeZone.getTimeZone("IST");
sdf.setTimeZone(timeZone);

mais sans effet ..

Comment puis-je obtenir un objet de classe Date ayant Date au format IST au lieu de GMT ...

S'il vous plaît fournir une solution appropriée ..

MODIFIER:

Voici à quoi ressemble le code:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

TimeZone timeZone=TimeZone.getTimeZone("IST");
sdf.setTimeZone(timeZone);

Date date = sdf.parse("2013-01-09T19:32:49.103+05:30");
String formattedDate=sdf.format(date);

System.out.println("XYZ ==============>"+formattedDate);
11
Amritpal Singh

La date n'a pas de fuseau horaire. C'est juste un détenteur du nombre de millisecondes depuis le 1er janvier 1970, 00:00:00 GMT. Prenez le même DateFormat que vous avez utilisé pour l'analyse, définissez le fuseau horaire IST et formatez votre date comme dans l'exemple suivant

    DateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");
    Date date = sdf.parse("2013-01-09T19:32:49.103+05:30"); 
    sdf.setTimeZone(TimeZone.getTimeZone("IST"));
    System.out.println(sdf.format(date));

sortie 

2013-01-09T19:32:49.103+05:30

Notez que le modèle XXX est utilisé pour le fuseau horaire ISO 8601 (-08: 00) depuis 1.7. Si vous êtes en 1.6, essayez Z. Voir API SimpleDateFormat pour plus de détails sur les modèles de format.

21
Evgeniy Dorofeev

Comment puis-je obtenir un objet de classe Date ayant Date au format IST au lieu de GMT ...

Tu ne peux pas. Date n'a pas un format ou un fuseau horaire. Cela représente simplement un certain nombre de millisecondes depuis l’époque Unix de minuit le 1er janvier 1970 UTC. Au lieu de cela, Date.toString()toujours utilise le fuseau horaire par défaut.

Pour utiliser un format et un fuseau horaire spécifiques, utilisez DateFormat au lieu de Date.toString(). Vous pouvez définir le fuseau horaire avec DateFormat.setTimeZone() , puis convertir une Date en une String en utilisant DateFormat.format() . DateFormat a lui-même des méthodes d'usine pour la création, ou vous pouvez utiliser SimpleDateFormat si vous voulez spécifier un modèle particulier.

Comme le dit Abu, Joda Timeis une API date/heure bien meilleure que celle intégrée, bien que, pour formater simplement une date/heure, la bibliothèque standard ne fonctionne pas mal. Notez simplement que DateFormat et ses sous-classes sont généralement non thread-safe.

3
Jon Skeet

tl; dr

OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" )  // Parsed.
              .toInstant()                               // Adjusted to UTC.

Voir code live sur IdeOne.com .

ISO 8601

Votre chaîne d'entrée de 2013-01-09T19:32:49.103+05:30 se trouve être au format standard ISO 8601. Le +05:30 à la fin indique un décalage par rapport à UTC de cinq heures et demie à l’avance, utilisé en Inde.

Java.time

Vous utilisez d'anciennes classes de date-heure problématiques, maintenant héritées, supplantées par les classes Java.time.

Il arrive que les classes Java.time utilisent les formats ISO 8601 par défaut lors de l’analyse/génération de chaînes représentant des valeurs date-heure. Donc, pas besoin de spécifier un modèle de formatage du tout.

Comme votre entrée représente un moment sur la timeline avec un décalage par rapport à UTC, nous analysons comme un objet OffsetDateTime .

OffsetDateTime odt = OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" );

odt.toString (): 2013-01-09T19: 32: 49.103 + 05: 30

Pour obtenir un objet simple dans la valeur UTC , extrayez un Instant. Cette classe Instant est une classe élémentaire de base de Java.time. La classe Instant représente un moment sur la ligne temporelle en UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale). 

Vous pouvez penser à OffsetDateTime comme un Instant plus un ZoneOffset

Instant instant = odt.toInstant();  // UTC.

Lors de l'appel de toString, un objet String est généré au format standard ISO 8601. Z à la fin est l'abréviation de Zulu et signifie UTC.

instant.toString (): 2013-01-09T14: 02: 49.103Z

Instant est limité de différentes manières, par exemple lors de la génération de chaînes dans différents formats. Donc, vous voudrez peut-être travailler avec un OffsetDateTime ajusté dans UTC comme décalage; un décalage de zéro, en d'autres termes. La classe ZoneOffset contient une constante pour UTC, ZoneOffset.UTC .

OffsetDateTime odtUtc = odt.withOffsetSameInstant( ZoneOffset.UTC );

Vous pouvez également appliquer un décalage (ou un fuseau horaire) à un Instant. Appelez atOffset ou atZone.

La classe Instant est la classe élémentaire de base de Java.time. La meilleure pratique consiste probablement à utiliser la plupart de vos travaux en UTC. 

OffsetDateTime odt = instant.atOffset( ZoneOffset.ofHoursMinutes( 5 , 30 ) );

Fuseau horaire

Notez qu'un décalage par rapport à UTC correspond à pas un fuseau horaire. Un fuseau horaire est un décalage plus un ensemble de règles, passées et présentes, permettant de traiter des anomalies telles que Heure d'été . Ainsi, un fuseau horaire est toujours préférable à un simple décalage si vous êtes vraiment sûr du bon fuseau horaire.

Spécifiez un nom du fuseau horaire } au format continent/region, tel que America/Montreal , Africa/Casablanca ou Pacific/Auckland. N'utilisez jamais les abréviations de 3-4 lettres telles que EST ou IST, car elles sont pas de vrais fuseaux horaires, ni normalisés, ni même uniques (!). 

Si vous connaissez le fuseau horaire prévu, appliquez un ZoneId pour obtenir un objet ZonedDateTime. Mais n'assumez jamais sans vérifier avec la source de vos données d'entrée. De nombreuses zones différentes peuvent partager un décalage particulier. Par exemple, dans le cas de notre entrée ici, l'offset +05:30 est utilisé aujourd'hui en Inde (Asia/Kolkata) et au Sri Lanka (Asia/Colombo). Ces deux fuseaux horaires peuvent avoir des règles différentes pour des anomalies différentes dans leur passé, présent ou futur.

ZoneId z = ZoneId.of( "Asia/Kolkata" );
ZonedDateTime zdt = odt.atZoneSameInstant( z );

La méthode toString de ZonedDateTime étend le format standard ISO 8601 de manière rationnelle en ajoutant le nom du fuseau horaire entre crochets. Dans ce cas, [Asia/Kolkata].

zdt.toString (): 2013-01-09T19: 32: 49.103 + 05: 30 [Asie/Calcutta]


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes gênantes héritées date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat _.

Le projet Joda-Time , désormais en mode mode de maintenance , conseille la migration vers Java.time.

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .

Où obtenir les classes Java.time? 

  • Java SE 8 et SE 9 et versions ultérieures
    • Intégré. 
    • Une partie de l'API Java standard avec une implémentation fournie.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et SE 7
    • Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport .
  • Android

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez trouver ici quelques classes utiles telles que Interval _, YearWeek , YearQuarter et plus _.

2
Basil Bourque

Vous pouvez le faire simplement en utilisant la classe Calendar. Veuillez vérifier les extraits ci-dessous:

Calendar calendar = Calendar.getInstance();
calendar.setTimeZone(TimeZone.getTimeZone("GMT"));
calendar.setTimeInMillis(<--time stamp-->);
//calendar.setTime(<--date object of gmt date-->); 
SimpleDateFormat sdf = new SimpleDateFormat("MMM dd, yyyy 'at' hh:mm a");
sdf.setTimeZone(TimeZone.getDefault());
String result=sdf.format(calendar.getTime()); 
1
Kalpesh