Votre problème peut être que vous regardez les choses mal. Un Date
n'a pas de fuseau horaire. Il représente un moment discret dans le temps et est "intended to reflect coordinated universal time". Les calendriers et les formateurs de date sont ce qui obtient des informations de fuseau horaire. Votre deuxième exemple avec les instances Calendar et TimeZone semble fonctionner correctement. En ce moment, ce code:
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("Japan"));
System.out.println(String.valueOf(calendar.get(Calendar.HOUR)) + ":" + calendar.get(Calendar.MINUTE));
}
Rapports:
0:32
qui semble correct pour moi. Que trouvez-vous mal avec cela?
Mise à jour: Oh, peut-être que vous attendez 12:32
à partir du code ci-dessus? Vous voudrez utiliser Calendar.HOUR_OF_DAY au lieu de Calendar.HOUR pour cela, ou faites quelques maths d'heure. Calendar.HOUR utilise 0 pour représenter midi et minuit.
Mise à jour 2: Voici ma dernière tentative pour essayer de faire passer cela. Essayez ce code:
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
SimpleDateFormat format = new SimpleDateFormat("H:mm a Z");
List<TimeZone> zones = Arrays.asList(
TimeZone.getTimeZone("CST"),
TimeZone.getTimeZone("UTC"),
TimeZone.getTimeZone("Asia/Shanghai"),
TimeZone.getTimeZone("Japan"));
for (TimeZone zone : zones) {
calendar.setTimeZone(zone);
format.setTimeZone(zone);
System.out.println(
calendar.get(Calendar.HOUR_OF_DAY) + ":"
+ calendar.get(Calendar.MINUTE) + " "
+ (calendar.get(Calendar.AM_PM) == 0 ? "AM " : "PM ")
+ (calendar.get(Calendar.ZONE_OFFSET)/1000/60/60));
System.out.println(format.format(calendar.getTime()));
}
}
Notez qu'il crée un seul objet Calendrier, représentant "maintenant". Ensuite, il imprime le temps représenté par ce calendrier dans quatre fuseaux horaires différents, en utilisant à la fois la méthode Calendar.get() et un SimpleDateFormat pour montrer que vous obtenez le même résultat dans les deux sens. La sortie de ce droit est maintenant:
22:59 PM -6
22:59 PM -0600
4:59 AM 0
4:59 AM +0000
12:59 PM 8
12:59 PM +0800
13:59 PM 9
13:59 PM +0900
Si vous avez utilisé Calendar.HOUR au lieu de Calendar.HOUR_OF_DAY, vous verriez ceci:
10:59 PM -6
22:59 PM -0600
4:59 AM 0
4:59 AM +0000
0:59 PM 8
12:59 PM +0800
1:59 PM 9
13:59 PM +0900
Il montre correctement les temps actuels en Europe centrale Heure normale (mon fuseau horaire), heure UTC, heure de Shanghai et heure du Japon, respectivement, avec leurs décalages de fuseau horaire. Vous pouvez voir qu'ils s'alignent tous et ont les décalages corrects.
Que utilisez-vous? 'java.sql.Date' ou' java.util.Date'? Comme je l'ai vérifié pour l'objet Utils et son fonctionnement bien. – dShringi
Même dans le cas de 'java.sql.Date', cela ne fait aucune différence. Fonctionne bien pour moi! Pouvez-vous publier le code que vous utilisez pour 'someExistingDateObj'. – dShringi
@dShringi merci pour votre réponse Shringi. SVP voir ma discussion avec Ryan –