Suite du programme Java de la question Stack Overflow pour obtenir la date actuelle sans horodatage :
Quelle est la façon la plus efficace d'obtenir un objet Date sans l'heure? Y a-t-il un autre moyen que ces deux-là?
// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));
// Method 2
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);
dateWithoutTime = cal.getTime();
Mise à jour :
Je connaissais Joda-Time ; J'essaie juste d'éviter une bibliothèque supplémentaire pour une tâche aussi simple (je pense). Mais d'après les réponses jusqu'à présent, Joda-Time semble extrêmement populaire, donc je pourrais y penser.
Par efficace , je veux dire que je veux éviter la
String
création d' objets temporaires telle qu'utilisée parmethod 1
, en attendant, celamethod 2
ressemble à un hack au lieu d'une solution.
Réponses:
Avez - vous absolument avoir à utiliser
java.util.Date
? Je bien vous recommandons d' utiliser Joda temps ou lejava.time
package de Java 8 au lieu. En particulier, alors que la date et le calendrier toujours représentent un instant particulier dans le temps, sans ce concept comme « juste une date », Joda Time ne possède un type qui représente ce (LocalDate
). Votre code sera beaucoup plus clair si vous pouvez utiliser des types qui représentent ce que vous essayez de faire.Il existe de nombreuses autres raisons d'utiliser Joda Time ou
java.time
au lieu desjava.util
types intégrés - ce sont généralement de bien meilleures API. Vous pouvez toujours convertir vers / depuis ajava.util.Date
aux limites de votre propre code si vous en avez besoin, par exemple pour l'interaction avec la base de données.la source
Date
objet - cette réponse formate une date en une chaîne, ce qui n'est pas la même chose. Fondamentalement, demander à quelle date aDate
lieu est une question dénuée de sens sans plus d'informations: le fuseau horaire et le système de calendrier que vous utilisez.Voici ce que j'ai utilisé pour obtenir la date d'aujourd'hui avec l'heure définie sur
00:00:00
:la source
Vous pouvez utiliser le DateUtils.truncate de la bibliothèque Apache Commons.
Exemple:
la source
Oui il y a.
java.time
Java 8 et versions ultérieures sont livrées avec le nouveau package java.time intégré . Voir Tutoriel . Une grande partie de la fonctionnalité java.time est rétroportée vers Java 6 et 7 dans ThreeTen-Backport et adaptée à Android dans ThreeTenABP .
Semblable à Joda-Time , java.time propose une
LocalDate
classe pour représenter une valeur de date uniquement sans heure et sans fuseau horaire.Notez que le fuseau horaire est essentiel pour déterminer une date particulière. Par exemple, à minuit à Paris, la date est encore «hier» à Montréal.
Par défaut, java.time utilise la norme ISO 8601 pour générer une représentation sous forme de chaîne d'une date ou d'une date-heure. (Une autre similitude avec Joda-Time.) Il suffit donc d'appeler
toString()
pour générer du texte comme2015-05-21
.À propos de java.time
Le framework java.time est intégré à Java 8 et versions ultérieures. Ces classes supplantent les anciens gênants hérités des classes date-heure tels que
java.util.Date
,Calendar
, etSimpleDateFormat
.Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Pour en savoir plus, consultez le didacticiel Oracle . 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 trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
TimeZone.setDefault
pendant l'exécution et affecter immédiatement tout autre code exécuté dans cette JVM. Morale de l'histoire: spécifiez toujours un fuseau horaire.La manière la plus simple:
la source
long dateOnly = (currentTime / millisInDay) * millisInDay;
identique à l'écriturelong dateOnly = currentTime;
?La réponse standard à ces questions est d'utiliser Joda Time . L'API est meilleure et si vous utilisez les formateurs et les analyseurs, vous pouvez éviter le manque non intuitif de sécurité des threads
SimpleDateFormat
.Utiliser Joda signifie que vous pouvez simplement faire:
Update :: Using java 8 this can be acheived using
la source
LocalDate
classe similaire à Joda-Time.DateTimeZone
passeriez un à ce constructeur LocalDate. La détermination de la date actuelle dépend du fuseau horaire, car Paris commence une nouvelle date plus tôt que Montréal. Si vous omettez le fuseau horaire, le fuseau horaire par défaut de votre JVM est appliqué. Il est généralement préférable de spécifier que de se fier à la valeur par défaut.C'est une façon simple de le faire:
la source
Il n'est pas logique de parler d'une date sans horodatage en ce qui concerne les routines Date dans l'exécution Java standard, car elle correspond essentiellement à une milliseconde spécifique et non à une date. Cette milliseconde est intrinsèquement associée à une heure de la journée, ce qui la rend vulnérable aux problèmes de fuseau horaire tels que l'heure d'été et d'autres ajustements de calendrier. Voir Pourquoi soustraire ces deux fois (en 1927) donne-t-il un résultat étrange? pour un exemple intéressant.
Si vous souhaitez travailler avec des dates au lieu de millisecondes, vous devez utiliser autre chose. Pour Java 8, il existe un nouvel ensemble de méthodes fournissant exactement ce que vous demandez. Pour Java 7 et versions antérieures, utilisez http://www.joda.org/joda-time/
la source
Certainement pas la manière la plus correcte, mais si vous avez juste besoin d'une solution rapide pour obtenir la date sans l'heure et que vous ne souhaitez pas utiliser une bibliothèque tierce, cela devrait faire
Je n'avais besoin de la date qu'à des fins visuelles et je ne pouvais pas Joda donc j'ai sous-chaîne.
la source
la source
Pour autant que je sache, il n'y a pas de moyen plus simple d'y parvenir si vous utilisez uniquement le JDK standard.
Vous pouvez, bien sûr, mettre cette logique dans method2 dans une fonction statique dans une classe d'assistance, comme cela est fait ici dans la méthode toBeginningOfTheDay
Ensuite, vous pouvez raccourcir la deuxième méthode pour:
Ou, si vous avez vraiment besoin de la journée en cours dans ce format si souvent, vous pouvez simplement l'envelopper dans une autre méthode d'assistance statique, ce qui en fait une ligne unique.
la source
Si tout ce que vous voulez est de voir la date comme "AAAA-MM-JJ" sans tous les autres fouillis, par exemple "jeu 21 mai 12:08:18 EDT 2015", utilisez simplement
java.sql.Date
. Cet exemple obtient la date actuelle:Est également
java.sql.Date
une sous-classe dejava.util.Date
.la source
Si vous avez juste besoin de la date actuelle, sans heure, une autre option est:
la source
00:00:00
généralement (peut varier selon le fuseau horaire pour des anomalies telles que l' heure d' été ). Ainsi, comme le notent d'autres réponses, laLocalDate
classe est plus appropriée, à partir de Joda-Time (en supposant que vous faites référence à Joda-Time - que vous devriez noter explicitement lorsque vous citez des classes non fournies avec Java).Utilisez
LocalDate.now()
et convertissez enDate
comme ci-dessous:la source
TimeZone.setDefault
. Votre code appelleZoneId.systemDefault
deux fois, le premier est implicite dansLocalDate.now()
et le second est explicite avecatStartOfDay
. Entre ces deux moments à l'exécution, la zone par défaut actuelle pourrait changer. Je suggère de capturer la zone dans une variable et de passer aux deux méthodes.Si vous avez besoin de la partie date juste pour faire écho, alors
la source
Et ça?
la source
Découvrez l' heure de Veyder . C'est une alternative simple et efficace à la fois à java.util et à Joda-time. Il dispose d'une API et de classes intuitives qui représentent uniquement les dates, sans horodatage.
la source
La manière la plus directe qui utilise pleinement l'énorme base de données TimeZone de Java et est correcte:
la source
Voici une solution propre sans conversion en chaîne et retour, et elle ne recalcule pas le temps plusieurs fois lorsque vous réinitialisez chaque composant du temps à zéro. Il utilise également
%
(module) plutôt que de diviser suivi de multiplier pour éviter la double opération.Elle ne nécessite aucune dépendance tierce et RESPECTE LA FUSEAU HORAIRE DE L'OBJET CALENDRE passé. Cette fonction retourne l'instant à 12 h 00 dans le fuseau horaire de la date (calendrier) que vous passez.
la source
Préférez ne pas utiliser autant que possible des bibliothèques tierces. Je sais que cette façon est mentionnée auparavant, mais voici une belle façon propre:
Eh bien, ne pas utiliser GregorianCalendar est peut-être une option!
la source
Je viens de faire cela pour mon application:
API Android niveau 1, pas de bibliothèque externe. Il respecte la lumière du jour et la zone horaire par défaut. Aucune manipulation de chaîne, donc je pense que cette méthode est plus efficace que la vôtre, mais je n'ai fait aucun test.
la source
Vous pouvez utiliser le temps Joda.
et vous appelez avec:
la source