Dans Ruby on Rails, il existe une fonctionnalité qui vous permet de prendre n'importe quelle date et d'imprimer "il y a longtemps".
Par exemple:
8 minutes ago
8 hours ago
8 days ago
8 months ago
8 years ago
Existe-t-il un moyen simple de le faire en Java?
Réponses:
Jetez un œil à la bibliothèque PrettyTime .
C'est assez simple à utiliser:
Vous pouvez également transmettre une locale pour les messages internationalisés:
Comme indiqué dans les commentaires, Android a cette fonctionnalité intégrée à la
android.text.format.DateUtils
classe.la source
Avez-vous envisagé l' énumération TimeUnit ? Cela peut être très utile pour ce genre de chose
la source
Je prends les réponses de RealHowTo et Ben J et je crée ma propre version:
qui imprimera ce qui suit
la source
.append(temp != 1 ? "s" : "")
place de.append(temp > 1 ? "s" : "")
car 0 devrait également avoir les
suffixeplus @ Formatez une durée en millisecondes dans un format lisible par l'homme
la source
Ceci est basé sur la réponse de RealHowTo, donc si vous l'aimez, donnez-lui aussi un peu d'amour.
Cette version nettoyée vous permet de spécifier la plage de temps qui pourrait vous intéresser.
Il gère également la partie "et" un peu différemment. Je trouve souvent que lors de la jonction de chaînes avec un délimiteur, il est souvent plus facile de sauter la logique compliquée et de simplement supprimer le dernier délimiteur lorsque vous avez terminé.
Petit code pour lui donner un tourbillon:
Ce qui produira ce qui suit:
Et au cas où quelqu'un en aurait besoin, voici une classe qui convertira toute chaîne comme celle-ci en millisecondes . C'est assez utile pour permettre aux gens de spécifier des délais d'expiration de diverses choses dans un texte lisible.
la source
il y a un moyen simple de le faire:
disons que vous voulez l'heure d'il y a 20 minutes:
c'est tout..
la source
À propos des solutions intégrées:
Java n'a pas de support intégré pour le formatage des temps relatifs, pas plus que Java-8 et son nouveau package
java.time
. Si vous n'avez besoin que de l'anglais et de rien d'autre, alors et seulement, une solution faite à la main pourrait être acceptable - voir la réponse de @RealHowTo (bien qu'elle ait le fort inconvénient de ne pas prendre en compte le fuseau horaire pour la traduction des deltas instantanés en heure locale unités!). Quoi qu'il en soit, si vous souhaitez éviter des solutions de contournement complexes, en particulier pour d'autres paramètres régionaux, vous avez besoin d'une bibliothèque externe.Dans ce dernier cas, je recommande d'utiliser ma bibliothèque Time4J (ou Time4A sur Android). Il offre une plus grande flexibilité et la plus grande puissance i18n . La classe net.time4j.PrettyTime a sept méthodes
printRelativeTime...(...)
à cet effet. Exemple utilisant une horloge de test comme source de temps:Un autre exemple utilisant
java.time.Instant
comme entrée:Cette bibliothèque prend en charge via sa dernière version (v4.17) 80 langues et également certains paramètres régionaux spécifiques à un pays (en particulier pour l'espagnol, l'anglais, l'arabe, le français). Les données i18n sont principalement basées sur la dernière version CLDR v29 . D'autres raisons importantes pour l'utilisation de cette bibliothèque sont un bon support pour les règles du pluriel (qui sont souvent différentes de l'anglais dans d'autres paramètres régionaux), le style de format abrégé (par exemple: "1 sec ago") et les moyens expressifs de prendre en compte les fuseaux horaires . Time4J est même conscient de ces détails exotiques comme les secondes intercalaires dans les calculs de temps relatifs (pas vraiment important mais il forme un message lié à l'horizon d'attente). La compatibilité avec Java-8existe en raison de méthodes de conversion facilement disponibles pour des types tels que
java.time.Instant
oujava.time.Period
.Y a-t-il des inconvénients? Seulement deux.
Alternatives (compactes):
Si vous recherchez une solution plus petite et n'avez pas besoin de autant de fonctionnalités et êtes prêt à tolérer d'éventuels problèmes de qualité liés aux données i18n, alors:
Je recommanderais ocpsoft / PrettyTime (support pour en fait 32 langues (bientôt 34?) Convient pour travailler avec
java.util.Date
seulement - voir la réponse de @ataylor). Le CLDR standard de l'industrie (du consortium Unicode) avec son grand fond de communauté n'est malheureusement pas une base de données i18n, de sorte que d'autres améliorations ou améliorations des données peuvent prendre un certain temps ...Si vous êtes sur Android, la classe d'assistance android.text.format.DateUtils est une alternative intégrée mince (voir les autres commentaires et réponses ici, avec l'inconvénient qu'elle n'a pas de support pendant des années et des mois. Et je suis sûr que seulement très peu de gens aiment le style API de cette classe d'assistance.
Si vous êtes fan de Joda-Time, vous pouvez regarder sa classe PeriodFormat (prise en charge de 14 langues dans la version v2.9.4, de l'autre côté: Joda-Time n'est sûrement pas compact aussi, donc je le mentionne ici juste pour exhaustivité). Cette bibliothèque n'est pas une vraie réponse car les temps relatifs ne sont pas du tout pris en charge. Vous devrez au moins ajouter le littéral "ago" (et en supprimant manuellement toutes les unités inférieures des formats de liste générés - gênant). Contrairement à Time4J ou Android-DateUtils, il n'a pas de support spécial pour les abréviations ou le passage automatique des temps relatifs aux représentations de temps absolu. Comme PrettyTime, il est totalement dépendant des contributions non confirmées de membres privés de la communauté Java à ses données i18n.
la source
Si vous recherchez un simple "Aujourd'hui", "Hier" ou "il y a x jours".
la source
java.time
Utilisation du framework java.time intégré à Java 8 et versions ultérieures.
la source
Duration
méthodes rapportent l' ensemble durée en nombre total d'heures et un nombre total de minutes. Dans Java 8, la classe manquait étrangement de méthodes pour obtenir chaque partie des heures, des minutes et des secondes. Java 9 apporte ces méthodes,to…Part
.J'ai créé un simple port Java timeago du plug-in jquery-timeago qui fait ce que vous demandez.
la source
Si vous développez une application pour Android, elle fournit la classe utilitaire DateUtils pour toutes ces exigences. Jetez un œil à la méthode utilitaire DateUtils # getRelativeTimeSpanString () .
À partir de la documentation pour
CharSequence getRelativeTimeSpanString (long time, long now, long minResolution)
Vous passerez votre
timestamp
comme temps etSystem.currentTimeMillis()
comme maintenant . LeminResolution
vous permet de spécifier la période minimale de rapport.la source
Vous pouvez utiliser cette fonction pour calculer le temps passé
1) Ici time_ago est en microseconde
la source
Sur la base d'un tas de réponses ici, j'ai créé ce qui suit pour mon cas d'utilisation.
Exemple d'utilisation:
la source
Le package joda-time , a la notion de périodes . Vous pouvez faire de l'arithmétique avec des périodes et des dates / heures.
À partir de la documentation :
la source
Ce n'est pas joli ... mais le plus proche auquel je puisse penser est d'utiliser Joda-Time (comme décrit dans cet article: Comment calculer le temps écoulé à partir de maintenant avec Joda Time?
la source
C'est un meilleur code si l'on considère les performances, il réduit le nombre de calculs. Raison Les minutes sont calculées uniquement si le nombre de secondes est supérieur à 60 et les heures ne sont calculées que si le nombre de minutes est supérieur à 60 et ainsi de suite ...
la source
java.time
The Answer by Habsq a la bonne idée mais les mauvaises méthodes.
Pour un intervalle de temps indépendant de la chronologie à l'échelle des années-mois-jours, utilisez
Period
. Pour les jours signifiant des tranches de 24 heures sans rapport avec le calendrier et les heures-minutes-secondes, utilisezDuration
. Mélanger les deux échelles n'a guère de sens.Duration
Commencez par récupérer le moment actuel comme vu en UTC , en utilisant la
Instant
classe.Générez du texte pendant des heures, des minutes et des secondes.
Dump dans la console.
Period
Commencez par obtenir la date actuelle.
Un fuseau horaire est crucial pour déterminer une date. Pour un moment donné, la date varie dans le monde entier 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 .
Si aucun fuseau horaire n'est spécifié, la machine virtuelle Java applique implicitement son fuseau horaire par défaut actuel. Cette valeur par défaut peut changer à tout moment pendant l'exécution (!), Donc vos résultats peuvent varier. Mieux vaut spécifier explicitement votre fuseau horaire souhaité / attendu comme argument. Si critique, confirmez la zone avec votre utilisateur.
Indiquez un nom de fuseau horaire approprié dans le format
Continent/Region
, tels queAmerica/Montreal
,Africa/Casablanca
ouPacific/Auckland
. N'utilisez jamais l'abréviation de 2 à 4 lettres telle queEST
ouIST
car ce ne sont pas de vrais fuseaux horaires, ni standardisés, ni même uniques (!).Recréez une date il y a huit jours, des mois et des années.
Calculez le temps écoulé.
Construisez la chaîne de pièces "il y a du temps".
Dump dans la console.
À 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
.Pour en savoir plus, consultez le didacticiel Oracle . Et recherchez Stack Overflow pour de nombreux exemples et explications. La spécification est JSR 310 .
Le projet Joda-Time , désormais en mode maintenance , conseille la migration vers les classes java.time .
Vous pouvez échanger des objets java.time directement avec votre base de données. Utilisez un pilote JDBC compatible avec JDBC 4.2 ou 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 futurs ajouts à java.time. Vous trouverez peut - être des classes utiles ici, comme
Interval
,YearWeek
,YearQuarter
et plus .la source
Après de longues recherches, j'ai trouvé ceci.
la source
Pour Android Exactement comme Ravi l'a dit, mais comme beaucoup de gens veulent simplement copier-coller la chose ici, c'est.
Explication pour les personnes qui ont plus de temps
Ex. Je reçois les données d'un serveur au format Wed, 27 Jan 2016 09:32:35 GMT [ce n'est probablement PAS votre cas]
cela se traduit par
Formateur SimpleDateFormat = nouveau SimpleDateFormat ("EEE, jj MMM aaaa HH: mm: ss Z");
comment je le sais? Lisez la documentation ici.
Ensuite, après l'avoir analysé, j'obtiens une date. cette date que j'ai mise dans le getRelativeTimeSpanString (sans aucun paramètre supplémentaire, c'est bien pour moi, être par défaut en minutes)
Vous obtiendrez une exception si vous n'avez pas trouvé la bonne chaîne d'analyse , quelque chose comme: exception au caractère 5 . Regardez le caractère 5 et corrigez votre chaîne d'analyse initiale. . Vous pourriez obtenir une autre exception, répétez ces étapes jusqu'à ce que vous ayez la formule correcte.
la source
}
Appel
val Chaîne = timeAgo (unixTimeStamp)
pour obtenir l'heure il y a à Kotlin
la source
Voici ma mise en œuvre Java de ce
la source
ça marche pour moi
la source
C'est le script très basique. c'est facile à improviser.
Résultat: (il y a XXX heures) ou (il y a XX jours / hier / aujourd'hui)
la source
pour cela, j'ai fait
Just Now, seconds ago, min ago, hrs ago, days ago, weeks ago, months ago, years ago
dans cet exemple, vous pouvez analyser la date comme2018-09-05T06:40:46.183Z
celle-ci ou tout autre comme ci-dessousajouter la valeur ci-dessous dans string.xml
code java essayez ci-dessous
la source
Vous pouvez utiliser la bibliothèque Java RelativeDateTimeFormatter , elle fait exactement cela:
la source
J'utilise Instant, Date et DateTimeUtils. Les données (date) qui sont stockées dans la base de données dans le type de chaîne, puis converties en Instant.
la source
Les solutions suivantes sont toutes en Java pur:
Option 1: pas d'arrondi et seulement le plus grand conteneur de temps
La fonction suivante n'affichera que le plus grand conteneur de temps, par exemple, si le vrai temps écoulé est
"1 month 14 days ago"
, cette fonction s'affichera uniquement"1 month ago"
. Cette fonction sera également toujours arrondie vers le bas, donc un temps équivalent à"50 days ago"
s'affichera comme"1 month"
Option 2: avec arrondi
Enveloppez simplement le conteneur de temps que vous souhaitez arrondir avec une instruction Math.round (...), donc si vous voulez arrondir
50 days
à2 months
, modifiez-lelong months = days / 30
enlong months = Math.round(days / 30.0)
la source
Duration
avec sesto…Part
méthodes serait beaucoup plus facile, comme indiqué dans ma réponse .Voici mon cas de test, j'espère que cela vous aidera:
la source
Calendar
classe terrible a été supplantée il y a des années par les classes java.time modernes avec l'adoption de JSR 310 . Mauvais conseils en 2019.var
, nonval
.La fonction getrelativeDateTime vous donnera la date et l'heure comme vous le voyez dans la notification Whatsapp.
Pour obtenir la date et l'heure relatives futures, ajoutez des conditions. Ceci est créé spécifiquement pour obtenir la date et l'heure comme la notification Whatsapp.
la source
SimpleDateFormat
etCalendar
, cependant. Ces classes sont mal conçues et dépassées depuis longtemps. Lisez plutôt les réponses qui utilisent java.time, l'API de date et d'heure Java moderne.Pour le manque de simplicité et de réponse mise à jour, suit la version plus récente de Java 8 et au-delà
Il s'agit de la version qui utilise l'API Java Time qui tente de résoudre les problèmes du passé pour gérer la date et l'heure.
Javadoc
version 8 https://docs.oracle.com/javase/8/docs/api/index.html?java/time/package-summary.html
version 11 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html
Tutoriel W3Schools - https://www.w3schools.com/java/java_date.asp
Article DZone - https://dzone.com/articles/java-8-date-and-time
la source