2010-11-09 6 views
2

Je dois créer un objet java.util.Date avec un fuseau horaire australien. cet objet est requis pour les bibliothèques de balises utilisées dans les composants en aval (donc je suis coincé avec Date).Problème lors de la conversion du calendrier en java.util.Date

Voici ce que j'ai essayé:

TimeZone timeZone = TimeZone.getTimeZone("Australia/Sydney"); 
GregorianCalendar defaultDate = new GregorianCalendar(timeZone); 
Date date = defaultDate.getTime(); 

Cependant, "date" renvoie toujours l'heure (dans mon cas, ET). Qu'est-ce que je fais mal ici? Est-il même possible de définir un objet Date avec un fuseau horaire différent?

Mise à jour:

Merci pour les réponses! Cela fonctionne si je veux afficher la date formatée sous forme de chaîne, mais pas si je veux renvoyer un objet date. Ex:

Date d = new Date(); 
DateFormat df = new SimpleDateFormat(); 
df.setTimeZone(TimeZone.getTimeZone("Australia/Sydney")); 

String formattedDate = df.format(d); // returns Sydney date/time 
Date myDate = df.parse(formattedDate); // returns local time(ET) 

Je pense que je vais finir par retravailler notre taglib de date.

+0

double possible de [Comment gérer TimeZones calendrier en utilisant Java?] (Http://stackoverflow.com/questions/230126/how-to-handle-calendar-timezones-using-java) – duffymo

Répondre

4

Est-il même possible de définir un objet Date avec un fuseau horaire différent?

Non, ce n'est pas possible. Comme son javadoc décrit, tout le java.util.Date contient est juste le temps d'époque qui est toujours la quantité de secondes par rapport au 1 janvier 1970 UTC/GMT. Le Date ne contient aucune autre information. Pour le formater en utilisant un fuseau horaire, utilisez SimpleDateFormat#setTimeZone()

+0

Oui, Date obtient beaucoup de gens en difficulté parce que c'est vraiment juste un horodatage. Chaque fois que vous avez affaire à des dates comme vous ou je pense à eux, vous cherchez vraiment à utiliser un peu de calendrier. – CurtainDog

1

getTime est un Unix temps en secondes, il n'a pas le fuseau horaire, c'est-à-dire qu'il est lié à UTC. Vous devez convertir cette heure dans le fuseau horaire que vous voulez e.b. en utilisant DateFormat.

import java.util.*; 
import java.text.*; 

public class TzPrb { 
    public static void main(String[] args) { 
     Date d = new Date(); 
     System.out.println(d); 

     DateFormat df = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss"); 
     df.setTimeZone(TimeZone.getTimeZone("Australia/Sydney")); 
     System.out.println(df.format(d)); 
     df.setTimeZone(TimeZone.getTimeZone("Europe/London")); 
     System.out.println(df.format(d)); 
    } 
} 
Questions connexes