Bagaimana cara menghitung "waktu lalu" di Jawa?


127

Di Ruby on Rails, ada fitur yang memungkinkan Anda mengambil Tanggal apa pun dan mencetak berapa "dulu" itu.

Sebagai contoh:

8 minutes ago
8 hours ago
8 days ago
8 months ago
8 years ago

Apakah ada cara mudah untuk melakukan ini di Jawa?


1
Lihat: stackoverflow.com/questions/11/how-do-i-calculate-relative-time Ini adalah C #, tapi saya yakin Anda dapat mengubahnya dengan sedikit kesulitan.
Brandon

Jawaban:


177

Lihatlah perpustakaan PrettyTime .

Cukup mudah digunakan:

import org.ocpsoft.prettytime.PrettyTime;

PrettyTime p = new PrettyTime();
System.out.println(p.format(new Date()));
// prints "moments ago"

Anda juga dapat mengirimkan lokal untuk pesan yang diinternasionalkan:

PrettyTime p = new PrettyTime(new Locale("fr"));
System.out.println(p.format(new Date()));
// prints "à l'instant"

Seperti disebutkan dalam komentar, Android memiliki fungsi ini dibangun ke dalam android.text.format.DateUtilskelas.


229
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 = new SimpleDateFormat("dd/MM/yyyy");
        Date past = format.parse("01/10/2010");
        Date now = new Date();

        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();
    }

4
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:

public class TimeAgo {
public static final List<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) );
public static final List<String> timesString = Arrays.asList("year","month","day","hour","minute","second");

public static String toDuration(long duration) {

    StringBuffer res = new StringBuffer();
    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";
    else
        return res.toString();
}
public static void 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
Riccardo Casatta

42
  public class TimeUtils {

      public final static long ONE_SECOND = 1000;
      public final static long SECONDS = 60;

      public final static long ONE_MINUTE = ONE_SECOND * 60;
      public final static long MINUTES = 60;

      public final static long ONE_HOUR = ONE_MINUTE * 60;
      public final static long HOURS = 24;

      public final static long ONE_DAY = ONE_HOUR * 24;

      private TimeUtils() {
      }

      /**
       * converts time (in milliseconds) to human-readable format
       *  "<w> days, <x> hours, <y> minutes and (z) seconds"
       */
      public static String millisToLongDHMS(long duration) {
        StringBuffer res = new StringBuffer();
        long temp = 0;
        if (duration >= ONE_SECOND) {
          temp = duration / ONE_DAY;
          if (temp > 0) {
            duration -= temp * ONE_DAY;
            res.append(temp).append(" day").append(temp > 1 ? "s" : "")
               .append(duration >= ONE_MINUTE ? ", " : "");
          }

          temp = duration / ONE_HOUR;
          if (temp > 0) {
            duration -= temp * ONE_HOUR;
            res.append(temp).append(" hour").append(temp > 1 ? "s" : "")
               .append(duration >= ONE_MINUTE ? ", " : "");
          }

          temp = duration / ONE_MINUTE;
          if (temp > 0) {
            duration -= temp * ONE_MINUTE;
            res.append(temp).append(" minute").append(temp > 1 ? "s" : "");
          }

          if (!res.toString().equals("") && duration >= ONE_SECOND) {
            res.append(" and ");
          }

          temp = duration / ONE_SECOND;
          if (temp > 0) {
            res.append(temp).append(" second").append(temp > 1 ? "s" : "");
          }
          return res.toString();
        } else {
          return "0 second";
        }
      }


      public static void main(String args[]) {
        System.out.println(millisToLongDHMS(123));
        System.out.println(millisToLongDHMS((5 * ONE_SECOND) + 123));
        System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR));
        System.out.println(millisToLongDHMS(ONE_DAY + 2 * ONE_SECOND));
        System.out.println(millisToLongDHMS(ONE_DAY + ONE_HOUR + (2 * ONE_MINUTE)));
        System.out.println(millisToLongDHMS((4 * ONE_DAY) + (3 * ONE_HOUR)
            + (2 * ONE_MINUTE) + ONE_SECOND));
        System.out.println(millisToLongDHMS((5 * ONE_DAY) + (4 * ONE_HOUR)
            + ONE_MINUTE + (23 * ONE_SECOND) + 123));
        System.out.println(millisToLongDHMS(42 * ONE_DAY));
        /*
          output :
                0 second
                5 seconds
                1 day, 1 hour
                1 day and 2 seconds
                1 day, 1 hour, 2 minutes
                4 days, 3 hours, 2 minutes and 1 second
                5 days, 4 hours, 1 minute and 23 seconds
                42 days
         */
    }
}

