簡體   English   中英

我如何獲得 android 中兩個日期之間的差異?嘗試了所有事情並發布

[英]How do I get difference between two dates in android?, tried every thing and post

我看到了這里的所有帖子,但我仍然不知道如何區分兩個 android 日期。

這就是我所做的:

long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);

我得到:日期是 1970 年 1 月 1 日,兩個小時后的時間總是更長...我來自以色列,所以兩個小時是 timeOffset。

我怎樣才能得到正常的差異???

你接近正確的答案,你得到了這兩個日期之間的毫秒差異,但是當你試圖從這個差異中構造一個日期時,它假設你想要創建一個具有該差異值的新Date對象作為它的時代。 如果您正在尋找以小時為單位的時間,那么您只需要對該diff進行一些基本算術即可獲得不同的時間部分。

爪哇:

long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

科特林:

val diff: Long = date1.getTime() - date2.getTime()
val seconds = diff / 1000
val minutes = seconds / 60
val hours = minutes / 60
val days = hours / 24

所有這些數學運算都將簡單地進行整數運算,因此它會截斷任何小數點

    long diffInMillisec = date1.getTime() - date2.getTime();

    long diffInDays = TimeUnit.MILLISECONDS.toDays(diffInMillisec);
    long diffInHours = TimeUnit.MILLISECONDS.toHours(diffInMillisec);
    long diffInMin = TimeUnit.MILLISECONDS.toMinutes(diffInMillisec);
    long diffInSec = TimeUnit.MILLISECONDS.toSeconds(diffInMillisec);

一些補充:這里我將字符串轉換為日期,然后比較當前時間。

String toyBornTime = "2014-06-18 12:56:50";
    SimpleDateFormat dateFormat = new SimpleDateFormat(
            "yyyy-MM-dd HH:mm:ss");

    try {

        Date oldDate = dateFormat.parse(toyBornTime);
        System.out.println(oldDate);

        Date currentDate = new Date();

        long diff = currentDate.getTime() - oldDate.getTime();
        long seconds = diff / 1000;
        long minutes = seconds / 60;
        long hours = minutes / 60;
        long days = hours / 24;

        if (oldDate.before(currentDate)) {

            Log.e("oldDate", "is previous date");
            Log.e("Difference: ", " seconds: " + seconds + " minutes: " + minutes
                    + " hours: " + hours + " days: " + days);

        }

        // Log.e("toyBornTime", "" + toyBornTime);

    } catch (ParseException e) {

        e.printStackTrace();
    }

java.time.Duration

使用java.time.Duration

    Duration diff = Duration.between(instant2, instant1);
    System.out.println(diff);

這將打印類似

PT109H27M21S

這意味着一段 109 小時 27 分 21 秒的時間。 如果你想要一些更易讀的東西——我會先給出 Java 9 版本,這是最簡單的:

    String formattedDiff = String.format(Locale.ENGLISH,
            "%d days %d hours %d minutes %d seconds",
            diff.toDays(), diff.toHoursPart(), diff.toMinutesPart(), diff.toSecondsPart());
    System.out.println(formattedDiff);

現在我們得到

4 days 13 hours 27 minutes 21 seconds

Duration類是現代 Java 日期和時間 API 的java.time的一部分。 這捆綁在較新的 Android 設備上。 在舊設備上,獲取 ThreeTenABP 並將其添加到您的項目中,並確保從同一個包中導入org.threeten.bp.Duration和其他日期時間類。

假設您還沒有獲得 Java 9 版本,您可以依次減去較大的單位以獲得較小的單位:

    long days = diff.toDays();
    diff = diff.minusDays(days);
    long hours = diff.toHours();
    diff = diff.minusHours(hours);
    long minutes = diff.toMinutes();
    diff = diff.minusMinutes(minutes);
    long seconds = diff.toSeconds();

然后你可以像上面一樣格式化四個變量。

你做錯了什么?

Date代表一個時間點。 它從來就不是用來表示時間和持續時間的,它不適合它。 試圖使這項工作最多只會導致代碼混亂且難以維護。 你不想那樣,所以請不要。

問題:java.time 不需要 Android API 級別 26 嗎?

java.time 在較舊和較新的 Android 設備上都能很好地工作。 它只需要至少Java 6

  • 在 Java 8 及更高版本和更新的 Android 設備(從 API 級別 26)中,現代 API 是內置的。
  • 在非 Android Java 6 和 7 中獲得 ThreeTen Backport,現代類的 backport(ThreeTen for JSR 310;請參閱底部的鏈接)。
  • 在(較舊的)Android 上使用 ThreeTen Backport 的 Android 版本。 它被稱為 ThreeTenABP。 並確保使用子包從org.threeten.bp導入日期和時間類。

