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?

23
demandé sur Eric Leschinski 2011-03-08 20:28:21

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.

30
répondu Edwin Buck 2011-03-08 17:34:59

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();
16
répondu Harun 2016-03-08 05:39:51

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 );
5
répondu Damilola 2014-08-18 12:41:33

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?

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 .

4
répondu Basil Bourque 2017-05-23 12:03:05

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.

3
répondu Peter Lawrey 2013-03-19 13:16:38

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. :)

2
répondu Firdous Ahmad 2016-01-11 09:42:33

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.

0
répondu HeisenBerg 2016-11-08 14:36:09

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;
}
0
répondu Kalpesh 2016-11-29 13:20:03