more @ Memformat durasi dalam milidetik menjadi format yang dapat dibaca manusia


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;
import static java.util.concurrent.TimeUnit.MILLISECONDS;

public class TimeUtils {

    /**
     * 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
     */
    public static String formatMillis(long duration, TimeUnit max, TimeUnit min) {
        StringBuilder res = new StringBuilder();

        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 about
        if (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();
    }
}

Kode kecil untuk mengubahnya:

import static java.util.concurrent.TimeUnit.*;

public class Main {

    public static void main(String args[]) {
        long[] durations = new long[]{
            123,
            SECONDS.toMillis(5) + 123,
            DAYS.toMillis(1) + HOURS.toMillis(1),
            DAYS.toMillis(1) + SECONDS.toMillis(2),
            DAYS.toMillis(1) + HOURS.toMillis(1) + MINUTES.toMillis(2),
            DAYS.toMillis(4) + HOURS.toMillis(3) + MINUTES.toMillis(2) + SECONDS.toMillis(1),
            DAYS.toMillis(5) + HOURS.toMillis(4) + MINUTES.toMillis(1) + SECONDS.toMillis(23) + 123,
            DAYS.toMillis(42)
        };

        for (long duration : durations) {
            System.out.println(TimeUtils.formatMillis(duration, DAYS, SECONDS));
        }

        System.out.println("\nAgain in only hours and minutes\n");

        for (long duration : durations) {
            System.out.println(TimeUtils.formatMillis(duration, HOURS, MINUTES));
        }
    }

}

Yang akan menampilkan sebagai berikut:

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.


9

ada cara sederhana untuk melakukan ini:

katakanlah Anda menginginkan waktu 20 menit yang lalu:

Long minutesAgo = new Long(20);
Date date = new Date();
Date dateIn_X_MinAgo = new Date (date.getTime() - minutesAgo*60*1000);

itu dia..


1
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 input
String durationInDays =
  PrettyTime.of(Locale.GERMAN).withReferenceClock(clock).printRelative(
    moment,
    Timezone.of(EUROPE.BERLIN),
    TimeUnit.DAYS); // controlling the precision
System.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.


5

Jika Anda mencari "Hari Ini" yang sederhana, "Kemarin" atau "x hari yang lalu".

private String getDaysAgo(Date date){
    long days = (new Date().getTime() - date.getTime()) / 86400000;

    if(days == 0) return "Today";
    else if(days == 1) return "Yesterday";
    else return days + " days ago";
}

5

waktu java

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");

1
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,.
Basil Bourque

4

Saya membuat porta Java timeago sederhana dari plug-in jquery-timeago yang melakukan apa yang Anda minta.

TimeAgo time = new TimeAgo();
String minutes = time.timeAgo(System.currentTimeMillis() - (15*60*1000)); // returns "15 minutes ago"

4

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)

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.


4