鏈接

這是我基於@Ole VV 回答的回答。

這也適用於 Singular。

private String getDuration(Date d1, Date d2) {
    Duration diff = Duration.between(d1.toInstant(), d2.toInstant());


    long days = diff.toDays();
    diff = diff.minusDays(days);
    long hours = diff.toHours();
    diff = diff.minusHours(hours);
    long minutes = diff.toMinutes();
    diff = diff.minusMinutes(minutes);
    long seconds = diff.toMillis();

    StringBuilder formattedDiff = new StringBuilder();
    if(days!=0){
        if(days==1){
            formattedDiff.append(days + " Day ");

        }else {
            formattedDiff.append(days + " Days ");
        }
    }if(hours!=0){
        if(hours==1){
            formattedDiff.append(hours + " hour ");
        }else{
            formattedDiff.append(hours + " hours ");
        }
    }if(minutes!=0){
        if(minutes==1){
            formattedDiff.append(minutes + " minute ");
        }else{
            formattedDiff.append(minutes + " minutes ");
        }
    }if(seconds!=0){
        if(seconds==1){
            formattedDiff.append(seconds + " second ");
        }else{
            formattedDiff.append(seconds + " seconds ");
        }
    }


    return formattedDiff.toString();
}

它與 StringBuilder 一起使用將所有內容附加在一起。

如果您使用 Kotlin 語言進行 Android 開發,則可以使用ExperimentalTime擴展。 要獲得天數差異,您可以像這樣使用它:

@ExperimentalTime
fun daysDiff(c1: Calendar, c2: Calendar): Double {
    val diffInMillis = c1.timeInMillis - c2.timeInMillis
    return diffInMillis.milliseconds.inDays
}

或者,如果您想以整數形式獲得結果:

@ExperimentalTime
fun daysDiff2(c1: Calendar, c2: Calendar): Int {
    val diffInMillis = c1.timeInMillis - c2.timeInMillis
    return diffInMillis.milliseconds.toInt(DurationUnit.DAYS)
}

我試過這個方法..但不知道為什么我沒有得到正確的結果

long diff = date1.getTime() - date2.getTime();
long seconds = diff / 1000;
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

但這有效

long miliSeconds = date1.getTime() -date2.getTime();
long seconds = TimeUnit.MILLISECONDS.toSeconds(miliSeconds);
long minute = seconds/60;
long hour = minute/60;
long days = hour/24;

使用格魯吉亞砑光

 public void dateDifferenceExample() {

        // Set the date for both of the calendar instance
        GregorianCalendar calDate = new GregorianCalendar(2012, 10, 02,5,23,43);
        GregorianCalendar cal2 = new GregorianCalendar(2015, 04, 02);

        // Get the represented date in milliseconds
        long millis1 = calDate.getTimeInMillis();
        long millis2 = cal2.getTimeInMillis();

        // Calculate difference in milliseconds
        long diff = millis2 - millis1;

        // Calculate difference in seconds
        long diffSeconds = diff / 1000;

        // Calculate difference in minutes
        long diffMinutes = diff / (60 * 1000);

        // Calculate difference in hours
        long diffHours = diff / (60 * 60 * 1000);

        // Calculate difference in days
        long diffDays = diff / (24 * 60 * 60 * 1000);
    Toast.makeText(getContext(), ""+diffSeconds, Toast.LENGTH_SHORT).show();


}

使用Instant怎么樣:

val instant1 = now()
val instant2 = now()
val diff: Duration = Duration.between(instant1, instant2)
val minutes = diff.toMinutes()

您甚至可以使用 instant1.toString() 保存您的 Instant 並使用 parse(string) 解析該字符串。

如果您需要支持 Android API 級別 < 26,只需將Java 8+ API 脫糖支持添加到您的項目中即可。

