129 votes

Comment puis-je obtenir le nombre de millisecondes depuis minuit pour le courant ?

Notez que je ne veux PAS de millis de l'époque. Je veux le nombre de millisecondes actuellement sur l'horloge.

Donc par exemple, j'ai ce bout de code.

Date date2 = new Date(); 
Long time2 = (long) (((((date2.getHours() * 60) + date2.getMinutes())* 60 ) + date2.getSeconds()) * 1000);

Existe-t-il un moyen d'obtenir des millisecondes avec une date ? Existe-t-il un autre moyen de le faire ?

Nota: System.currentTimeMillis() me donne des millis de l'époque, ce qui n'est pas ce que je recherche.

202voto

Peter Lawrey Points 229686

Vous voulez dire ?

long millis = System.currentTimeMillis() % 1000;

BTW Windows ne permet pas de voyager dans le temps jusqu'en 1969.

C:\> date
Enter the new date: (dd-mm-yy) 2/8/1969
The system cannot accept the date entered.

26voto

Markus Mikkolainen Points 2228

Utiliser le calendrier

Calendar.getInstance().get(Calendar.MILLISECOND);

o

Calendar c=Calendar.getInstance();
c.setTime(new Date()); /* whatever*/
//c.setTimeZone(...); if necessary
c.get(Calendar.MILLISECOND);

Dans la pratique, cependant, je pense qu'il sera presque toujours égal à System.currentTimeMillis()%1000 ; à moins que quelqu'un n'ait des millisecondes bissextiles ou qu'un calendrier soit défini avec une époque qui n'est pas à la seconde près.

17voto

KayKay Points 3449
Calendar.getInstance().get(Calendar.MILLISECOND);

15voto

Basil Bourque Points 8938

Tl;dr

Vous demandez la fraction de seconde du temps actuel sous la forme d'un nombre de millisecondes ( no compte à partir de l'époque).

Instant.now()                               // Get current moment in UTC, then…
       .get( ChronoField.MILLI_OF_SECOND )  // interrogate a `TemporalField`.

2017-04-25T03:01:14.113Z 113

  1. Obtenez la fraction de seconde en nanosecondes (milliards).
  2. Divisez par mille pour tronquer en millisecondes (milliers).

Voir ceci code exécuté en direct sur IdeOne.com .

Utilisation de java.time

La méthode moderne consiste à utiliser les classes java.time.

Capturez le moment présent en UTC.

Instant.now()

Utilisez le Instant.get pour interroger la valeur d'un TemporalField . Dans notre cas, le TemporalField nous voulons ChronoField.MILLI_OF_SECOND .

int millis = Instant.now().get( ChronoField.MILLI_OF_SECOND ) ;  // Get current moment in UTC, then interrogate a `TemporalField`.

Ou faites le calcul vous-même.

Il est plus probable que vous posiez cette question pour un fuseau horaire spécifique. La fraction de seconde sera vraisemblablement la même qu'avec Instant mais il y a tellement d'anomalies avec les fuseaux horaires que j'hésite à faire cette supposition.

ZonedDateTime zdt = ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ) ;

Interroger pour la fraction de seconde. La question demandait millisecondes mais les classes java.time utilisent une résolution plus fine de l'expression nanosecondes . Cela signifie que le nombre de nanosecondes sera compris entre 0 et 999 999 999.

long nanosFractionOfSecond = zdt.getNano();

Si vous voulez vraiment des millisecondes, tronquez les données les plus fines en les divisant par un million. Par exemple, une demi-seconde est égale à 500 000 000 nanosecondes et aussi à 500 millisecondes.

long millis = ( nanosFractionOfSecond / 1_000_000L ) ;  // Truncate nanoseconds to milliseconds, by a factor of one million.

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

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

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

Où obtenir les classes java.time ?

  • Java SE 8 y SE 9 et plus tard
    • Intégré.
    • Fait partie de l'API Java standard avec une mise en œuvre groupée.
    • Java 9 ajoute quelques fonctionnalités et corrections mineures.
  • Java SE 6 y SE 7
    • Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 & 7 dans Trois Dix-Backport .
  • Android

El Trois-Dix-Extra Le projet étend java.time avec des classes supplémentaires. Ce projet est un terrain d'essai pour d'éventuels ajouts futurs à java.time. Vous pouvez y trouver des classes utiles telles que Interval , YearWeek , YearQuarter y plus .

14voto

J'ai essayé quelques-unes des options ci-dessus mais elles semblent se réinitialiser à 1000

Celui-ci fonctionne sans aucun doute, et doit également tenir compte de l'année.

long millisStart = Calendar.getInstance().getTimeInMillis();

puis faites de même pour le temps final si nécessaire.

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