Anda dapat menggunakan fungsi ini untuk menghitung waktu lalu

 private String timeAgo(long time_ago) {
        long cur_time = (Calendar.getInstance().getTimeInMillis()) / 1000;
        long time_elapsed = cur_time - time_ago;
        long seconds = time_elapsed;
        int minutes = Math.round(time_elapsed / 60);
        int hours = Math.round(time_elapsed / 3600);
        int days = Math.round(time_elapsed / 86400);
        int weeks = Math.round(time_elapsed / 604800);
        int months = Math.round(time_elapsed / 2600640);
        int years = Math.round(time_elapsed / 31207680);

        // Seconds
        if (seconds <= 60) {
            return "just now";
        }
        //Minutes
        else if (minutes <= 60) {
            if (minutes == 1) {
                return "one minute ago";
            } else {
                return minutes + " minutes ago";
            }
        }
        //Hours
        else if (hours <= 24) {
            if (hours == 1) {
                return "an hour ago";
            } else {
                return hours + " hrs ago";
            }
        }
        //Days
        else if (days <= 7) {
            if (days == 1) {
                return "yesterday";
            } else {
                return days + " days ago";
            }
        }
        //Weeks
        else if (weeks <= 4.3) {
            if (weeks == 1) {
                return "a week ago";
            } else {
                return weeks + " weeks ago";
            }
        }
        //Months
        else if (months <= 12) {
            if (months == 1) {
                return "a month ago";
            } else {
                return months + " months ago";
            }
        }
        //Years
        else {
            if (years == 1) {
                return "one year ago";
            } else {
                return years + " years ago";
            }
        }
    }

1) Di sini time_ago dalam mikrodetik


4

Berdasarkan banyak jawaban di sini, saya membuat yang berikut untuk use case saya.

Contoh penggunaan:

String relativeDate = String.valueOf(
                TimeUtils.getRelativeTime( 1000L * myTimeInMillis() ));

import java.util.Arrays;
import java.util.List;

import static java.util.concurrent.TimeUnit.DAYS;
import static java.util.concurrent.TimeUnit.HOURS;
import static java.util.concurrent.TimeUnit.MINUTES;
import static java.util.concurrent.TimeUnit.SECONDS;

/**
 * Utilities for dealing with dates and times
 */
public class TimeUtils {

    public static final List<Long> times = Arrays.asList(
        DAYS.toMillis(365),
        DAYS.toMillis(30),
        DAYS.toMillis(7),
        DAYS.toMillis(1),
        HOURS.toMillis(1),
        MINUTES.toMillis(1),
        SECONDS.toMillis(1)
    );

    public static final List<String> timesString = Arrays.asList(
        "yr", "mo", "wk", "day", "hr", "min", "sec"
    );

    /**
     * Get relative time ago for date
     *
     * NOTE:
     *  if (duration > WEEK_IN_MILLIS) getRelativeTimeSpanString prints the date.
     *
     * ALT:
     *  return getRelativeTimeSpanString(date, now, SECOND_IN_MILLIS, FORMAT_ABBREV_RELATIVE);
     *
     * @param date String.valueOf(TimeUtils.getRelativeTime(1000L * Date/Time in Millis)
     * @return relative time
     */
    public static CharSequence getRelativeTime(final long date) {
        return toDuration( Math.abs(System.currentTimeMillis() - date) );
    }

    private static String toDuration(long duration) {
        StringBuilder sb = new StringBuilder();
        for(int i=0;i< times.size(); i++) {
            Long current = times.get(i);
            long temp = duration / current;
            if (temp > 0) {
                sb.append(temp)
                  .append(" ")
                  .append(timesString.get(i))
                  .append(temp > 1 ? "s" : "")
                  .append(" ago");
                break;
            }
        }
        return sb.toString().isEmpty() ? "now" : sb.toString();
    }
}

Ini sangat berguna, Terima kasih banyak.
Haya Akkad

3

Paket joda-waktu , memiliki gagasan tentang Periode . Anda dapat melakukan aritmatika dengan Periode dan Tanggal Waktu.

Dari dokumen :