使用這些功能

    public static int getDateDifference(
        int previousYear, int previousMonthOfYear, int previousDayOfMonth,
        int nextYear, int nextMonthOfYear, int nextDayOfMonth,
        int differenceToCount){
    // int differenceToCount = can be any of the following
    //  Calendar.MILLISECOND;
    //  Calendar.SECOND;
    //  Calendar.MINUTE;
    //  Calendar.HOUR;
    //  Calendar.DAY_OF_MONTH;
    //  Calendar.MONTH;
    //  Calendar.YEAR;
    //  Calendar.----

    Calendar previousDate = Calendar.getInstance();
    previousDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth);
    // month is zero indexed so month should be minus 1
    previousDate.set(Calendar.MONTH, previousMonthOfYear);
    previousDate.set(Calendar.YEAR, previousYear);

    Calendar nextDate = Calendar.getInstance();
    nextDate.set(Calendar.DAY_OF_MONTH, previousDayOfMonth);
    // month is zero indexed so month should be minus 1
    nextDate.set(Calendar.MONTH, previousMonthOfYear);
    nextDate.set(Calendar.YEAR, previousYear);

    return getDateDifference(previousDate,nextDate,differenceToCount);
}
public static int getDateDifference(Calendar previousDate,Calendar nextDate,int differenceToCount){
    // int differenceToCount = can be any of the following
    //  Calendar.MILLISECOND;
    //  Calendar.SECOND;
    //  Calendar.MINUTE;
    //  Calendar.HOUR;
    //  Calendar.DAY_OF_MONTH;
    //  Calendar.MONTH;
    //  Calendar.YEAR;
    //  Calendar.----

    //raise an exception if previous is greater than nextdate.
    if(previousDate.compareTo(nextDate)>0){
        throw new RuntimeException("Previous Date is later than Nextdate");
    }

    int difference=0;
    while(previousDate.compareTo(nextDate)<=0){
        difference++;
        previousDate.add(differenceToCount,1);
    }
    return difference;
}

用 Kotlin 編寫:如果您需要兩個日期之間的差異並且不關心日期本身(如果您需要在應用程序中執行某些操作,則很好,例如基於共享首選項中保存的其他操作時間的時間)。 第一次保存:

val firstTime:Long= System.currentTimeMillis()

保存第二次:

val now:Long= System.currentTimeMillis()

計算兩次之間的毫秒數:

val milisecondsSinceLastTime: Long =(now-lastScrollTime)

獲取上午和下午之間的時差

private void getTimeDiff(){
    SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss aa");
    Date systemDate = Calendar.getInstance().getTime();
    String myDate = sdf.format(systemDate);
    Date current = null;
    Date Date2 = null;
    try {
        current = sdf.parse(myDate);
        Date2 = sdf.parse("12:00:00 am");
    } catch (ParseException e) {
        e.printStackTrace();
    }
    long millse = Date2.getTime() - current.getTime();
    long mills = Math.abs(millse);
    int Hours = (int) (mills/(1000 * 60 * 60));
    int Mins = (int) (mills/(1000*60)) % 60;
    long Secs = (int) (mills / 1000) % 60;
    String diff = Hours + ":" + Mins + ":" + Secs; 
    if(Hours>=12){
        String requiredTime = 24-Hours + ":" + Mins + ":" + Secs; 
        Log.d("TAG",requiredTime);

    }else{
        int time =  12 - Hours;
        String requiredTime = time + ":" + Mins + ":" + Secs;
        Log.d("TAG",requiredTime);
    }
}

當您嘗試根據該差異構造日期時,假設您要創建一個新的 Date 對象,該差異值作為其紀元時間。

//get time in milliseconds
long diff = date1.getTime() - date2.getTime();
//get time in seconds
long seconds = diff / 1000;
//and so on
long minutes = seconds / 60;
long hours = minutes / 60;
long days = hours / 24;

其他答案在某些情況下還可以,但當兩個日期之間存在時差時(就像我比較兩個不同時間的日期那么兩個日期之間的差異要么小於 24 小時,我負擔不起要么大於 24 小時)那么它將不起作用所以這是我的方法

    fun isSameDay(date1: Date, date2: Date): Boolean {
       val format = SimpleDateFormat("dd")
       return format.format(date1)==format.format(date2)
    }

對我有用的最短答案。 以毫秒為單位發送開始和結束日期。

public int GetDifference(long start,long end){
    Calendar cal = Calendar.getInstance();
    cal.setTimeInMillis(start);
    int hour = cal.get(Calendar.HOUR_OF_DAY);
    int min = cal.get(Calendar.MINUTE);
    long t=(23-hour)*3600000+(59-min)*60000;

    t=start+t;

    int diff=0;
    if(end>t){
        diff=(int)((end-t)/ TimeUnit.DAYS.toMillis(1))+1;
    }

    return  diff;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM