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);
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 XX
X 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.
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.
OffsetDateTime.parse( "2013-01-09T19:32:49.103+05:30" ) // Parsed.
.toInstant() // Adjusted to UTC.
Voir code live sur IdeOne.com .
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.
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 ) );
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]
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?
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 _.
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());