public boolean isRentalOverdue(DateTime datetimeRented) {
  Period rentalPeriod = new  Period().withDays(2).withHours(12);
  return datetimeRented.plus(rentalPeriod).isBeforeNow();
}


2

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 ...

class timeAgo {

static String getTimeAgo(long time_ago) {
    time_ago=time_ago/1000;
    long cur_time = (Calendar.getInstance().getTimeInMillis())/1000 ;
    long time_elapsed = cur_time - time_ago;
    long seconds = time_elapsed;
   // Seconds
    if (seconds <= 60) {
        return "Just now";
    }
    //Minutes
    else{
        int minutes = Math.round(time_elapsed / 60);

        if (minutes <= 60) {
            if (minutes == 1) {
                return "a minute ago";
            } else {
                return minutes + " minutes ago";
            }
        }
        //Hours
        else {
            int hours = Math.round(time_elapsed / 3600);
            if (hours <= 24) {
                if (hours == 1) {
                    return "An hour ago";
                } else {
                    return hours + " hrs ago";
                }
            }
            //Days
            else {
                int days = Math.round(time_elapsed / 86400);
                if (days <= 7) {
                    if (days == 1) {
                        return "Yesterday";
                    } else {
                        return days + " days ago";
                    }
                }
                //Weeks
                else {
                    int weeks = Math.round(time_elapsed / 604800);
                    if (weeks <= 4.3) {
                        if (weeks == 1) {
                            return "A week ago";
                        } else {
                            return weeks + " weeks ago";
                        }
                    }
                    //Months
                    else {
                        int months = Math.round(time_elapsed / 2600640);
                        if (months <= 12) {
                            if (months == 1) {
                                return "A month ago";
                            } else {
                                return months + " months ago";
                            }
                        }
                        //Years
                        else {
                            int years = Math.round(time_elapsed / 31207680);
                            if (years == 1) {
                                return "One year ago";
                            } else {
                                return years + " years ago";
                            }
                        }
                    }
                }
            }
        }
    }

}

}

1
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 );

Dari: 2019-06-04T11: 53: 55.714965Z ke: 2019-06-04T20: 02: 03.714965Z

8 jam yang lalu

8 menit yang lalu

8 detik yang lalu

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, 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 );

Dari: 2010-09-27 ke: 2019-06-04

8 hari yang lalu

8 bulan yang lalu

8 tahun yang lalu


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 perlujava.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 .


Terima kasih banyak!
Ticherhaz

1

Setelah penelitian panjang saya menemukan ini.

    public class GetTimeLapse {
    public static String getlongtoago(long createdAt) {
        DateFormat userDateFormat = new SimpleDateFormat("E MMM dd HH:mm:ss Z yyyy");
        DateFormat dateFormatNeeded = new SimpleDateFormat("MM/dd/yyyy HH:MM:SS");
        Date date = null;
        date = new Date(createdAt);
        String crdate1 = dateFormatNeeded.format(date);

        // Date Calculation
        DateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
        crdate1 = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss").format(date);

        // get current date time with Calendar()
        Calendar cal = Calendar.getInstance();
        String currenttime = dateFormat.format(cal.getTime());

        Date CreatedAt = 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;
    }
}

1

Untuk Android Persis seperti yang dikatakan Ravi, tetapi karena banyak orang ingin hanya menyalin tempel benda itu di sini.

  try {
      SimpleDateFormat formatter = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
      Date dt = formatter.parse(date_from_server);
      CharSequence output = DateUtils.getRelativeTimeSpanString (dt.getTime());
      your_textview.setText(output.toString());
    } catch (Exception ex) {
      ex.printStackTrace();
      your_textview.setText("");
    }

Penjelasan untuk orang yang memiliki lebih banyak waktu

  1. Anda mendapatkan data dari suatu tempat. Pertama, Anda harus mencari tahu formatnya.

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.


