web-dev-qa-db-fra.com

Convertir un format de date à l'époque

J'ai une chaîne avec un format de date tel que 

Jun 13 2003 23:11:52.454 UTC

contenant des millisecondes ... que je veux convertir en Epoch. Existe-t-il un utilitaire Java que je peux utiliser pour effectuer cette conversion?

49
user804979

Ce code montre comment utiliser un Java.text.SimpleDateFormat pour analyser un Java.util.Date depuis une chaîne:

String str = "Jun 13 2003 23:11:52.454 UTC";
SimpleDateFormat df = new SimpleDateFormat("MMM dd yyyy HH:mm:ss.SSS zzz");
Date date = df.parse(str);
long Epoch = date.getTime();
System.out.println(Epoch); // 1055545912454

Date.getTime() renvoie l'heure de l'époque en millisecondes.

84
Bohemian

Vous pouvez également utiliser la nouvelle API Java 8.

import Java.time.ZonedDateTime;
import Java.time.format.DateTimeFormatter;

public class StackoverflowTest{
    public static void main(String args[]){
        String strDate = "Jun 13 2003 23:11:52.454 UTC";
        DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss.SSS zzz");
        ZonedDateTime     zdt  = ZonedDateTime.parse(strDate,dtf);        
        System.out.println(zdt.toInstant().toEpochMilli());  // 1055545912454  
    }
}

La DateTimeFormatter class remplace l'ancien SimpleDateFormat . Vous pouvez ensuite créer une ZonedDateTime à partir de laquelle vous pouvez extraire l’époque souhaitée.

Le principal avantage est que vous êtes maintenant thread-safe.

Merci à Basil Bourque pour ses remarques et ses suggestions. Lisez sa réponse pour plus de détails.

20
Ortomala Lokni

tl; dr

ZonedDateTime.parse( 
                        "Jun 13 2003 23:11:52.454 UTC" , 
                        DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" ) 
                    )
              .toInstant()
              .toEpochMilli()

1055545912454

Java.time

Cette réponse se développe sur le Answer by Lockni .

DateTimeFormatter

Commencez par définir un modèle de mise en forme correspondant à votre chaîne d'entrée en créant un objet DateTimeFormatter .

String input = "Jun 13 2003 23:11:52.454 UTC";
DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu HH:mm:ss.SSS z" );

ZonedDateTime

Analyser la chaîne comme un ZonedDateTime . Vous pouvez considérer cette classe comme suit: (Instant + ZoneId).

ZonedDateTime zdt = ZonedDateTime.parse ( "Jun 13 2003 23:11:52.454 UTC" , f );

zdt.toString (): 2003-06-13T23: 11: 52.454Z [UTC]

Compte de l'époque

Je ne recommande pas le suivi des valeurs de date-heure en tant que compte à partir de - Epoch . Cela rend le débogage délicat car les humains ne peuvent pas discerner une date-heure significative d'un nombre, de sorte que des valeurs non valides/inattendues risquent de glisser. Ces chiffres sont également ambigus, en granularité (secondes entières, millisecondes, micros, nano, etc.) et en périodes (au moins deux douzaines par divers systèmes informatiques). 

Mais si vous insistez, vous pouvez obtenir un décompte en millisecondes de l’époque du premier moment de 1970 en UTC (1970-01-01T00:00:00) par le biais de la classe Instant . Sachez que cela signifie une perte de données car vous tronquez des nanosecondes en millisecondes.

Instant instant = zdt.toInstant ();

instant.toString (): 2003-06-13T23: 11: 52.454Z

long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454

À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure, telles que Java.util.Date , .Calendar , & Java.text.SimpleDateFormat .

Le projet Joda-Time , désormais en mode mode de maintenance , conseille la migration vers Java.time.

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications.

Une grande partie de la fonctionnalité Java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport et ensuite adaptée à Android dans ThreeTenABP (voir Comment utiliser… ).

Le projet ThreeTen-Extra étend Java.time avec des classes supplémentaires. Ce projet est un terrain d’essai pour d’éventuels ajouts à Java.time. Vous pouvez y trouver des classes utiles telles que Interval _, YearWeek , YearQuarter _ et plus _.

4
Basil Bourque

Créer une méthode commune pour convertir une chaîne au format de date

public static void main(String[] args) throws Exception {
    long test = ConvertStringToDate("May 26 10:41:23", "MMM dd hh:mm:ss");
    long test2 = ConvertStringToDate("Tue, Jun 06 2017, 12:30 AM", "EEE, MMM dd yyyy, hh:mm a");
    long test3 = ConvertStringToDate("Jun 13 2003 23:11:52.454 UTC", "MMM dd yyyy HH:mm:ss.SSS zzz");
}

private static long ConvertStringToDate(String dateString, String format) {
    try {
        return new SimpleDateFormat(format).parse(dateString).getTime();
    } catch (ParseException e) {}
    return 0;
}
0
user1960808
  String dateTime="15-3-2019 09:50 AM" //time should be two digit like 08,09,10 
   DateTimeFormatter dtf  = DateTimeFormatter.ofPattern("dd-MM-yyyy hh:mm a");
        LocalDateTime zdt  = LocalDateTime.parse(dateTime,dtf);
        LocalDateTime now = LocalDateTime.now();
        ZoneId zone = ZoneId.of("Asia/Kolkata");
        ZoneOffset zoneOffSet = zone.getRules().getOffset(now);
        long a= zdt.toInstant(zoneOffSet).toEpochMilli();
        Log.d("time","---"+a);

vous pouvez obtenir un identifiant de zone sous cette forme n lien !

0
Flash