web-dev-qa-db-fra.com

Java calendar obtient la date actuelle, sans heures, minutes, secondes et millisecondes, en millisecondes

Je voudrais obtenir la date actuelle en millisecondes avec seulement l'année, le mois et la date. Mais quand j'utilise ce code:

Calendar cal = Calendar.getInstance();
cal.clear(Calendar.HOUR);
cal.clear(Calendar.MINUTE);
cal.clear(Calendar.SECOND);
cal.clear(Calendar.MILLISECOND);
currentDate = cal.getTimeInMillis();

J'ai toujours l'heure en millisecondes avec l'heure. Comment puis-je réparer cela?

22
just_user
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
currentDate = cal.getTimeInMillis();

Faites attention au fuseau horaire de votre calendrier.

55
Fred

Si vous ne voulez que cela par rapport à GMT et que vous voulez explicitement juste des millisecondes, vous pouvez utiliser ceci:

long now = System.currentTimeMillis();
long today = now - now % 86400000;
9
Alnitak

à partir de javadoc : les champs HOUR_OF_DAY, HOUR et AM_PM sont gérés indépendamment et la règle de résolution pour l'heure de la journée est appliquée. La suppression de l'un des champs ne réinitialise pas la valeur de l'heure du jour de ce calendrier. Utilisez set (Calendar.HOUR_OF_DAY, 0) pour réinitialiser la valeur de l'heure.

cal.set(Calendar.HOUR, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);

pourrait également avoir besoin de régler AM/PM

6
smp7d

tl; dr

LocalDate.now()

LocalDate

Si ce que vous voulez n'est en fait que la date sans l'heure, utilisez la classe LocalDate.

La classe LocalDate représente une valeur de date uniquement sans heure et sans fuseau horaire.

Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde par zone. Par exemple, quelques minutes après minuit à Paris France est un nouveau jour alors qu'il est encore "hier" à Montréal Québec .

Spécifiez un nom de fuseau horaire correct au format continent/region, comme America/Montreal , Africa/Casablanca , ou Pacific/Auckland. N'utilisez jamais l'abréviation de 3-4 lettres telle que EST ou IST car ils sont pas vrais fuseaux horaires, non standardisés, et même pas uniques (!).

ZoneId z = ZoneId.of( "America/Montreal" );
LocalDate today = LocalDate.now( z );

ZonedDateTime

Si vous voulez une date avec l'heure du jour réglée au premier moment de la journée, demandez à Java.time de déterminer ce moment pour vous. Ne présumez pas que le premier moment est à 00:00:00. Des anomalies telles que l'heure d'été signifient que le premier moment peut se produire à un autre moment tel que 01:00:00.

Utilisez cet objet de fuseau horaire, ZoneId, pour générer un objet ZonedDateTime.

ZonedDateTime zdt = today.atStartOfDay( z );  // Determine the first moment of the day on this date for this time zone.

Pour afficher ce même moment comme une valeur en UTC, extrayez un objet Instant.

Instant instant = zdt.toInstant();

Évitez les anciennes classes de date et d'heure

Évitez les anciennes classes de date-heure gênantes telles que Calendar. Ceux-ci sont désormais hérités, supplantés par les classes Java.time.


À propos de Java.time

Le cadre Java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent l'ancien héritage gênant classes date-heure telles que Java.util.Date , Calendar , & SimpleDateFormat .

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

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

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 de futurs ajouts possibles à Java.time. Vous pouvez trouver ici des classes utiles telles que Interval , YearWeek , YearQuarter et plus .

5
Basil Bourque

Si vous souhaitez utiliser heure Joda :

   long millis = new DateMidnight().getMillis();
3
michael667