Jika Anda bekerja di Android, Anda dapat menggunakan ini: android.text.format.DateUtils # getRelativeTimeSpanString ()
Somatik
Bisakah Anda menambahkan deskripsi lebih lanjut ke jawaban Anda, hanya tautan jawaban yang tidak baik untuk saat ini.
Ajay S
@Somatik jika Anda perlu mendapatkan ini pada platform non-android, Anda dapat melihat kelas itu di AOSP.
greg7gkb
@ ataylor bagaimana ini menggunakan Android ??
Hardik Parmar
getRelativeTimeSpanString tidak ideal untuk semua situasi dan itulah sebabnya saya membuat kelas sendiri berdasarkan banyak contoh di sini. Lihat solusi saya di bawah ini: stackoverflow.com/a/37042254/468360
Codeversed
67
Sudahkah Anda mempertimbangkan TimeUnit enum? Ini bisa sangat berguna untuk hal semacam ini
try{SimpleDateFormat format =newSimpleDateFormat("dd/MM/yyyy");Date past = format.parse("01/10/2010");Date now =newDate();System.out.println(TimeUnit.MILLISECONDS.toMillis(now.getTime()- past.getTime())+" milliseconds ago");System.out.println(TimeUnit.MILLISECONDS.toMinutes(now.getTime()- past.getTime())+" minutes ago");System.out.println(TimeUnit.MILLISECONDS.toHours(now.getTime()- past.getTime())+" hours ago");System.out.println(TimeUnit.MILLISECONDS.toDays(now.getTime()- past.getTime())+" days ago");}catch(Exception j){
j.printStackTrace();}
Saya tidak berpikir bahwa ini adalah jawaban yang lengkap karena unit waktu independen. Misalnya - waktu milidetik hanya waktu menit * 60 * 1000. Anda harus mengurangi dari setiap unit waktu yang selanjutnya satuan waktu lebih besar (setelah mengubahnya ke unit waktu yang lebih rendah) agar dapat menggunakannya dalam "waktu yang lalu "string.
Nativ
@ Benj - Benarkah ? solusi di atas? karena satu waktu dalam format 12 jam dan waktu lain dalam format 24 jam. Beri tahu saya tanggapan Anda untuk permintaan saya. Terima kasih sebelumnya.
Swift
ini tidak benar ... setiap unit tidak tergantung satu sama lain seperti yang telah disebutkan.
Jonathan Laliberte
1
Android melakukannya untuk Anda. Jika Anda bekerja di android, Anda dapat menggunakan ini: android.text.format.DateUtils.getRelativeTimeSpanString (milidetik)
Wajid Ali
50
Saya menerima jawaban RealHowTo dan Ben J dan membuat versi saya sendiri:
publicclassTimeAgo{publicstaticfinalList<Long> times =Arrays.asList(TimeUnit.DAYS.toMillis(365),TimeUnit.DAYS.toMillis(30),TimeUnit.DAYS.toMillis(1),TimeUnit.HOURS.toMillis(1),TimeUnit.MINUTES.toMillis(1),TimeUnit.SECONDS.toMillis(1));publicstaticfinalList<String> timesString =Arrays.asList("year","month","day","hour","minute","second");publicstaticString toDuration(long duration){StringBuffer res =newStringBuffer();for(int i=0;i<TimeAgo.times.size(); i++){Long current =TimeAgo.times.get(i);long temp = duration/current;if(temp>0){
res.append(temp).append(" ").append(TimeAgo.timesString.get(i)).append(temp !=1?"s":"").append(" ago");break;}}if("".equals(res.toString()))return"0 seconds ago";elsereturn res.toString();}publicstaticvoid main(String args[]){System.out.println(toDuration(123));System.out.println(toDuration(1230));System.out.println(toDuration(12300));System.out.println(toDuration(123000));System.out.println(toDuration(1230000));System.out.println(toDuration(12300000));System.out.println(toDuration(123000000));System.out.println(toDuration(1230000000));System.out.println(toDuration(12300000000L));System.out.println(toDuration(123000000000L));}}
yang akan mencetak yang berikut ini
0 second ago
1 second ago
12 seconds ago
2 minutes ago
20 minutes ago
3 hours ago
1 day ago
14 days ago
4 months ago
3 years ago
Benar-benar keren. Dan sangat mudah untuk menambahkan satuan waktu lain seperti minggu
Piotr
1
yang ini layak mendapat lebih banyak upvotes. Pertama-tama, tidak perlu perpustakaan. Itu masih bersih, elegan dan mudah diubah.
fangzhzh
kesalahan ketik kecil: di dalam kode Anda, Anda merujuk ke properti statis "Daftar", bukan "TimeAgo". Lists.times.get (i) harus TimeAgo.get (i) ... dan seterusnya
Diogo Gomes
2
Sedikit saran: gunakan .append(temp != 1 ? "s" : "")sebagai ganti .append(temp > 1 ? "s" : "")karena 0 juga harus memiliki sakhiran
berkus
1
@ ShajeelAfzal ya, parameter durasi dalam milidetik tetapi perbedaan antara waktu bukan nilai absolut. Apa yang Anda dapatkan adalah waktu yang telah berlalu dari 1 Januari 1970 tanggal ketika cap waktu unix dimulai
Saya akhirnya menggunakan versi revisi ini. Diposting revisi saya untuk Anda.
David Blevins
5
David Blevins, lebih banyak contoh tentang PrettyTime: stackoverflow.com/questions/3859288/... Big -1 untuk menemukan kembali roda sekali lagi dan tidak merekomendasikan perpustakaan pihak ke-3 :-p
zakmck
9
Ini didasarkan pada jawaban RealHowTo, jadi jika Anda menyukainya, berikan juga cinta padanya.
Versi pembersihan ini memungkinkan Anda menentukan rentang waktu yang mungkin menarik bagi Anda.
Ini juga menangani bagian "dan" sedikit berbeda. Saya sering menemukan ketika bergabung dengan string dengan pembatas lebih mudah untuk melewati logika yang rumit dan hanya menghapus pembatas terakhir ketika Anda selesai.
import java.util.concurrent.TimeUnit;importstatic java.util.concurrent.TimeUnit.MILLISECONDS;publicclassTimeUtils{/**
* Converts time to a human readable format within the specified range
*
* @param duration the time in milliseconds to be converted
* @param max the highest time unit of interest
* @param min the lowest time unit of interest
*/publicstaticString formatMillis(long duration,TimeUnit max,TimeUnit min){StringBuilder res =newStringBuilder();TimeUnit current = max;while(duration >0){long temp = current.convert(duration, MILLISECONDS);if(temp >0){
duration -= current.toMillis(temp);
res.append(temp).append(" ").append(current.name().toLowerCase());if(temp <2) res.deleteCharAt(res.length()-1);
res.append(", ");}if(current == min)break;
current =TimeUnit.values()[current.ordinal()-1];}// clean up our formatting....// we never got a hit, the time is lower than we care aboutif(res.lastIndexOf(", ")<0)return"0 "+ min.name().toLowerCase();// yank trailing ", "
res.deleteCharAt(res.length()-2);// convert last ", " to " and"int i = res.lastIndexOf(", ");if(i >0){
res.deleteCharAt(i);
res.insert(i," and");}return res.toString();}}
0 seconds
5 seconds
1 day and 1 hour
1 day and 2 seconds
1 day,1 hour and 2 minutes
4 days,3 hours,2 minutes and 1 second
5 days,4 hours,1 minute and 23 seconds
42 days
Again in only hours and minutes
0 minutes
0 minutes
25 hours
24 hours
25 hours and 2 minutes
99 hours and 2 minutes
124 hours and 1 minute
1008 hours
Dan kalau-kalau ada yang pernah membutuhkannya, inilah kelas yang akan mengubah string apa pun seperti di atas kembali menjadi milidetik . Ini cukup berguna untuk memungkinkan orang menentukan batas waktu berbagai hal dalam teks yang dapat dibaca.
Dalam kebanyakan kasus, Anda menginginkan tampilan "pintar", yaitu. bukannya 5125 menit yang lalu, Anda memberi tahu x hari yang lalu.
PhiLho
7
Tentang built-in solusi:
Java tidak memiliki dukungan bawaan untuk memformat waktu relatif, juga bukan Java-8 dan paket barunya java.time . Jika Anda hanya membutuhkan bahasa Inggris dan bukan yang lain, maka hanya dengan itu solusi buatan tangan mungkin dapat diterima - lihat jawaban @RealHowTo (walaupun memiliki kelemahan kuat untuk tidak memperhitungkan zona waktu untuk terjemahan delta instan ke waktu lokal) unit!). Lagi pula, jika Anda ingin menghindari solusi kompleks buatan sendiri terutama untuk lokal lain maka Anda memerlukan perpustakaan eksternal.
Dalam kasus terakhir, saya sarankan untuk menggunakan perpustakaan saya Time4J (atau Time4A di Android). Ini menawarkan fleksibilitas terbesar dan sebagian besar daya i18n . Kelas net.time4j.PrettyTime memiliki tujuh metode printRelativeTime...(...)untuk tujuan ini. Contoh menggunakan jam tes sebagai sumber waktu:
TimeSource<?> clock =()->PlainTimestamp.of(2015,8,1,10,24,5).atUTC();Moment moment =PlainTimestamp.of(2015,8,1,17,0).atUTC();// our inputString durationInDays =PrettyTime.of(Locale.GERMAN).withReferenceClock(clock).printRelative(
moment,Timezone.of(EUROPE.BERLIN),TimeUnit.DAYS);// controlling the precisionSystem.out.println(durationInDays);// heute (german word for today)
Contoh lain menggunakan java.time.Instantinput:
String relativeTime =PrettyTime.of(Locale.ENGLISH).printRelativeInStdTimezone(Moment.from(Instant.EPOCH));System.out.println(relativeTime);// 45 years ago
Perpustakaan ini mendukung melalui versi terbarunya (v4.17) 80 bahasa dan juga beberapa lokal negara tertentu (terutama untuk Spanyol, Inggris, Arab, Perancis). Data i18n terutama didasarkan pada versi CLDR-versi terbaru . Alasan penting lainnya mengapa menggunakan perpustakaan ini adalah dukungan yang baik untuk aturan jamak (yang sering berbeda dari bahasa Inggris di tempat lain), gaya format yang disingkat (misalnya: "1 detik yang lalu") dan cara-cara ekspresif untuk memperhitungkan zona waktu akun . Time4J bahkan menyadari detail eksotis seperti seperti lompatan detik dalam perhitungan waktu relatif (tidak terlalu penting tetapi membentuk pesan terkait dengan horizon harapan). The kompatibilitas dengan Java-8ada karena metode konversi yang mudah tersedia untuk jenis suka java.time.Instantatau java.time.Period.
Apakah ada kekurangan? Hanya dua.
Perpustakaannya tidak kecil (juga karena repositori i18n-datanya yang besar).
API tidak dikenal sehingga pengetahuan dan dukungan masyarakat belum tersedia jika tidak, dokumentasi yang disediakan cukup rinci dan komprehensif.
Alternatif (kompak):
Jika Anda mencari solusi yang lebih kecil dan tidak memerlukan banyak fitur dan bersedia mentolerir masalah kualitas yang mungkin terkait dengan i18n-data maka:
Saya akan merekomendasikan ocpsoft / PrettyTime (dukungan untuk sebenarnya 32 bahasa (segera 34?) Cocok untuk bekerja dengan java.util.Datehanya - lihat jawaban @ ataylor). CLDR standar industri (dari konsorsium Unicode) dengan latar belakang komunitas yang besar sayangnya bukan basis dari i18n-data sehingga peningkatan lebih lanjut atau perbaikan data ...
Jika Anda menggunakan Android, maka helper class android.text.format.DateUtils adalah alternatif bawaan yang ramping (lihat komentar dan jawaban lain di sini, dengan kerugian karena tidak memiliki dukungan selama bertahun-tahun. Dan saya yakin hanya sangat sedikit orang menyukai gaya API dari kelas pembantu ini.
Jika Anda adalah penggemar Joda-Time maka Anda dapat melihat kelasnya PeriodFormat (dukungan untuk 14 bahasa dalam rilis v2.9.4, di sisi lain: Joda-Time pasti tidak kompak juga, jadi saya sebutkan di sini hanya untuk kelengkapan). Perpustakaan ini bukan jawaban nyata karena waktu relatif tidak didukung sama sekali. Anda harus menambahkan literal "lalu" setidaknya (dan secara manual melepaskan semua unit yang lebih rendah dari format daftar yang dihasilkan - canggung). Tidak seperti Time4J atau Android-DateUtils, ia tidak memiliki dukungan khusus untuk singkatan atau perpindahan otomatis dari waktu relatif ke representasi waktu absolut. Seperti PrettyTime, itu sepenuhnya bergantung pada kontribusi yang tidak dikonfirmasi dari anggota pribadi komunitas Java ke data i18n-nya.
Jika Anda mencari "Hari Ini" yang sederhana, "Kemarin" atau "x hari yang lalu".
privateString getDaysAgo(Date date){long days =(newDate().getTime()- date.getTime())/86400000;if(days ==0)return"Today";elseif(days ==1)return"Yesterday";elsereturn days +" days ago";}
Menggunakan kerangka java.time dibangun ke dalam Java 8 dan yang lebih baru.
LocalDateTime t1 =LocalDateTime.of(2015,1,1,0,0,0);LocalDateTime t2 =LocalDateTime.now();Period period =Period.between(t1.toLocalDate(), t2.toLocalDate());Duration duration =Duration.between(t1, t2);System.out.println("First January 2015 is "+ period.getYears()+" years ago");System.out.println("First January 2015 is "+ period.getMonths()+" months ago");System.out.println("First January 2015 is "+ period.getDays()+" days ago");System.out.println("First January 2015 is "+ duration.toHours()+" hours ago");System.out.println("First January 2015 is "+ duration.toMinutes()+" minutes ago");
DurationMetode - metode tersebut melaporkan seluruh durasi sebagai jumlah total jam dan total jumlah menit. Di Java 8 kelas anehnya tidak memiliki metode untuk mendapatkan setiap bagian dari jam dan menit dan detik. Java 9 membawa metode tersebut to…Part,.
CharSequence getRelativeTimeSpanString (lama, lama sekarang, penyelesaian panjang)
Mengembalikan string yang menggambarkan 'waktu' sebagai waktu relatif terhadap 'sekarang'. Rentang waktu di masa lalu diformat seperti "42 menit yang lalu". Rentang waktu di masa depan diformat seperti "Dalam 42 menit".
Anda akan melewati Anda timestampsebagai waktu dan System.currentTimeMillis()sebagai sekarang . The minResolutionmemungkinkan Anda menentukan jangka waktu yang minimum untuk melaporkan.
Misalnya, waktu 3 detik di masa lalu akan dilaporkan sebagai "0 menit yang lalu" jika ini disetel ke MINUTE_IN_MILLIS. Lewati salah satu dari 0, MINUTE_IN_MILLIS, HOUR_IN_MILLIS, DAY_IN_MILLIS, WEEK_IN_MILLIS dll.
Ini adalah kode yang lebih baik jika kita mempertimbangkan kinerja. Ini mengurangi jumlah perhitungan.
Alasan
Menit dihitung hanya jika jumlah detik lebih besar dari 60 dan Jam dihitung hanya jika jumlah menit lebih besar dari 60 dan seterusnya ...
Jika Anda bekerja di Android, Anda dapat menggunakan ini: android.text.format.DateUtils.getRelativeTimeSpanString (milidetik)
Wajid Ali
2
waktu java
The Answer Habsq memiliki ide yang tepat tetapi metode yang salah.
Untuk rentang waktu yang tidak terikat ke timeline pada skala tahun-bulan-hari, gunakan Period. Untuk hari yang berarti potongan waktu 24 jam yang tidak terkait dengan kalender dan jam-menit-detik, gunakan Duration. Mencampur dua skala jarang masuk akal.
Duration
Mulailah dengan mengambil momen saat ini seperti yang terlihat di UTC , menggunakan Instantkelas.
Instant now =Instant.now();// Capture the current moment as seen in UTC.Instant then = now.minus(8L,ChronoUnit.HOURS ).minus(8L,ChronoUnit.MINUTES ).minus(8L,ChronoUnit.SECONDS );Duration d =Duration.between( then , now );
Hasilkan teks selama berjam-jam, menit, dan detik.
// Generate text by calling `to…Part` methods.String output = d.toHoursPart()+" hours ago\n"+ d.toMinutesPart()+" minutes ago\n"+ d.toSecondsPart()+" seconds ago";
Dump ke konsol.
System.out.println("From: "+ then +" to: "+ now );System.out.println( output );
Zona waktu sangat penting dalam menentukan tanggal. Untuk setiap saat, tanggal bervariasi di seluruh dunia berdasarkan zona. Sebagai contoh, beberapa menit setelah tengah malam di Paris, Perancis adalah hari yang baru ketika masih "kemarin" di Montréal Québec .
Jika tidak ada zona waktu yang ditentukan, JVM secara implisit menerapkan zona waktu default saat ini. Default itu dapat berubah kapan saja selama runtime (!), Sehingga hasil Anda dapat bervariasi. Lebih baik menentukan zona waktu yang diinginkan / diharapkan secara eksplisit sebagai argumen. Jika kritis, konfirmasikan zona dengan pengguna Anda.
Tentukan nama zona waktu yang tepat dalam format Continent/Region, seperti America/Montreal, Africa/Casablanca, atau Pacific/Auckland. Jangan pernah menggunakan singkatan 2-4 huruf seperti ESTatau ISTkarena mereka bukan zona waktu yang sebenarnya, tidak terstandarisasi, dan bahkan tidak unik (!).
ZoneId z =ZoneId.of("America/Montreal");LocalDate today =LocalDate.now( z );
Buat kembali tanggal delapan hari, bulan, dan tahun lalu.
LocalDate then = today.minusYears(8).minusMonths(8).minusDays(7);// Notice the 7 days, not 8, because of granularity of months.
Hitung waktu yang telah berlalu.
Period p =Period.between( then , today );
Buat string potongan "waktu lalu".
String output = p.getDays()+" days ago\n"+ p.getMonths()+" months ago\n"+ p.getYears()+" years ago";
Dump ke konsol.
System.out.println("From: "+ then +" to: "+ today );System.out.println( output );
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlujava.sql.* kelas.
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti Interval, YearWeek, YearQuarter, dan lebih .
publicclassGetTimeLapse{publicstaticString getlongtoago(long createdAt){DateFormat userDateFormat =newSimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");DateFormat dateFormatNeeded =newSimpleDateFormat("MM/dd/yyyy HH:MM:SS");Date date =null;
date =newDate(createdAt);String crdate1 = dateFormatNeeded.format(date);// Date CalculationDateFormat dateFormat =newSimpleDateFormat("MM/dd/yyyy HH:mm:ss");
crdate1 =newSimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date);// get current date time with Calendar()Calendar cal =Calendar.getInstance();String currenttime = dateFormat.format(cal.getTime());DateCreatedAt=null;Date current =null;try{CreatedAt= dateFormat.parse(crdate1);
current = dateFormat.parse(currenttime);}catch(java.text.ParseException e){// TODO Auto-generated catch block
e.printStackTrace();}// Get msec from each, and subtract.long diff = current.getTime()-CreatedAt.getTime();long diffSeconds = diff /1000;long diffMinutes = diff /(60*1000)%60;long diffHours = diff /(60*60*1000)%24;long diffDays = diff /(24*60*60*1000);String time =null;if(diffDays >0){if(diffDays ==1){
time = diffDays +"day ago ";}else{
time = diffDays +"days ago ";}}else{if(diffHours >0){if(diffHours ==1){
time = diffHours +"hr ago";}else{
time = diffHours +"hrs ago";}}else{if(diffMinutes >0){if(diffMinutes ==1){
time = diffMinutes +"min ago";}else{
time = diffMinutes +"mins ago";}}else{if(diffSeconds >0){
time = diffSeconds +"secs ago";}}}}return time;}}
Kemudian setelah saya uraikan, saya mendapat kencan. tanggal itu saya masukkan ke getRelativeTimeSpanString (tanpa parameter tambahan apa-apa oleh saya, menjadi default ke menit)
Anda AKAN mendapatkan pengecualian jika Anda tidak mengetahui String parsing yang benar , Sesuatu seperti: exception pada karakter 5 . Lihatlah karakter 5, dan koreksi string parsing awal Anda. . Anda mungkin mendapatkan pengecualian lain, ulangi langkah ini sampai Anda memiliki formula yang benar.
Ini adalah naskah yang sangat mendasar. mudah untuk diimprovisasi.
Hasil: (XXX Jam Lalu), atau (XX Hari Lalu / Kemarin / Hari Ini)
<span id='hourpost'></span>,or
<span id='daypost'></span><script>
var postTime =newDate('2017/6/9 00:01');
var now =newDate();
var difference = now.getTime()- postTime.getTime();
var minutes =Math.round(difference/60000);
var hours =Math.round(minutes/60);
var days =Math.round(hours/24);
var result;if(days <1){
result ="Today";}elseif(days <2){
result ="Yesterday";}else{
result = days +" Days ago";}
document.getElementById("hourpost").innerHTML = hours +"Hours Ago";
document.getElementById("daypost").innerHTML = result ;</script>
untuk ini saya sudah melakukan Just Now, seconds ago, min ago, hrs ago, days ago, weeks ago, months ago, years agodalam contoh ini Anda dapat mengurai tanggal seperti 2018-09-05T06:40:46.183Zini atau yang lain seperti di bawah ini
Itu perpustakaan Android, bukan perpustakaan Java.
Madbreaks
0
Saya menggunakan Instant, Date and DateTimeUtils. Data (tanggal) yang disimpan dalam database dalam bentuk String dan kemudian dikonversi menjadi Instan.
/*
This method is to display ago.
Example: 3 minutes ago.
I already implement the latest which is including the Instant.
Convert from String to Instant and then parse to Date.
*/publicString convertTimeToAgo(String dataDate){//InitializeString conversionTime =null;String suffix ="Yang Lalu";Date pastTime;//Parse from String (which is stored as Instant.now().toString()//And then convert to become DateInstant instant =Instant.parse(dataDate);
pastTime =DateTimeUtils.toDate(instant);//Today dateDate nowTime =newDate();long dateDiff = nowTime.getTime()- pastTime.getTime();long second =TimeUnit.MILLISECONDS.toSeconds(dateDiff);long minute =TimeUnit.MILLISECONDS.toMinutes(dateDiff);long hour =TimeUnit.MILLISECONDS.toHours(dateDiff);long day =TimeUnit.MILLISECONDS.toDays(dateDiff);if(second <60){
conversionTime = second +" Saat "+ suffix;}elseif(minute <60){
conversionTime = minute +" Minit "+ suffix;}elseif(hour <24){
conversionTime = hour +" Jam "+ suffix;}elseif(day >=7){if(day >30){
conversionTime =(day /30)+" Bulan "+ suffix;}elseif(day >360){
conversionTime =(day /360)+" Tahun "+ suffix;}else{
conversionTime =(day /7)+" Minggu "+ suffix;}}elseif(day <7){
conversionTime = day +" Hari "+ suffix;}return conversionTime;}
Opsi 1: Tidak ada pembulatan dan satu-satunya wadah waktu terbesar
Fungsi berikut hanya akan menampilkan wadah waktu terbesar, misalnya, jika waktu yang sebenarnya berlalu "1 month 14 days ago", fungsi ini hanya akan menampilkan "1 month ago". Fungsi ini juga akan selalu dibulatkan ke bawah, sehingga waktu yang setara dengan "50 days ago"akan ditampilkan sebagai"1 month"
publicString formatTimeAgo(long millis){String[] ids =newString[]{"second","minute","hour","day","month","year"};long seconds = millis /1000;long minutes = seconds /60;long hours = minutes /60;long days = hours /24;long months = days /30;long years = months /12;ArrayList<Long> times =newArrayList<>(Arrays.asList(years, months, days, hours, minutes, seconds));for(int i =0; i < times.size(); i++){if(times.get(i)!=0){long value = times.get(i).intValue();return value +" "+ ids[ids.length -1- i]+(value ==1?"":"s")+" ago";}}return"0 seconds ago";}
Opsi 2: Dengan pembulatan
Cukup bungkus wadah waktu yang ingin Anda bundar dengan pernyataan Math.round (...), jadi jika Anda ingin membulatkannya 50 dayske 2 months, modifikasi long months = days / 30kelong months = Math.round(days / 30.0)
Menggunakan Durationdengan to…Partmetodenya akan jauh lebih mudah, seperti yang ditunjukkan pada Jawaban saya .
Basil Bourque
0
Ini adalah test case saya, semoga membantu:
val currentCalendar =Calendar.getInstance()
currentCalendar.set(2019,6,2,5,31,0)
val targetCalendar =Calendar.getInstance()
targetCalendar.set(2019,6,2,5,30,0)
val diffTs = currentCalendar.timeInMillis - targetCalendar.timeInMillis
val diffMins =TimeUnit.MILLISECONDS.toMinutes(diffTs)
val diffHours =TimeUnit.MILLISECONDS.toHours(diffTs)
val diffDays =TimeUnit.MILLISECONDS.toDays(diffTs)
val diffWeeks =TimeUnit.MILLISECONDS.toDays(diffTs)/7
val diffMonths =TimeUnit.MILLISECONDS.toDays(diffTs)/30
val diffYears =TimeUnit.MILLISECONDS.toDays(diffTs)/365
val newTs = when {
diffYears >=1->"Years $diffYears"
diffMonths >=1->"Months $diffMonths"
diffWeeks >=1->"Weeks $diffWeeks"
diffDays >=1->"Days $diffDays"
diffHours >=1->"Hours $diffHours"
diffMins >=1->"Mins $diffMins"else->"now"}
Kelas mengerikan Calendardigantikan tahun yang lalu oleh kelas java.time modern dengan adopsi JSR 310 . Nasehat yang buruk pada tahun 2019.
Basil Bourque
Anda pasti bermaksud var, bukan val.
Basil Bourque
0
Fungsi getrelativeDateTime akan memberi Anda waktu tanggal seperti yang Anda lihat di pemberitahuan Whatsapp.
Untuk mendapatkan Waktu Tanggal relatif relatif, tambahkan ketentuan untuk itu. Ini dibuat khusus untuk mendapatkan Waktu Tanggal seperti notifikasi Whatsapp.
Terima kasih telah mau berkontribusi. Bukan apa yang diminta, tapi mungkin seseorang bisa menggunakannya. Baik itu seseorang atau siapa pun seharusnya tidak ingin menggunakan SimpleDateFormatdan Calendar. Kelas-kelas itu dirancang dengan buruk dan sudah usang. Alih-alih membaca jawaban yang menggunakan java.time, API tanggal dan waktu Java modern.
Ole VV
0
Untuk kurangnya kesederhanaan dan respons yang diperbarui, ikuti Java 8 yang lebih baru dan di luar versi
Jawaban:
Lihatlah perpustakaan PrettyTime .
Cukup mudah digunakan:
Anda juga dapat mengirimkan lokal untuk pesan yang diinternasionalkan:
Seperti disebutkan dalam komentar, Android memiliki fungsi ini dibangun ke dalam
android.text.format.DateUtils
kelas.sumber
Sudahkah Anda mempertimbangkan TimeUnit enum? Ini bisa sangat berguna untuk hal semacam ini
sumber
Saya menerima jawaban RealHowTo dan Ben J dan membuat versi saya sendiri:
yang akan mencetak yang berikut ini
sumber
.append(temp != 1 ? "s" : "")
sebagai ganti.append(temp > 1 ? "s" : "")
karena 0 juga harus memilikis
akhiranmore @ Memformat durasi dalam milidetik menjadi format yang dapat dibaca manusia
sumber
Ini didasarkan pada jawaban RealHowTo, jadi jika Anda menyukainya, berikan juga cinta padanya.
Versi pembersihan ini memungkinkan Anda menentukan rentang waktu yang mungkin menarik bagi Anda.
Ini juga menangani bagian "dan" sedikit berbeda. Saya sering menemukan ketika bergabung dengan string dengan pembatas lebih mudah untuk melewati logika yang rumit dan hanya menghapus pembatas terakhir ketika Anda selesai.
Kode kecil untuk mengubahnya:
Yang akan menampilkan sebagai berikut:
Dan kalau-kalau ada yang pernah membutuhkannya, inilah kelas yang akan mengubah string apa pun seperti di atas kembali menjadi milidetik . Ini cukup berguna untuk memungkinkan orang menentukan batas waktu berbagai hal dalam teks yang dapat dibaca.
sumber
ada cara sederhana untuk melakukan ini:
katakanlah Anda menginginkan waktu 20 menit yang lalu:
itu dia..
sumber
Tentang built-in solusi:
Java tidak memiliki dukungan bawaan untuk memformat waktu relatif, juga bukan Java-8 dan paket barunya
java.time
. Jika Anda hanya membutuhkan bahasa Inggris dan bukan yang lain, maka hanya dengan itu solusi buatan tangan mungkin dapat diterima - lihat jawaban @RealHowTo (walaupun memiliki kelemahan kuat untuk tidak memperhitungkan zona waktu untuk terjemahan delta instan ke waktu lokal) unit!). Lagi pula, jika Anda ingin menghindari solusi kompleks buatan sendiri terutama untuk lokal lain maka Anda memerlukan perpustakaan eksternal.Dalam kasus terakhir, saya sarankan untuk menggunakan perpustakaan saya Time4J (atau Time4A di Android). Ini menawarkan fleksibilitas terbesar dan sebagian besar daya i18n . Kelas net.time4j.PrettyTime memiliki tujuh metode
printRelativeTime...(...)
untuk tujuan ini. Contoh menggunakan jam tes sebagai sumber waktu:Contoh lain menggunakan
java.time.Instant
input:Perpustakaan ini mendukung melalui versi terbarunya (v4.17) 80 bahasa dan juga beberapa lokal negara tertentu (terutama untuk Spanyol, Inggris, Arab, Perancis). Data i18n terutama didasarkan pada versi CLDR-versi terbaru . Alasan penting lainnya mengapa menggunakan perpustakaan ini adalah dukungan yang baik untuk aturan jamak (yang sering berbeda dari bahasa Inggris di tempat lain), gaya format yang disingkat (misalnya: "1 detik yang lalu") dan cara-cara ekspresif untuk memperhitungkan zona waktu akun . Time4J bahkan menyadari detail eksotis seperti seperti lompatan detik dalam perhitungan waktu relatif (tidak terlalu penting tetapi membentuk pesan terkait dengan horizon harapan). The kompatibilitas dengan Java-8ada karena metode konversi yang mudah tersedia untuk jenis suka
java.time.Instant
ataujava.time.Period
.Apakah ada kekurangan? Hanya dua.
Alternatif (kompak):
Jika Anda mencari solusi yang lebih kecil dan tidak memerlukan banyak fitur dan bersedia mentolerir masalah kualitas yang mungkin terkait dengan i18n-data maka:
Saya akan merekomendasikan ocpsoft / PrettyTime (dukungan untuk sebenarnya 32 bahasa (segera 34?) Cocok untuk bekerja dengan
java.util.Date
hanya - lihat jawaban @ ataylor). CLDR standar industri (dari konsorsium Unicode) dengan latar belakang komunitas yang besar sayangnya bukan basis dari i18n-data sehingga peningkatan lebih lanjut atau perbaikan data ...Jika Anda menggunakan Android, maka helper class android.text.format.DateUtils adalah alternatif bawaan yang ramping (lihat komentar dan jawaban lain di sini, dengan kerugian karena tidak memiliki dukungan selama bertahun-tahun. Dan saya yakin hanya sangat sedikit orang menyukai gaya API dari kelas pembantu ini.
Jika Anda adalah penggemar Joda-Time maka Anda dapat melihat kelasnya PeriodFormat (dukungan untuk 14 bahasa dalam rilis v2.9.4, di sisi lain: Joda-Time pasti tidak kompak juga, jadi saya sebutkan di sini hanya untuk kelengkapan). Perpustakaan ini bukan jawaban nyata karena waktu relatif tidak didukung sama sekali. Anda harus menambahkan literal "lalu" setidaknya (dan secara manual melepaskan semua unit yang lebih rendah dari format daftar yang dihasilkan - canggung). Tidak seperti Time4J atau Android-DateUtils, ia tidak memiliki dukungan khusus untuk singkatan atau perpindahan otomatis dari waktu relatif ke representasi waktu absolut. Seperti PrettyTime, itu sepenuhnya bergantung pada kontribusi yang tidak dikonfirmasi dari anggota pribadi komunitas Java ke data i18n-nya.
sumber
Jika Anda mencari "Hari Ini" yang sederhana, "Kemarin" atau "x hari yang lalu".
sumber
waktu java
Menggunakan kerangka java.time dibangun ke dalam Java 8 dan yang lebih baru.
sumber
Duration
Metode - metode tersebut melaporkan seluruh durasi sebagai jumlah total jam dan total jumlah menit. Di Java 8 kelas anehnya tidak memiliki metode untuk mendapatkan setiap bagian dari jam dan menit dan detik. Java 9 membawa metode tersebutto…Part
,.Saya membuat porta Java timeago sederhana dari plug-in jquery-timeago yang melakukan apa yang Anda minta.
sumber
Jika Anda mengembangkan aplikasi untuk Android, ia menyediakan kelas utilitas DateUtils untuk semua persyaratan tersebut. Lihatlah metode utilitas DateUtils # getRelativeTimeSpanString () .
Dari dokumen untuk
CharSequence getRelativeTimeSpanString (lama, lama sekarang, penyelesaian panjang)
Anda akan melewati Anda
timestamp
sebagai waktu danSystem.currentTimeMillis()
sebagai sekarang . TheminResolution
memungkinkan Anda menentukan jangka waktu yang minimum untuk melaporkan.sumber
Anda dapat menggunakan fungsi ini untuk menghitung waktu lalu
1) Di sini time_ago dalam mikrodetik
sumber
Berdasarkan banyak jawaban di sini, saya membuat yang berikut untuk use case saya.
Contoh penggunaan:
sumber
Paket joda-waktu , memiliki gagasan tentang Periode . Anda dapat melakukan aritmatika dengan Periode dan Tanggal Waktu.
Dari dokumen :
sumber
Ini tidak cantik ... tapi yang paling dekat yang bisa saya pikirkan adalah menggunakan Joda-Time (seperti yang dijelaskan dalam posting ini: Bagaimana cara menghitung waktu yang berlalu dari sekarang dengan Joda Time?
sumber
Ini adalah kode yang lebih baik jika kita mempertimbangkan kinerja. Ini mengurangi jumlah perhitungan. Alasan Menit dihitung hanya jika jumlah detik lebih besar dari 60 dan Jam dihitung hanya jika jumlah menit lebih besar dari 60 dan seterusnya ...
sumber
waktu java
The Answer Habsq memiliki ide yang tepat tetapi metode yang salah.
Untuk rentang waktu yang tidak terikat ke timeline pada skala tahun-bulan-hari, gunakan
Period
. Untuk hari yang berarti potongan waktu 24 jam yang tidak terkait dengan kalender dan jam-menit-detik, gunakanDuration
. Mencampur dua skala jarang masuk akal.Duration
Mulailah dengan mengambil momen saat ini seperti yang terlihat di UTC , menggunakan
Instant
kelas.Hasilkan teks selama berjam-jam, menit, dan detik.
Dump ke konsol.
Period
Mulailah dengan mendapatkan tanggal saat ini.
Zona waktu sangat penting dalam menentukan tanggal. Untuk setiap saat, tanggal bervariasi di seluruh dunia berdasarkan zona. Sebagai contoh, beberapa menit setelah tengah malam di Paris, Perancis adalah hari yang baru ketika masih "kemarin" di Montréal Québec .
Jika tidak ada zona waktu yang ditentukan, JVM secara implisit menerapkan zona waktu default saat ini. Default itu dapat berubah kapan saja selama runtime (!), Sehingga hasil Anda dapat bervariasi. Lebih baik menentukan zona waktu yang diinginkan / diharapkan secara eksplisit sebagai argumen. Jika kritis, konfirmasikan zona dengan pengguna Anda.
Tentukan nama zona waktu yang tepat dalam format
Continent/Region
, sepertiAmerica/Montreal
,Africa/Casablanca
, atauPacific/Auckland
. Jangan pernah menggunakan singkatan 2-4 huruf sepertiEST
atauIST
karena mereka bukan zona waktu yang sebenarnya, tidak terstandarisasi, dan bahkan tidak unik (!).Buat kembali tanggal delapan hari, bulan, dan tahun lalu.
Hitung waktu yang telah berlalu.
Buat string potongan "waktu lalu".
Dump ke konsol.
Tentang java.time
The java.time kerangka dibangun ke Jawa 8 dan kemudian. Kelas-kelas ini menggantikan tua merepotkan warisan kelas tanggal-waktu seperti
java.util.Date
,Calendar
, &SimpleDateFormat
.Untuk mempelajari lebih lanjut, lihat Tutorial Oracle . Dan cari Stack Overflow untuk banyak contoh dan penjelasan. Spesifikasi adalah JSR 310 .
Proyek Joda-Time , sekarang dalam mode pemeliharaan , menyarankan migrasi ke kelas java.time .
Anda dapat bertukar objek java.time secara langsung dengan database Anda. Gunakan driver JDBC yang sesuai dengan JDBC 4.2 atau yang lebih baru. Tidak perlu untuk string, tidak perlu
java.sql.*
kelas.Di mana mendapatkan kelas java.time?
Proyek ThreeTen-Extra memperpanjang java.time dengan kelas tambahan. Proyek ini adalah ajang pembuktian untuk kemungkinan penambahan masa depan ke java.time. Anda mungkin menemukan beberapa kelas berguna di sini seperti
Interval
,YearWeek
,YearQuarter
, dan lebih .sumber
Setelah penelitian panjang saya menemukan ini.
sumber
Untuk Android Persis seperti yang dikatakan Ravi, tetapi karena banyak orang ingin hanya menyalin tempel benda itu di sini.
Penjelasan untuk orang yang memiliki lebih banyak waktu
Ex. Saya mendapatkan data dari server dalam format Rabu, 27 Jan 2016 09:32:35 GMT [ini mungkin BUKAN kasus Anda]
ini diterjemahkan ke dalam
SimpleDateFormat formatter = new SimpleDateFormat ("EEE, dd MMM yyyy HH: mm: ss Z");
bagaimana saya tahu itu Baca dokumentasi di sini.
Kemudian setelah saya uraikan, saya mendapat kencan. tanggal itu saya masukkan ke getRelativeTimeSpanString (tanpa parameter tambahan apa-apa oleh saya, menjadi default ke menit)
Anda AKAN mendapatkan pengecualian jika Anda tidak mengetahui String parsing yang benar , Sesuatu seperti: exception pada karakter 5 . Lihatlah karakter 5, dan koreksi string parsing awal Anda. . Anda mungkin mendapatkan pengecualian lain, ulangi langkah ini sampai Anda memiliki formula yang benar.
sumber
}
Panggilan
val String = timeAgo (unixTimeStamp)
untuk mendapatkan waktu lalu di Kotlin
sumber
Berikut ini adalah Implementasi Java saya ini
sumber
ini bekerja untuk saya
sumber
Ini adalah naskah yang sangat mendasar. mudah untuk diimprovisasi.
Hasil: (XXX Jam Lalu), atau (XX Hari Lalu / Kemarin / Hari Ini)
sumber
untuk ini saya sudah melakukan
Just Now, seconds ago, min ago, hrs ago, days ago, weeks ago, months ago, years ago
dalam contoh ini Anda dapat mengurai tanggal seperti2018-09-05T06:40:46.183Z
ini atau yang lain seperti di bawah initambahkan nilai di bawah ini di string.xml
coba kode java di bawah ini
sumber
Anda dapat menggunakan Java's Library RelativeDateTimeFormatter , itu tidak persis seperti itu:
sumber
Saya menggunakan Instant, Date and DateTimeUtils. Data (tanggal) yang disimpan dalam database dalam bentuk String dan kemudian dikonversi menjadi Instan.
sumber
Solusi berikut semuanya dalam Java murni:
Opsi 1: Tidak ada pembulatan dan satu-satunya wadah waktu terbesar
Fungsi berikut hanya akan menampilkan wadah waktu terbesar, misalnya, jika waktu yang sebenarnya berlalu
"1 month 14 days ago"
, fungsi ini hanya akan menampilkan"1 month ago"
. Fungsi ini juga akan selalu dibulatkan ke bawah, sehingga waktu yang setara dengan"50 days ago"
akan ditampilkan sebagai"1 month"
Opsi 2: Dengan pembulatan
Cukup bungkus wadah waktu yang ingin Anda bundar dengan pernyataan Math.round (...), jadi jika Anda ingin membulatkannya
50 days
ke2 months
, modifikasilong months = days / 30
kelong months = Math.round(days / 30.0)
sumber
Duration
denganto…Part
metodenya akan jauh lebih mudah, seperti yang ditunjukkan pada Jawaban saya .Ini adalah test case saya, semoga membantu:
sumber
Calendar
digantikan tahun yang lalu oleh kelas java.time modern dengan adopsi JSR 310 . Nasehat yang buruk pada tahun 2019.var
, bukanval
.Fungsi getrelativeDateTime akan memberi Anda waktu tanggal seperti yang Anda lihat di pemberitahuan Whatsapp.
Untuk mendapatkan Waktu Tanggal relatif relatif, tambahkan ketentuan untuk itu. Ini dibuat khusus untuk mendapatkan Waktu Tanggal seperti notifikasi Whatsapp.
sumber
SimpleDateFormat
danCalendar
. Kelas-kelas itu dirancang dengan buruk dan sudah usang. Alih-alih membaca jawaban yang menggunakan java.time, API tanggal dan waktu Java modern.Untuk kurangnya kesederhanaan dan respons yang diperbarui, ikuti Java 8 yang lebih baru dan di luar versi
Ini adalah versi yang menggunakan Java Time API yang mencoba menyelesaikan masalah dari masa lalu untuk berurusan dengan Tanggal dan Waktu.
Javadoc
versi 8 https://docs.oracle.com/javase/8/docs/api/index.html?java/time/package-summary.html
versi 11 https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/time/package-summary.html
W3Schools Tutorial - https://www.w3schools.com/java/java_date.asp
Artikel DZone - https://dzone.com/articles/java-8-date-and-time
sumber