2010-08-09 5 views
0

salutations tous J'utilise la méthode suivante pour obtenir l'heure actuelle dans le fuseau horaire GMTComment obtenir la date dans un fuseau horaire spécifique?

public static Timestamp getCurrentTimeGMT() { 

     Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT")); 
     long time = c.getTimeInMillis(); 
     long offset = TimeZone.getDefault().getOffset(time); 
     return new Timestamp(time - offset); 

    } 

mais lorsque je tente d'utiliser la même méthode avec des modifications mineures pour obtenir l'heure actuelle en GMT + 3 il donne moi le même résultat de GMT? je ne sais pas pourquoi:

public static Timestamp getCurrentTimeGMT3() { 

    Calendar c = Calendar.getInstance(TimeZone.getTimeZone("GMT+3")); 
    long time = c.getTimeInMillis(); 
    long offset = TimeZone.getDefault().getOffset(time); 
    return new Timestamp(time - offset); 

} 

des idées pourquoi le code ci-dessus ne fonctionne pas correctement, et comment faire une telle méthode?

Répondre

4

Timestamp s'étend Date - il n'a pas ont un fuseau horaire, conceptuellement. Cela représente juste un instant dans le temps.

Si vous souhaitez l'afficher dans un calendrier particulier avec un fuseau horaire particulier, c'est un problème de formatage. Créez le calendrier approprié avec le fuseau horaire correspondant et définissez l'horodatage en conséquence.

(comme d'habitude, je voudrais vous recommander d'utiliser Joda Time au lieu de l'API intégrée si possible. Il est beaucoup plus propre.)

+0

... et a le concept d'un LocalDateTime. –

+0

pouvez-vous me dire comment faire un tel comportement en utilisant joda temps? –

+0

@ sword101: Quel comportement * exactement *? Si vous voulez juste un instant représentant l'heure actuelle (sans fuseau horaire associé), utilisez 'new Instant()'. Si vous voulez l'heure actuelle et un associé avec UTC, utilisez 'new DateTime (DateTimeZone.Utc)'. –

2

Pourquoi vous soustrayez le décalage du temps dans la dernière ligne? Cela revient essentiellement à revenir à GMT. Vous récupérez GMT + 3 puis vous soustrayez 3 heures de cela.

+0

Il soustrait le décalage du fuseau horaire par défaut, pas le fuseau horaire qu'il a utilisé pour créer le calendrier avec. – jarnbjo

2

Ce que Jon a dit. Un horodatage n'a pas de fuseau horaire, il s'agit toujours de l'heure UTC, et il ne faut pas en abuser pour représenter l'heure locale. Si vous avez vraiment besoin d'objets pour représenter l'heure locale, Joda Time has a class for that.

Et vous devriez être conscient que "GMT + 3" n'est pas un vrai fuseau horaire valide. Un fuseau horaire a non seulement un décalage de base, mais aussi un décalage horaire, ce qui peut être différent pour les fuseaux horaires avec le même décalage de base, et peut même changer pour le même fuseau horaire en raison de la législation. Un identifiant de fuseau horaire réel est "Europe/Berlin" ou "Australie/Darwin".

0

c.getTimeInMillis() renvoie le nombre de millisecondes écoulées depuis le 1er janvier 1970 0:00 UTC et renvoie la même valeur, quel que soit le fuseau horaire utilisé dans l'instance de calendrier.

Si vous créez un calendrier avec un fuseau horaire et besoin d'un accès aux champs de temps, vous devez accéder à ces directement:

int h = c.get(Calendar.HOUR_OF_DAY); 
int m = c.get(Calendar.MINUTE); 
int s = c.get(Calendar.SECOND); 
0

Utilisez la méthode statique Timezone.

TimeZone default = TimeZone.getDefault(); 

TimeZone.setDefault(TimeZone.getTimeZone("GMT+3")); 
Calendar cal = Calendar.getInstance(); 
cal.setTime(new Date(System.currentTimeMillis())); 
Date date = cal.getTime(); // converted date time 
System.out.println(date.toString()); 

// Set Back to System Default 
TimeZone.setDefault(default); 
Questions connexes