1
private const val SECOND_MILLIS = 1
private const val MINUTE_MILLIS = 60 * SECOND_MILLIS
private const val HOUR_MILLIS = 60 * MINUTE_MILLIS
private const val DAY_MILLIS = 24 * HOUR_MILLIS

object TimeAgo {

fun timeAgo(time: Int): String {

    val now = TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis())
    if (time > now || time <= 0) {
        return "in the future"
    }

    val diff = now - time
    return when {
        diff < MINUTE_MILLIS -> "Just now"
        diff < 2 * MINUTE_MILLIS -> "a minute ago"
        diff < 60 * MINUTE_MILLIS -> "${diff / MINUTE_MILLIS} minutes ago"
        diff < 2 * HOUR_MILLIS -> "an hour ago"
        diff < 24 * HOUR_MILLIS -> "${diff / HOUR_MILLIS} hours ago"
        diff < 48 * HOUR_MILLIS -> "yesterday"
        else -> "${diff / DAY_MILLIS} days ago"
    }
}

}

Panggilan

val String = timeAgo (unixTimeStamp)

untuk mendapatkan waktu lalu di Kotlin


0

Berikut ini adalah Implementasi Java saya ini

    public static String relativeDate(Date date){
    Date now=new Date();
    if(date.before(now)){
    int days_passed=(int) TimeUnit.MILLISECONDS.toDays(now.getTime() - date.getTime());
    if(days_passed>1)return days_passed+" days ago";
    else{
        int hours_passed=(int) TimeUnit.MILLISECONDS.toHours(now.getTime() - date.getTime());
        if(hours_passed>1)return days_passed+" hours ago";
        else{
            int minutes_passed=(int) TimeUnit.MILLISECONDS.toMinutes(now.getTime() - date.getTime());
            if(minutes_passed>1)return minutes_passed+" minutes ago";
            else{
                int seconds_passed=(int) TimeUnit.MILLISECONDS.toSeconds(now.getTime() - date.getTime());
                return seconds_passed +" seconds ago";
            }
        }
    }

    }
    else
    {
        return new SimpleDateFormat("HH:mm:ss MM/dd/yyyy").format(date).toString();
    }
  }

0

ini bekerja untuk saya

public class TimeDifference {
    int years;
    int months;
    int days;
    int hours;
    int minutes;
    int seconds;
    String differenceString;

    public TimeDifference(@NonNull Date curdate, @NonNull Date olddate) {

        float diff = curdate.getTime() - olddate.getTime();
        if (diff >= 0) {
            int yearDiff = Math.round((diff / (AppConstant.aLong * AppConstant.aFloat)) >= 1 ? (diff / (AppConstant.aLong * AppConstant.aFloat)) : 0);
            if (yearDiff > 0) {
                years = yearDiff;
                setDifferenceString(years + (years == 1 ? " year" : " years") + " ago");
            } else {
                int monthDiff = Math.round((diff / AppConstant.aFloat) >= 1 ? (diff / AppConstant.aFloat) : 0);
                if (monthDiff > 0) {
                    if (monthDiff > AppConstant.ELEVEN) {
                        monthDiff = AppConstant.ELEVEN;
                    }
                    months = monthDiff;
                    setDifferenceString(months + (months == 1 ? " month" : " months") + " ago");
                } else {
                    int dayDiff = Math.round((diff / (AppConstant.bFloat)) >= 1 ? (diff / (AppConstant.bFloat)) : 0);
                    if (dayDiff > 0) {
                        days = dayDiff;
                        if (days == AppConstant.THIRTY) {
                            days = AppConstant.TWENTYNINE;
                        }
                        setDifferenceString(days + (days == 1 ? " day" : " days") + " ago");
                    } else {
                        int hourDiff = Math.round((diff / (AppConstant.cFloat)) >= 1 ? (diff / (AppConstant.cFloat)) : 0);
                        if (hourDiff > 0) {
                            hours = hourDiff;
                            setDifferenceString(hours + (hours == 1 ? " hour" : " hours") + " ago");
                        } else {
                            int minuteDiff = Math.round((diff / (AppConstant.dFloat)) >= 1 ? (diff / (AppConstant.dFloat)) : 0);
                            if (minuteDiff > 0) {
                                minutes = minuteDiff;
                                setDifferenceString(minutes + (minutes == 1 ? " minute" : " minutes") + " ago");
                            } else {
                                int secondDiff = Math.round((diff / (AppConstant.eFloat)) >= 1 ? (diff / (AppConstant.eFloat)) : 0);
                                if (secondDiff > 0) {
                                    seconds = secondDiff;
                                } else {
                                    seconds = 1;
                                }
                                setDifferenceString(seconds + (seconds == 1 ? " second" : " seconds") + " ago");
                            }
                        }
                    }

                }
            }

        } else {
            setDifferenceString("Just now");
        }

    }

