2012-03-17 7 views
16

J'ai vu cette question posée plusieurs fois et aucune des réponses ne semble être ce dont j'ai besoin.Convertir une chaîne de temps à date

J'ai une variable de type longue qui contient un temps d'époque.

Ce que je veux faire est de le convertir en une chaîne

par exemple si le temps d'époque stockée était aujourd'hui la dernière chaîne lirait:

17/03/2012

Comment se je à ça?

Répondre

26

Regardez dans SimpleDateFormat

SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy"); 
sdf.format(new Date(myTimeAsLong)); 
+0

J'ai obtenu cela pour imprimer une chaîne dans le format correct mais il imprime la date incorrecte qu'il donne la date d'aujourd'hui en tant que 16/00/1970. Le Long utilisé était 1332026487. – nexus490

+0

C'est parce que vous pourriez avoir à jouer avec le paramètre que vous passez dans le constructeur. Vous pouvez trouver toutes les possibilités d'affichage dans l'API Jav – Reinard

+4

Cette réponse: imprime la * minute * au lieu de * mois *; ignore le choix de la culture (ce qui est très important); ignore le choix du fuseau horaire (ce qui est incroyablement important). Vous devez vraiment penser à ces choses - ce n'est pas une aide (IMO) de les ignorer. –

20

Vous souhaitez créer un Date de la long - c'est facile:

Date date = new Date(epochTime); 

Notez que epochTime ici doit être en millisecondes depuis l'époque - si vous avez secondes depuis l'époque, se multiplient par 1000.

Ensuite, vous devez créer un SimpleDateFormat en indiquant le modèle, la culture et le fuseau horaire appropriés. Par exemple:

SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy", Locale.US); 
format.setTimeZone(...); 

Utilisez ensuite que pour formater la date à une chaîne:

String text = format.format(date); 
+0

Que devrais-je mettre pour l'argument Timezone? – nexus490

+0

@ nexus490: Dans quel fuseau horaire souhaitez-vous représenter la valeur? Par exemple, dans une heure ce sera le 18/03/2012 dans * mon * fuseau horaire, mais aux Etats-Unis ce sera toujours le 17/03/2012, pour le même nombre de millisecondes depuis l'époque. Quelle serait la bonne réponse? C'est quelque chose que * vous * savez, car vous connaissez vos exigences d'application (espérons-le). Peut-être que vous voulez UTC. Peut-être que vous voulez le fuseau horaire local du système. Peut-être que vous voulez le fuseau horaire de l'utilisateur. –

+0

Merci d'avoir souligné ceci: "si vous avez ** secondes ** depuis l'époque, multipliez par ** 1000 **." – Metallica

0

Vous devez être conscient que le temps d'époque en Java est en millisecondes, tandis que ce que vous convertissez peut être en secondes. Assurez-vous que les deux côtés des conversions sont en millisecondes, puis vous pouvez récupérer les paramètres de date à partir de l'objet Date.

+0

Et pourquoi convertir des millisecondes en millisecondes? –

+0

mon erreur, je veux dire que vous devez vous assurer que les deux côtés de la conversion sont en millisecondes. – Ajibola

2

Joda-Time

Si le temps d'époque que vous vouliez dire un nombre de millisecondes depuis le premier moment de 1970 à UTC, puis est ici quelques exemples de code en utilisant la bibliothèque Joda-Time ...

DateTimeZone timeZone = DateTimeZone.forID("Europe/Paris"); 
DateTime dateTime = new DateTime(yourMilliseconds, timeZone); 
String output = DateTimeFormat.forStyle("S-").withLocale(Locale.CANADA_FRENCH).print(dateTime); 

Autre Epochs

Cette définition d'époque est courante en raison de son utilisation au sein d'Unix. Mais sachez qu'au moins un couple dozen epoch definitions est utilisé par divers systèmes informatiques.

11
Date date = new Date(String); 

est obsolète.

solution

Date date = new Date(1406178443 * 1000L); 
    DateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS"); 
    format.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
    String formatted = format.format(date); 

assurez-vous de multiplier par 1000L

+3

Juste un commentaire mineur, vous devez changer le HH: MM: ss.SSS à HH: mm: ss.SSS - MM est le mois, et pas minutes. – Leo

+0

merci Damith: D –

0

Try this ...

échantillon timestamp est 1414492391238

Méthode:

public static String GetHumanReadableDate(long epochSec, String dateFormatStr) { 
    Date date = new Date(epochSec * 1000); 
    SimpleDateFormat format = new SimpleDateFormat(dateFormatStr, 
      Locale.getDefault()); 
    return format.format(date); 
} 

Ergonomie:

long timestamp = Long.parseLong(engTime)/1000; 
String engTime_ = GetHumanReadableDate(timestamp, "dd-MM-yyyy HH:mm:ss aa"); 

Résultat:

28-10-2014 16:03:11 pm

Bonne codage

+1

3 problèmes avec cette réponse. Cette réponse ignore la question cruciale du fuseau horaire. Cette réponse utilise un format différent de celui demandé dans la question. Et cette réponse fait essentiellement double emploi avec trois autres réponses publiées il y a des mois. Je ne vois aucune valeur ajoutée ici. –

0

basées sur les réponses précédentes, en passant par défaut du système Locale et TimeZone ...

String epochToIso8601(long time) { 
    String format = "yyyy-MM-dd HH:mm:ss"; 
    SimpleDateFormat sdf = new SimpleDateFormat(format, Locale.getDefault()); 
    sdf.setTimeZone(TimeZone.getDefault()); 
    return sdf.format(new Date(time * 1000)); 
} 
0

essayer cette

Date date = new Date(1476126532838L); 
DateFormat format = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 
format.setTimeZone(TimeZone.getTimeZone("Etc/UTC")); 
String formatted = format.format(date); 
format.setTimeZone(TimeZone.getTimeZone("Asia/Colombo"));//your zone 
formatted = format.format(date); 
System.out.println(formatted); 
Questions connexes