68 votes

Convertir un format de date en époque

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

Jun 13 2003 23:11:52.454 UTC

contenant des millisec... que je veux convertir en époque. Existe-t-il un utilitaire en Java que je peux utiliser pour faire cette conversion ?

115voto

Bohemian Points 134107

Ce code montre comment utiliser un java.text.SimpleDateFormat pour analyser une java.util.Date à partir d'une chaîne de caractères :

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 le temps de l'époque en millisecondes.

27voto

Ortomala Lokni Points 5613

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  
    }
}

El DateTimeFormatter remplace l'ancienne classe SimpleDateFormat . Vous pouvez alors créer un ZonedDateTime à partir duquel vous pouvez extraire le temps d'époque souhaité.

Le principal avantage est que vous êtes désormais protégé par des fils.

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

15voto

Basil Bourque Points 8938

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 développe le Réponse de Lockni .

DateTimeFormatter

Définissez tout d'abord un modèle de formatage correspondant à votre chaîne de caractères d'entrée en créant un fichier DateTimeFormatter objet.

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 de caractères comme un ZonedDateTime . Vous pouvez penser à cette classe comme : ( Instant + ZoneId ).

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

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

Table of types of date-time classes in modern java.time versus legacy.

Compte à partir de l'époque

Je ne recommande pas de suivre les valeurs de date-heure comme un compte à rebours. époque . Cela rend le débogage délicat, car les humains ne peuvent pas discerner une date et une heure significatives à partir d'un nombre, et des valeurs invalides ou inattendues peuvent donc passer inaperçues. De plus, ces comptages sont ambigus, tant au niveau de la granularité (secondes entières, milli, micro, nano, etc.) que de l'époque (au moins deux douzaines selon les différents systèmes informatiques).

Mais si vous insistez, vous pouvez obtenir un compte de millisecondes à partir de l'époque du premier moment de 1970 en UTC ( 1970-01-01T00:00:00 ) par l'intermédiaire du Instant classe. Sachez que cela entraîne une perte de données car vous tronquez toutes les nanosecondes en millisecondes.

Instant instant = zdt.toInstant ();

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

long millisSinceEpoch = instant.toEpochMilli() ; 

1055545912454


À propos de java.time

El java.time est intégré à Java 8 et aux versions ultérieures. Ces classes remplacent les anciennes classes héritage les classes de date et d'heure telles que java.util.Date , Calendar , & SimpleDateFormat .

Pour en savoir plus, consultez le Tutoriel Oracle . Et recherchez sur Stack Overflow de nombreux exemples et explications. La spécification est JSR 310 .

El Joda-Time Le projet, actuellement en mode de maintenance conseille la migration vers le java.time classes.

Vous pouvez échanger java.time directement avec votre base de données. Utilisez un Pilote JDBC conforme à JDBC 4.2 ou plus tard. Pas besoin de ficelles, pas besoin de java.sql.* classes. Support de Hibernate 5 et JPA 2.2 java.time .

Où obtenir les classes java.time ?

0voto

user1960808 Points 112

Créer une méthode commune pour convertir une chaîne en format 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;
}

0voto

Flash Points 11
  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 l'identifiant de la zone à partir de ce qui suit un lien !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X