web-dev-qa-db-fra.com

Heure de Java depuis l'époque

En Java, comment puis-je imprimer le temps écoulé depuis l’époque en secondes et en nanosecondes au format suivant:

Java.text.SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");

Mon entrée est:

long mnSeconds;
long mnNanoseconds;

Où le total des deux est le temps écoulé depuis Epoch 1970-01-01 00:00:00.0.

13
user1585643

Tu peux le faire

public static String format(long mnSeconds, long mnNanoseconds) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.");
    return sdf.format(new Date(mnSeconds*1000))
           + String.format("%09d", mnNanoseconds);
}

par exemple.

2012-08-08 19:52:21.123456789

si vous n'avez pas vraiment besoin de plus que des millisecondes, vous pouvez le faire

public static String format(long mnSeconds, long mnNanoseconds) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS");
    return sdf.format(new Date(mnSeconds*1000 + mnNanoseconds/1000000));
}
9
Peter Lawrey

Utilisez ceci et divisez par 1000

long Epoch = System.currentTimeMillis();

System.out.println("Epoch : " + (Epoch / 1000));
18

tl; dr

    Instant                        // Represent a moment in UTC.
    .ofEpochSeconds( mnSeconds )   // Determine a moment from a count of whole seconds since the Unix Epoch of the first moment of 1970 in UTC (1970-01-01T00:00Z). 
    .plusNanos( mnNanoseconds )    // Add on a fractional second as a count of nanoseconds. Returns another `Instant` object, per Immutable Objects pattern.
    .toString()                    // Generate text representing this `Instant` object in standard ISO 8601 format.
    .replace( "T" , " " )          // Replace the `T` in the middle with a SPACE. 
    .replace "Z" , "" )            // Remove the `Z` on the end (indicating UTC).

Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciennes classes de date-heure problématiques telles que Java.util.Date, .Calendar, Java.text.SimpleDateFormat, Java.sql.Date et plus. L'équipe Joda-Time conseille également la migration vers Java.time.

Instant

La classe Instant représente un moment sur la ligne de temps au format UTC avec une résolution pouvant atteindre les nanosecondes.

long mnSeconds = … ;
long mnNanoseconds = … ;

Instant instant = Instant.ofEpochSeconds( mnSeconds ).plusNanos( mnNanoseconds );

Pour obtenir une chaîne représentant cette valeur date-heure, appelez Instant::toString.

String output = instant.toString();

Vous obtiendrez une valeur telle que 2011-12-03T10:15:30.987654321Z, format standard ISO 8601 . Remplacez la T par un ESPACE si vous le souhaitez. Pour les autres formats, recherchez Stack Overflow pour en savoir plus sur DateTimeFormatter


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et aux versions ultérieures. Ces classes supplantent les anciennes classes problématiques héritées _ date-heure telles que Java.util.Date , Calendar _, & SimpleDateFormat .

Le projet Joda-Time , désormais en mode { mode de maintenance }, conseille de migrer vers les classes Java.time .

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

Vous pouvez échanger des objets Java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou une version ultérieure. Pas besoin de chaînes, pas besoin de Java.sql.* classes.

Où obtenir les classes Java.time? 

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 _.

7
Basil Bourque

Cela dépend un peu des valeurs de mnSeconds et de mnNanoseconds mais tout ce que vous avez à faire avec un formateur comme celui-ci (qui a une précision de la milliseconde) consiste à créer un fichier Java.util.Date. Si mnNanoseconds est le nombre de nanosecondes en plus de votre mnSeconds, je supposerais que ce soit quelque chose comme:

Date d = new Date(mnSeconds*1000+mnNanosecods/1000000)

Ensuite, il suffit de le formater avec votre formateur avant de l’imprimer.

1
Fredrik

La classe Java.util.Date a un constructeur qui accepte l’Epoch en millisecondes.

Vérifiez le Java doc et essayez de vous en servir.

1
sundar

Vous pouvez utiliser

new Java.util.Date(mnSeconds);

et ensuite SimpleDateFormat pour formater votre sortie.

Les nanosecondes ne sont pas prises en charge par Date. Vous devez ajouter manuellement Nanosecondes ou utiliser un framework (existe-t-il?).

0
John Smith