    public String getDifferenceString() {
        return differenceString;
    }

    public void setDifferenceString(String differenceString) {
        this.differenceString = differenceString;
    }

    public int getYears() {
        return years;
    }

    public void setYears(int years) {
        this.years = years;
    }

    public int getMonths() {
        return months;
    }

    public void setMonths(int months) {
        this.months = months;
    }

    public int getDays() {
        return days;
    }

    public void setDays(int days) {
        this.days = days;
    }

    public int getHours() {
        return hours;
    }

    public void setHours(int hours) {
        this.hours = hours;
    }

    public int getMinutes() {
        return minutes;
    }

    public void setMinutes(int minutes) {
        this.minutes = minutes;
    }

    public int getSeconds() {
        return seconds;
    }

    public void setSeconds(int seconds) {
        this.seconds = seconds;
    } }

0

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 = new Date('2017/6/9 00:01'); 
var now = new Date();
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";
} else if (days < 2) {
result = "Yesterday";
} else {
result = days + " Days ago";
}

document.getElementById("hourpost").innerHTML = hours + "Hours Ago" ;
document.getElementById("daypost").innerHTML = result ;
</script>

0

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

tambahkan nilai di bawah ini di string.xml

  <string name="lbl_justnow">Just Now</string>
    <string name="lbl_seconds_ago">seconds ago</string>
    <string name="lbl_min_ago">min ago</string>
    <string name="lbl_mins_ago">mins ago</string>
    <string name="lbl_hr_ago">hr ago</string>
    <string name="lbl_hrs_ago">hrs ago</string>
    <string name="lbl_day_ago">day ago</string>
    <string name="lbl_days_ago">days ago</string>
    <string name="lbl_lstweek_ago">last week</string>
    <string name="lbl_week_ago">weeks ago</string>
    <string name="lbl_onemonth_ago">1 month ago</string>
    <string name="lbl_month_ago">months ago</string>
    <string name="lbl_oneyear_ago" >last year</string>
    <string name="lbl_year_ago" >years ago</string>

