2013-03-18 5 views
0

J'ai un champ Date en Java en heure IST. Je veux convertir la même chose à EST Time et la sortie devrait être un type de date seulement. Je suis en mesure d'accomplir la même chose en utilisant le morceau ci-dessous du code: -Conversion de temps IST vers EST en Java

SimpleDateFormat dateTimeFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
dateTimeFormat.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); 
Date date = new Date(); 
DateFormat timeFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss"); 
timeFormat.setTimeZone(TimeZone.getTimeZone("America/New_York")); 
String estTime = timeFormat.format(date); 
date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH).parse(estTime); 

Le problème avec le morceau de code ci-dessus est que, bien que la date est convertie en temps HNE, le fuseau horaire est toujours à l'affiche comme IST et pas EST. Le reste de la date est parfaitement converti. Est-il possible de définir explicitement le fuseau horaire à EST dans le champ Date. Toute aide à ce sujet sera très appréciée.

-Subhadeep

+0

'dateTimeFormat' est une variable inutilisée dans votre code. –

Répondre

1

La classe Date est agnostique fuseau horaire. Fondamentalement, il est toujours basé sur GMT, mais quand il est imprimé, il utilise le fuseau horaire actuel du système pour l'ajuster. Cependant, Calendar est spécifique au fuseau horaire. Voir Calendar.setTimeZone().

Tenir compte:

Calendar cal = new GregorianCalendar(); 
    cal.setTimeZone(TimeZone.getTimeZone("America/New_York")); 
    cal.setTime(new Date()); 
0

Si vous ajoutez z pour le modèle de fuseau horaire dans votre modèle SimpleDateFormat?

Donc, il devrait être DateFormat timeFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"). J'ai changé votre code comme ceci:

public static void main(String[] args) throws ParseException { 
    SimpleDateFormat dateTimeFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); 
    dateTimeFormat.setTimeZone(TimeZone.getTimeZone("Asia/Calcutta")); 
    Date date = new Date(); 

    System.out.println(dateTimeFormat.format(date)); // this print IST Timezone 

    DateFormat timeFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z"); 
    timeFormat.setTimeZone(TimeZone.getTimeZone("America/New_York")); 

    String estTime = timeFormat.format(date); 
    date = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss z", Locale.ENGLISH).parse(estTime); 

    System.out.println(timeFormat.format(date)); // this print EDT Timezone currently (on March) 
} 

Dans la dernière déclaration d'impression, le format de date est imprimé avec HAE Fuseau horaire (heure avancée de l'Est). Peut-être à cause de this.

+0

Ne fonctionne pas avec le paramètre Z. Le reste de la date arrive maintenant aussi dans IST :( – user2182350

+0

Même avec des minuscules ('z') C'est parce que les majuscules (' Z') est seulement l'impression de l'heure relative à GMT comme '-0400' –

+0

avec petit z seulement ... Typo dans la première réponse :( – user2182350

0

Le correctif answer by John B explique que java.util.Date semble avoir un fuseau horaire mais ne le fait pas. Sa méthode toString applique le fuseau horaire par défaut de votre machine virtuelle Java lors de la génération de la représentation de chaîne.

C'est l'une des nombreuses raisons pour éviter les classes java.util.Date et .Calendar livrées avec Java. Évite-les. Au lieu de cela, utilisez Joda-Time ou le package java.time intégré à Java 8 (inspiré de Joda-Time, défini par JSR 310).

Voici un exemple de code dans Joda-Time 2.3.

String input = "01/02/2014 12:34:56"; 
DateTimeFormatter formatterInput = DateTimeFormat.forPattern("MM/dd/yyyy HH:mm:ss"); 
DateTimeZone timeZoneIndia = DateTimeZone.forID("Asia/Kolkata"); 
DateTime dateTimeIndia = formatterInput.withZone(timeZoneIndia).parseDateTime(input); 

DateTimeZone timeZoneNewYork = DateTimeZone.forID("America/New_York"); 
DateTime dateTimeNewYork = dateTimeIndia.withZone(timeZoneNewYork); 

DateTime dateTimeUtc = dateTimeIndia.withZone(DateTimeZone.UTC); 

Dump à la console ...

System.out.println("input: " + input); 
System.out.println("dateTimeIndia: " + dateTimeIndia); 
System.out.println("dateTimeNewYork: " + dateTimeNewYork); 
System.out.println("dateTimeUtc: " + dateTimeUtc); 

Exécuté ...

input: 01/02/2014 12:34:56 
dateTimeIndia: 2014-01-02T12:34:56.000+05:30 
dateTimeNewYork: 2014-01-02T02:04:56.000-05:00 
dateTimeUtc: 2014-01-02T07:04:56.000Z