Obtenir L'heure GMT en Java
en Java, je veux obtenir l'heure actuelle en GMT.
j'ai essayé diverses options comme celle-ci:
Date date = new Date();
Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT"));
date1 = calendar.getTime();
, Mais la date est toujours interprétée dans mon fuseau horaire local.
Qu'est-ce que je fais de mal et comment puis-je convertir une date java en GMT?
8 réponses
les chances sont bonnes vous avez fait le bon truc à l'arrière pour obtenir la date, mais il n'y a rien qui indique que vous n'avez pas pris L'heure GMT et le formater en fonction de la localisation actuelle de votre machine.
final Date currentTime = new Date();
final SimpleDateFormat sdf =
new SimpleDateFormat("EEE, MMM d, yyyy hh:mm:ss a z");
// Give it to me in GMT time.
sdf.setTimeZone(TimeZone.getTimeZone("GMT"));
System.out.println("GMT time: " + sdf.format(currentTime));
La clé est d'utiliser votre propre DateFormat, pas le système. De cette façon, vous pouvez définir le fuseau horaire de la DateFormat à ce que vous voulez, au lieu qu'il soit défini au fuseau horaire de la Locale.
je me demande pourquoi personne ne fait cela:
Calendar time = Calendar.getInstance();
time.add(Calendar.MILLISECOND, -time.getTimeZone().getOffset(time.getTimeInMillis()));
Date date = time.getTime();
D'après mon expérience, les classes de calendrier et de Date regroupées en Java peuvent produire un effet sous-estimé.
Si cela ne vous dérange pas de passer à Java 8, alors envisagez d'utiliser ZonedDateTime
comme suit:
ZonedDateTime currentDate = ZonedDateTime.now( ZoneOffset.UTC );
tl; dr
Instant.now()
de java.time
Le Réponse en Damilola est correct dans ce qui suggère que vous utilisez java.time framework intégré dans Java 8 et plus tard. Mais cette réponse utilise la classe ZonedDateTime
qui est exagérée si vous voulez juste UTC plutôt que n'importe quel fuseau horaire particulier.
les anciennes classes de date-heure gênantes sont maintenant héritées, supplantées par le java.les classes de temps.
Instant
la classe Instant
représente un moment sur la ligne du temps dans UTC avec une résolution de nanosecondes (jusqu'à neuf (9) chiffres d'une fraction décimale).
code Simple:
Instant instant = Instant.now() ;
instant.toString (): 2016-11-29T23:18:14.604 Z
vous pouvez penser de Instant
comme le bloc de construction auquel vous pouvez ajouter un fuseau horaire ( ZoneID
) pour obtenir un ZonedDateTime
.
ZoneId z = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = instant.atZone( z );
à Propos de java.time
Le de java.time framework est construit dans Java 8 et plus tard. Ces classes remplacent les anciennes classes de date legacy telles que java.util.Date
, Calendar
, & SimpleDateFormat
.
le projet Joda-Time , maintenant en mode maintenance , conseille la migration vers java.temps.
pour en savoir plus, voir le Oracle Tutorial . Et rechercher le débordement de la pile pour de nombreux exemples et explications. La spécification est JSR 310 .
où obtenir le java.temps les classes?
- Java SE 8 et SE 9 et plus tard
- Built-in.
- fait partie de L'API Java standard avec une implémentation groupée.
- Java 9 ajoute des fonctionnalités mineures et des corrections.
- Java SE 6 et SE 7
- une grande partie de la java.la fonctionnalité time est rétroportée à Java 6 & 7 dans ThreeTen-Backport .
- Android
- The ThreeTenABP project adapts ThreeTen-Backport (mentionné ci-dessus) pour Android spécifiquement.
- voir comment utiliser... .
le projet ThreeTen-Extra étend java.temps avec des cours supplémentaires. Ce projet est un terrain d'essai pour de futurs possibles ajouts à java.temps. Vous pouvez trouver ici quelques cours utiles tels que: Interval
, YearWeek
, YearQuarter
, et plus .
pour obtenir l'heure en millis au GMT tout ce que vous avez besoin est
long millis = System.currentTimeMillis();
, Vous pouvez aussi le faire
long millis = new Date().getTime();
et
long millis =
Calendar.getInstance(TimeZone.getTimeZone("GMT")).getTimeInMillis();
mais ce sont des façons inefficaces de faire le même appel.
après avoir essayé beaucoup de méthodes, j'ai découvert, pour obtenir l'heure en millis au GMT vous devez créer deux SimpleDateFormat
objets séparés, un pour le formatage au GMT et un autre pour l'analyse.
voici le code:
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = new Date();
SimpleDateFormat dateParser = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date dateTime= dateParser.parse(format.format(date));
long gmtMilliSeconds = dateTime.getTime();
ça marche très bien. :)
C'est assez simple et direct.
Date date = new Date();
TimeZone.setDefault(TimeZone.getTimeZone("GMT"));
Calendar cal = Calendar.getInstance(TimeZone.getDefault());
date = cal.getTime();
Now date contiendra l'heure GMT actuelle.
Utile Utils méthodes ci-dessous pour gérer le Temps de GMT, heure d'été de l'Épargne:
public static Date convertToGmt(Date date) {
TimeZone tz = TimeZone.getDefault();
Date ret = new Date(date.getTime() - tz.getRawOffset());
// if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY.
if (tz.inDaylightTime(ret)) {
Date dstDate = new Date(ret.getTime() - tz.getDSTSavings());
// check to make sure we have not crossed back into standard time
// this happens when we are on the cusp of DST (7pm the day before the change for PDT)
if (tz.inDaylightTime(dstDate)) {
ret = dstDate;
}
}
return ret;
}
public static Date convertFromGmt(Date date) {
TimeZone tz = TimeZone.getDefault();
Date ret = new Date(date.getTime() + tz.getRawOffset());
// if we are now in DST, back off by the delta. Note that we are checking the GMT date, this is the KEY.
if (tz.inDaylightTime(ret)) {
Date dstDate = new Date(ret.getTime() + tz.getDSTSavings());
// check to make sure we have not crossed back into standard time
// this happens when we are on the cusp of DST (7pm the day before the change for PDT)
if (tz.inDaylightTime(dstDate)) {
ret = dstDate;
}
}
return ret;
}