coba kode java di bawah ini

  public String getFormatDate(String postTime1) {
        Calendar cal=Calendar.getInstance();
        Date now=cal.getTime();
        String disTime="";
        try {
            Date postTime;
            //2018-09-05T06:40:46.183Z
            postTime = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'").parse(postTime1);

            long diff=(now.getTime()-postTime.getTime()+18000)/1000;

            //for months
            Calendar calObj = Calendar.getInstance();
            calObj.setTime(postTime);
            int m=calObj.get(Calendar.MONTH);
            calObj.setTime(now);

            SimpleDateFormat monthFormatter = new SimpleDateFormat("MM"); // output month

            int mNow = Integer.parseInt(monthFormatter.format(postTime));

            diff = diff-19800;

            if(diff<15) { //below 15 sec

                disTime = getResources().getString(R.string.lbl_justnow);
            } else if(diff<60) {

                //below 1 min
                disTime= diff+" "+getResources().getString(R.string.lbl_seconds_ago);
            } else if(diff<3600) {//below 1 hr

                // convert min
                long temp=diff/60;

                if(temp==1) {
                    disTime= temp + " " +getResources().getString(R.string.lbl_min_ago);
                } else {
                    disTime = temp  + " " +getResources().getString(R.string.lbl_mins_ago);
                }
            } else if(diff<(24*3600)) {// below 1 day

                // convert hr
                long temp= diff/3600;
                System.out.println("hey temp3:"+temp);
                if(temp==1) {
                    disTime = temp  + " " +getResources().getString(R.string.lbl_hr_ago);
                } else {
                    disTime = temp + " " +getResources().getString(R.string.lbl_hrs_ago);
                }
            } else if(diff<(24*3600*7)) {// below week

                // convert days
                long temp=diff/(3600*24);
                if (temp==1) {
                    //  disTime = "\nyesterday";
                    disTime = temp + " " +getResources().getString(R.string.lbl_day_ago);
                } else {
                    disTime = temp + " " +getResources().getString(R.string.lbl_days_ago);
                }
            } else if(diff<((24*3600*28))) {// below month

                // convert week
                long temp=diff/(3600*24*7);
                if (temp <= 4) {

                    if (temp < 1) {
                        disTime = getResources().getString(R.string.lbl_lstweek_ago);
                    }else{
                        disTime = temp + " " + getResources().getString(R.string.lbl_week_ago);
                    }

                } else {
                    int diffMonth = mNow - m;
                    Log.e("count : ", String.valueOf(diffMonth));
                    disTime = diffMonth + " " + getResources().getString(R.string.lbl_month_ago);
                }
            }else if(diff<((24*3600*365))) {// below year

                // convert month
                long temp=diff/(3600*24*30);

                System.out.println("hey temp2:"+temp);
                if (temp <= 12) {

                    if (temp == 1) {
                        disTime = getResources().getString(R.string.lbl_onemonth_ago);
                    }else{
                        disTime = temp + " " + getResources().getString(R.string.lbl_month_ago);
                    }
                }

            }else if(diff>((24*3600*365))) { // above year

                // convert year
                long temp=diff/(3600*24*30*12);

                System.out.println("hey temp8:"+temp);

                if (temp == 1) {
                    disTime = getResources().getString(R.string.lbl_oneyear_ago);
                }else{
                    disTime = temp + " " + getResources().getString(R.string.lbl_year_ago);
                }
            }

        } catch(Exception e) {
            e.printStackTrace();
        }

        return disTime;
    }

Jika Anda bekerja di Android, Anda dapat menggunakan ini: android.text.format.DateUtils.getRelativeTimeSpanString (milidetik)
Wajid Ali

0

Anda dapat menggunakan Java's Library RelativeDateTimeFormatter , itu tidak persis seperti itu:

RelativeDateTimeFormatter fmt = RelativeDateTimeFormatter.getInstance();
 fmt.format(1, Direction.NEXT, RelativeUnit.DAYS); // "in 1 day"
 fmt.format(3, Direction.NEXT, RelativeUnit.DAYS); // "in 3 days"
 fmt.format(3.2, Direction.LAST, RelativeUnit.YEARS); // "3.2 years ago"

 fmt.format(Direction.LAST, AbsoluteUnit.SUNDAY); // "last Sunday"
 fmt.format(Direction.THIS, AbsoluteUnit.SUNDAY); // "this Sunday"
 fmt.format(Direction.NEXT, AbsoluteUnit.SUNDAY); // "next Sunday"
 fmt.format(Direction.PLAIN, AbsoluteUnit.SUNDAY); // "Sunday"

 fmt.format(Direction.LAST, AbsoluteUnit.DAY); // "yesterday"
 fmt.format(Direction.THIS, AbsoluteUnit.DAY); // "today"
 fmt.format(Direction.NEXT, AbsoluteUnit.DAY); // "tomorrow"

 fmt.format(Direction.PLAIN, AbsoluteUnit.NOW); // "now"

