Jak obliczyć czas od teraz z Joda-Time?
Muszę obliczyć czas, jaki upłynął od jednej konkretnej daty do teraz i wyświetlić go w tym samym formacie, Co pytania Stoskoverflow, tzn.:
15s ago
2min ago
2hours ago
2days ago
25th Dec 08
Czy wiesz jak to osiągnąć za pomocą Javy Joda-Czas biblioteka ? Czy istnieje metoda pomocnicza, która już ją implementuje, czy powinienem sam napisać algorytm?
4 answers
Aby obliczyć czas jaki upłynął z JodaTime, użyj Period
. Aby sformatować upłynięty czas w pożądanej reprezentacji ludzkiej, użyj PeriodFormatter
które można zbudować poprzez PeriodFormatterBuilder
.
Oto przykład:
DateTime myBirthDate = new DateTime(1978, 3, 26, 12, 35, 0, 0);
DateTime now = new DateTime();
Period period = new Period(myBirthDate, now);
PeriodFormatter formatter = new PeriodFormatterBuilder()
.appendSeconds().appendSuffix(" seconds ago\n")
.appendMinutes().appendSuffix(" minutes ago\n")
.appendHours().appendSuffix(" hours ago\n")
.appendDays().appendSuffix(" days ago\n")
.appendWeeks().appendSuffix(" weeks ago\n")
.appendMonths().appendSuffix(" months ago\n")
.appendYears().appendSuffix(" years ago\n")
.printZeroNever()
.toFormatter();
String elapsed = formatter.print(period);
System.out.println(elapsed);
To już drukuje
3 seconds ago 51 minutes ago 7 hours ago 6 days ago 10 months ago 31 years ago
(kaszel, stary, kaszel) widzisz, że wziąłem pod uwagę miesiące i lata i skonfigurowałem go tak, aby pomijał wartości, gdy są one zerowe.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-17 20:29:11
Użyj PrettyTime dla prostego czasu, który upłynął.
próbowałem HumanTime jako @sfussenegger odpowiedział i używając Period
JodaTime, ale najprostszą i najczystszą metodą dla czytelnego dla człowieka czasu, jaki znalazłem, była biblioteka PrettyTime.
Oto kilka prostych przykładów z wejściem i wyjściem:
Pięć Minut Temu
DateTime fiveMinutesAgo = DateTime.now().minusMinutes( 5 );
new PrettyTime().format( fiveMinutesAgo.toDate() );
// Outputs: "5 minutes ago"
AGO
DateTime birthday = new DateTime(1978, 3, 26, 12, 35, 0, 0);
new PrettyTime().format( birthday.toDate() );
// Outputs: "4 decades ago"
Uwaga: [[24]} próbowałem bawić się z bardziej precyzyjna funkcjonalność biblioteki, ale daje dziwne wyniki, więc używaj jej ostrożnie.
JP
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-03 14:43:24
Możesz to zrobić z PeriodFormatter, ale nie musisz iść do wysiłku tworzenia własnego PeriodFormatBuilder jak w inne odpowiedzi . Jeśli to pasuje do twojego przypadku, możesz po prostu użyć domyślnego formatera:
Period period = new Period(startDate, endDate);
System.out.println(PeriodFormat.getDefault().print(period))
(hat tip to this answer na podobne pytanie, wrzucam link do discoverability)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:09:44
Jest mała klasa pomocnicza o nazwie HumanTime , z której jestem całkiem zadowolony.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-01 20:13:09