web-dev-qa-db-fra.com

convertir l'heure d'époque en date

J'ai essayé un million de façons différentes de le faire, mais en vain. Toute aide serait très appréciée.

long millis = getMillisFromServer();
Date date = new Date(millis);
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
String formatted = format.format(date);

Ce qui précède ne fonctionne pas.

en gros, ce que je veux faire, c'est obtenir l'heure Epoch et la convertir en heure australienne. Mon heure locale est +05,30 mais bien sûr je ne veux pas que ce soit un facteur qui contribue à cette conversion.

ÉDITER-

Sortie lorsque j'exécute votre code exact,

Epoch 1318388699000

Mer.12 oct 08:34:59 GMT + 05: 30 2011

12/10/2011 03:04:59

12/10/2011 14:04:59

19
Hades

EDIT: D'accord, vous ne voulez donc pas que votre heure locale (qui n'est pas l'Australie) contribue au résultat, mais plutôt le fuseau horaire australien . Votre code existant devrait alors être parfaitement correct, bien que Sydney est actuellement UTC + 11 , pas UTC + 10 .. Application de test courte mais complète:

import Java.util.*;
import Java.text.*;

public class Test {
    public static void main(String[] args) throws InterruptedException {
        Date date = new Date(1318386508000L);
        DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss");
        format.setTimeZone(TimeZone.getTimeZone("Etc/UTC"));
        String formatted = format.format(date);
        System.out.println(formatted);
        format.setTimeZone(TimeZone.getTimeZone("Australia/Sydney"));
        formatted = format.format(date);
        System.out.println(formatted);
    }
}

Production:

12/10/2011 02:28:28
12/10/2011 13:28:28

Je vous suggère également de commencer à utiliser Joda Time qui est tout simplement une API de date/heure beaucoup plus agréable ...

EDIT: Notez que si votre système ne connaît pas le fuseau horaire Australia/Sydney, Il affichera UTC. Par exemple, si je change le code sur le point d'utiliser TimeZone.getTimeZone("blah/blah"), la valeur UTC s'affichera deux fois. Je vous suggère d'imprimer TimeZone.getTimeZone("Australia/Sydney").getDisplayName() et de voir ce qu'il dit ... et de vérifier votre code pour les fautes de frappe aussi :)

29
Jon Skeet

Veuillez vous assurer que l'heure Epoch est en seconde et que l'objet Date accepte la valeur Long qui est en millisecondes. Par conséquent, vous devez multiplier la valeur Epoch par 1000 pour l'utiliser comme valeur longue. Comme ci-dessous: -

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddhhmmss");
sdf.setTimeZone(TimeZone.getTimeZone(timeZone));
Long dateLong=Long.parseLong(sdf.format(Epoch*1000));
11
Anup Mehta

Voici la réponse moderne (valable à partir de 2014). La réponse acceptée était une très bonne réponse en 2011. Aujourd'hui, je recommande que personne n'utilise les classes Date, DateFormat et SimpleDateFormat. Tout devient plus naturel avec l'API moderne Java date et heure).

Pour obtenir un objet date-heure de vos millis:

    ZonedDateTime dateTime = Instant.ofEpochMilli(millis)
            .atZone(ZoneId.of("Australia/Sydney"));

Si millis est égal à 1318388699000L, cela vous donne 2011-10-12T14:04:59+11:00[Australia/Sydney]. Si le code se retrouve d'une manière étrange sur une machine virtuelle Java qui ne connaît pas le fuseau horaire Australie/Sydney, vous pouvez être sûr d'être averti via une exception.

Si vous voulez la date-heure dans votre format de chaîne pour la présentation:

String formatted = dateTime.format(DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss"));

Résultat:

12/10/2011 14:04:59

PS Je ne sais pas ce que vous entendez par "ce qui précède ne fonctionne pas". Sur mon ordinateur, votre code dans la question imprime également 12/10/2011 14:04:59.

6
Ole V.V.