2016-12-21 1 views
6

J'ai une valeur de date et d'heure 2016-12-21T07: 48: 36 avec un décalage de UTC + 14. Comment convertir le datetime en heure GMT standard équivalente.Comment convertir une valeur de date avec décalage UTC en GMT en java 7

J'ai essayé avec la méthode sampleDateFormat.parse().Mais, je ne suis pas en mesure d'obtenir l'objet TimeZone pour le décalage UTC comme.

sampleDateFormat.setTimeZone(TimeZone.getTimeZone("UTC+14:00")) 

S'il vous plaît aidez-moi à convertir le datetime UTC dans le temps de GMT en Java 7.

+0

Vous savez que votre problème est seulement que vous avez utilisé le "UTC + 14" non pris en charge. getTimeZone ne connaît que le formulaire "GMT + xx" – Sxilderik

+0

D'où avez-vous obtenu le décalage ** + 14 **? –

Répondre

2

Je suppose que vous avez la date d'origine comme une chaîne. Effectuez les opérations suivantes:

  • Créer une SimpleDateFormat et définir le fuseau horaire "GMT + 14"
  • Parse la valeur de chaîne. Vous obtenez un objet Date
  • Définissez le fuseau horaire de l'SimpleDateFormat à « UTC » (ou utilisez une instance SimpleDateFormat différente)
  • Format la date (si vous voulez que le résultat comme une chaîne aussi bien)

exemple:

import java.text.DateFormat; 
import java.text.SimpleDateFormat; 
import java.util.Date; 
import java.util.TimeZone; 

public class ConvertToUTC { 
    public static void main(String[] args) throws Exception { 

     String dateval = "2016-12-21T07:48:36"; 
     DateFormat df = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); 
     df.setTimeZone(TimeZone.getTimeZone("GMT+14")); 
     Date date = df.parse(dateval); 

     System.out.println(df.format(date)); // GMT+14 

     df.setTimeZone(TimeZone.getTimeZone("UTC")); 
     System.out.println(df.format(date)); // UTC 
    } 
} 
+0

Est-ce que le composant d'économie de lumière du jour sera pris en compte si nous utilisons le décalage GMT + au lieu du décalage UTC +? – GOPI

+0

@GOPI La réponse est correcte. Votre question ne mentionne que les décalages fixes (et il est égal si le préfixe est GMT ou UTC). Ainsi, l'économie de l'heure n'est pas pertinente dans le contexte de votre question.Sinon, n'utilisez pas de décalages fixes mais des identifiants de fuseau horaire comme "Asia/Tokyo" etc. –

+0

Merci Meno & Grodriguez! – GOPI

2

utilisation "GMT + 14: 00" au lieu de "UTC + 14: 00"

SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd'T'hh:mm:ss"); 
f.setTimeZone(TimeZone.getTimeZone("GMT+14:00")); 
final Date d = f.parse("2016-12-21T07:48:36"); 
f.setTimeZone(TimeZone.getTimeZone("UTC")); 
System.out.println(f.format(d)); // -> 2016-12-20T05:48:36 
2

tl; dr

LocalDateTime.parse("2016-12-21T07:48:36")  // Parse as a `LocalDateTime` given the lack of an offset or zone. *Not* an actual moment, only a rough approximation of potential moments along a range of about 26-27 hours. 
      .atOffset(ZoneOffset.ofHours(14)) // Assign an offset-from-UTC as context, giving meaning to determine an actual point on the timeline. 
      .toInstant()       // Renders `Instant` object in UTC. 

java.time

La façon moderne est avec les classes Java java.time intégrées dans 8 et versions ultérieures. Une grande partie des fonctionnalités est reportée sur Java 6 & 7 dans le projet ThreeTen-Backport.

ZoneOffset offset = ZoneOffset.ofHours(14); // fourteen hours ahead of UTC. 

Parse la chaîne comme LocalDateTime car il manque toute information au sujet de décalage ou d'une zone. Votre entrée est au format standard ISO 8601, il n'est donc pas nécessaire de spécifier un formatage.

LocalDateTime ldt = LocalDateTime.parse("2016-12-21T07:48:36"); 

appliquer le décalage à la date-heure locale pour obtenir un OffsetDateTime un objet.

OffsetDateTime odt = ldt.atOffset(offset); 

De là, un extrait Instant qui est toujours en UTC.

Instant instant = odt.toInstant(); 

instant.toString(): 2016-12-20T17: 48: 36Z

En UTC, la valeur est une autre date, le 20 au lieu du 21.

Voir live code at IdeOne.com.


A propos java.time

Le cadre java.time est construit en Java 8 et versions ultérieures. Ces classes supplantent les vieilles classes legacy de date-heure gênantes telles que java.util.Date, Calendar, & SimpleDateFormat. Le projet Joda-Time, maintenant en maintenance mode, conseille la migration vers les classes java.time. Pour plus d'informations, voir le Oracle Tutorial. Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310.

L'utilisation d'un JDBC driver conforme à JDBC 4.2 ou tard, vous pouvez échanger java.time objets directement avec votre base de données. Pas besoin de chaînes ni de classes java.sql. *.

Où obtenir les classes java.time?

  • Java SE 8, Java SE 9, et plus tard
    • intégré.
    • Partie de l'API Java standard avec une implémentation groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 et Java SE 7
    • Une grande partie de la fonctionnalité de java.time est de retour à Java 6 Ported .
  • Android
    • Les versions ultérieures de mises en œuvre bundle Android des classes java.time.
    • Pour Android plus tôt, le projet ThreeTenABP adapte ThreeTen-Backport (mentionné ci-dessus). Voir How to use ThreeTenABP….

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

+0

Techniquement, un Instant n'est pas dans n'importe quel fuseau horaire. Cela représente un décalage par rapport à l'époque. – OrangeDog

+2

@OrangeDog Incorrect. Un 'Instant 'est très certainement en UTC. Pour citer le document de classe: "Les époques-secondes sont mesurées à partir de l'époque Java standard de 1970-01-01T00: 00: 00Z". Ce 'Z' est court pour Zulu et signifie UTC. Sans être défini comme UTC un 'Instant 'n'aurait aucun sens. –

+0

Juste parce que la représentation de l'époque dans les docs est en Z, ne signifie pas qu'un 'Instant 'est. Pour citer le doc de classe: "cette API Java définit sa propre échelle de temps, l'échelle de temps Java". – OrangeDog