1
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.
     */
    public String convertTimeToAgo(String dataDate) {
    //Initialize
    String conversionTime = null;
    String suffix = "Yang Lalu";
    Date pastTime;
    //Parse from String (which is stored as Instant.now().toString()
    //And then convert to become Date
    Instant instant = Instant.parse(dataDate);
    pastTime = DateTimeUtils.toDate(instant);

    //Today date
    Date nowTime = new Date();

    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;
    } else if (minute < 60) {
        conversionTime = minute + " Minit " + suffix;
    } else if (hour < 24) {
        conversionTime = hour + " Jam " + suffix;
    } else if (day >= 7) {
        if (day > 30) {
            conversionTime = (day / 30) + " Bulan " + suffix;
        } else if (day > 360) {
            conversionTime = (day / 360) + " Tahun " + suffix;
        } else {
            conversionTime = (day / 7) + " Minggu " + suffix;
        }
    } else if (day < 7) {
        conversionTime = day + " Hari " + suffix;
    }
    return conversionTime;
    }

1
Anda menggunakan kelas tanggal waktu lama yang mengerikan yang digantikan tahun yang lalu oleh kelas java.time .
Basil Bourque

@ BasilBourque Saya masih belum menemukan cara terbaru untuk melakukan ini.
Ticherhaz

@ BasilBourque Saya telah menambahkan beberapa kode untuk saya memahaminya. github.com/ticherhaz/tarikhmasa
Ticherhaz

0

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"

public String formatTimeAgo(long millis) {
        String[] ids = new String[]{"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 = new ArrayList<>(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)


1
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"
    }

1
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.

private static String getRelativeDateTime(long date) {
    SimpleDateFormat DateFormat = new SimpleDateFormat("MMM dd, yyyy", Locale.getDefault());
    SimpleDateFormat TimeFormat = new SimpleDateFormat(" hh:mm a", Locale.getDefault());
    long now = Calendar.getInstance().getTimeInMillis();
    long startOfDay = StartOfDay(Calendar.getInstance().getTime());
    String Day = "";
    String Time = "";
    long millSecInADay = 86400000;
    long oneHour = millSecInADay / 24;
    long differenceFromNow = now - date;

    if (date > startOfDay) {
        if (differenceFromNow < (oneHour)) {
            int minute = (int) (differenceFromNow / (60000));
            if (minute == 0) {
                int sec = (int) differenceFromNow / 1000;
                if (sec == 0) {
                    Time = "Just Now";
                } else if (sec == 1) {
                    Time = sec + " second ago";
                } else {
                    Time = sec + " seconds ago";
                }
            } else if (minute == 1) {
                Time = minute + " minute ago";
            } else if (minute < 60) {
                Time = minute + " minutes ago";
            }
        } else {
            Day = "Today, ";
        }
    } else if (date > (startOfDay - millSecInADay)) {
        Day = "Yesterday, ";
    } else if (date > (startOfDay - millSecInADay * 7)) {
        int days = (int) (differenceFromNow / millSecInADay);
        Day = days + " Days ago, ";
    } else {
        Day = DateFormat.format(date);
    }
    if (Time.isEmpty()) {
        Time = TimeFormat.format(date);
    }
    return Day + Time;
}

public static long StartOfDay(Date date) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTime(date);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    return calendar.getTimeInMillis();
}

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

import java.time.*;
import java.time.temporal.*;

public class Time {
    public static void main(String[] args) {

        System.out.println(LocalTime.now().minus(8, ChronoUnit.MINUTES));
        System.out.println(LocalTime.now().minus(8, ChronoUnit.HOURS));
        System.out.println(LocalDateTime.now().minus(8, ChronoUnit.DAYS));
        System.out.println(LocalDateTime.now().minus(8, ChronoUnit.MONTHS));
    }
}

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.