1293 votes

Comment obtenir l'heure et la date actuelles dans Android

Comment obtenir l'heure et la date actuelles dans une application Android ?

8 votes

43 réponses ! Si beaucoup d'entre elles étaient bonnes lorsqu'elles ont été écrites, la bonne réponse à utiliser en 2018 est la suivante . aquí .

1 votes

Fait amusant : tous les développeurs d'Android sont passés par là.

1515voto

Vous pourriez utiliser :

import java.util.Calendar

Date currentTime = Calendar.getInstance().getTime();

Il y a beaucoup de constantes dans Calendar pour tout ce dont vous avez besoin.

Vérifiez le Documentation de la classe Calendrier .

500voto

Vous pouvez ( mais ne doit plus - voir ci-dessous !) utiliser Format.texte.Android.Time :

Time now = new Time();
now.setToNow();

Extrait de la référence mentionnée ci-dessus :

La classe Time est un remplacement plus rapide pour les classes java.util.Calendar et java.util.GregorianCalendar. Une instance de la classe Time représente un moment dans le temps, spécifié à la seconde près.


NOTE 1 : Il y a plusieurs années que j'ai écrit cette réponse, et elle concerne une ancienne classe spécifique à Android et maintenant dépréciée. Google a maintenant dit que " [c]ette classe présente un certain nombre de problèmes et il est recommandé que Calendrier grégorien est utilisé à la place".


NOTE 2 : Même si le Time a un toMillis(ignoreDaylightSavings) il s'agit simplement d'une commodité à passer aux méthodes qui attendent le temps en millisecondes. La valeur du temps est seulement précis à une seconde près ; la partie millisecondes est toujours 000 . Si dans une boucle vous faites

Time time = new Time();   time.setToNow();
Log.d("TIME TEST", Long.toString(time.toMillis(false)));
... do something that takes more than one millisecond, but less than one second ...

La séquence qui en résulte répétera la même valeur, par exemple 1410543204000 jusqu'à ce que la seconde suivante commence, auquel moment 1410543205000 va commencer à se répéter.

2 votes

@InsanityOnABun et Muhammad Babar. Non, non, non. Les docteurs disent "spécifié avec une seconde de précision" Même le test le plus simple (obtenir l'heure actuelle dans une boucle, en millisecondes, et enregistrer/imprimer le résultat) vous aurait montré que l'heure résultante a 000 comme partie en millisecondes !

3 votes

@IgorZelaya Si vous voulez une précision de l'ordre de la milliseconde, vous faites probablement intervalle de temps plutôt que l'heure de la journée. La documentation Android recommande SystemClock.uptimeMillis() pour le chronométrage par intervalles. Puisque c'est ce que la plupart des fonctions intégrées utilisent, il y a une forte motivation pour qu'elle soit bien implémentée sur tous les appareils. Voir la discussion dans SystemClock ... Si vous voulez corréler cela avec l'heure de la journée, dans le onResume de l'application, lisez à la fois ceci, et Time/setToNow/toMillis. Rappelez-vous la différence entre les deux.

1 votes

Ne pas utiliser la classe Temps . Il va être retiré dans le futur et présente de nombreux problèmes.

447voto

Miciurash Points 1505

Si vous voulez obtenir la date et l'heure dans un modèle spécifique, vous pouvez utiliser ce qui suit :

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmss", Locale.getDefault());
String currentDateandTime = sdf.format(new Date());

Ou,

Date :

String currentDate = new SimpleDateFormat("dd-MM-yyyy", Locale.getDefault()).format(new Date());

C'est l'heure :

String currentTime = new SimpleDateFormat("HH:mm:ss", Locale.getDefault()).format(new Date());

0 votes

Cela donnera l'heure en UTC, à adopter en fonction des fuseaux horaires.

10 votes

Attention, SimpleDateFormat peut être problématique si les performances sont un problème. Dans mon application, j'avais une vue personnalisée qui comportait environ 20 étiquettes HH:MM représentant des temps spécifiques (des entiers longs contenant des millisecondes), et un nombre égal de ressources dessinables. Les premiers tests ont montré que l'interaction n'était pas aussi fluide que je le souhaitais. Lorsque j'ai profilé onDraw(), j'ai constaté que les appels à SimpleTimeFormatter prenaient 80% du temps. En fait, je lis cette page dans le cadre d'une recherche d'un formateur plus efficace et pour en savoir plus sur les calendriers, etc.

0 votes

@William T. Mallard : Avez-vous créé une nouvelle instance de SimpleDateFormat à l'intérieur de onDraw() ? ?

256voto

ANemati Points 1436

Pour ceux qui préfèrent un format personnalisé, vous pouvez utiliser :

DateFormat df = new SimpleDateFormat("EEE, d MMM yyyy, HH:mm");
String date = df.format(Calendar.getInstance().getTime());

Alors que vous pouvez avoir des modèles de DateFormat tels que :

"yyyy.MM.dd G 'at' HH:mm:ss z" ---- 2001.07.04 AD at 12:08:56 PDT
"hh 'o''clock' a, zzzz" ----------- 12 o'clock PM, Pacific Daylight Time
"EEE, d MMM yyyy HH:mm:ss Z"------- Wed, 4 Jul 2001 12:08:56 -0700
"yyyy-MM-dd'T'HH:mm:ss.SSSZ"------- 2001-07-04T12:08:56.235-0700
"yyMMddHHmmssZ"-------------------- 010704120856-0700
"K:mm a, z" ----------------------- 0:08 PM, PDT
"h:mm a" -------------------------- 12:08 PM
"EEE, MMM d, ''yy" ---------------- Wed, Jul 4, '01

129voto

kaneda Points 1693

En fait, il est plus sûr de définir le fuseau horaire actuel défini sur l'appareil avec Time.getCurrentTimezone() sinon vous obtiendrez l'heure actuelle en UTC.

Time today = new Time(Time.getCurrentTimezone());
today.setToNow();

Ensuite, vous pouvez obtenir tous les champs de date que vous voulez, comme, par exemple :

textViewDay.setText(today.monthDay + "");             // Day of the month (1-31)
textViewMonth.setText(today.month + "");              // Month (0-11)
textViewYear.setText(today.year + "");                // Year 
textViewTime.setText(today.format("%k:%M:%S"));  // Current time

Ver Format.texte.Android.Time pour tous les détails.

UPDATE

Comme de nombreuses personnes le soulignent, Google indique que cette classe présente un certain nombre de problèmes et n'est plus censée être utilisée :

Cette classe présente un certain nombre de problèmes et il est recommandé que GregorianCalendar soit utilisée à la place.

Problèmes connus :

Pour des raisons historiques, lorsque l'on effectue des calculs de temps tous arithmétique se fait actuellement avec des entiers de 32 bits. Cela limite la plage de temps fiable représentable de 1902 à 2037. article de wikipedia sur le problème de l'année 2038 pour plus de détails. Ne vous fiez pas à ce comportement ; il peut changer dans le futur. Appeler switchTimezone(String) sur une date qui ne peut pas exister, telle qu'une heure murale qui a été sautée en raison d'une erreur d'affichage. qui a été sautée en raison d'une transition DST, donnera lieu à une date en 1969 (c'est-à-dire -1, ou 1 seconde avant le 1er janvier 1970 UTC). Une grande partie du formatage/analyse suppose un texte ASCII et n'est donc pas adapté à une utilisation pour une utilisation avec des scripts non-ASCII.

0 votes

Time doit être importé de quel paquet ?

0 votes

Cette classe a été dépréciée au niveau 22 de l'API. On peut utiliser GregorianCalendar à la place.

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