Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 我如何在安卓系统中获得两次约会的差异?尝试了所有事情并发布了帖子_Java_Android_Date_Time - Fatal编程技术网

Java 我如何在安卓系统中获得两次约会的差异?尝试了所有事情并发布了帖子

Java 我如何在安卓系统中获得两次约会的差异?尝试了所有事情并发布了帖子,java,android,date,time,Java,Android,Date,Time,我在这里看到了所有的帖子,但我仍然不知道如何区分两个android日期 我就是这么做的: long diff = date1.getTime() - date2.getTime(); Date diffDate = new Date(diff); 我得到:日期是1970年1月1日,两个小时内的时间总是比较长……我来自以色列,所以这两个小时是时间偏移 如何获得正常的差异???您接近正确答案,您得到的是这两个日期之间的毫秒差异,但当您试图根据该差异构建日期时,它假设您要创建一个新的日期对象,并将该

我在这里看到了所有的帖子,但我仍然不知道如何区分两个android日期

我就是这么做的:

long diff = date1.getTime() - date2.getTime();
Date diffDate = new Date(diff);
我得到:日期是1970年1月1日,两个小时内的时间总是比较长……我来自以色列,所以这两个小时是时间偏移


如何获得正常的差异???

您接近正确答案,您得到的是这两个日期之间的毫秒差异,但当您试图根据该差异构建日期时,它假设您要创建一个新的
日期
对象,并将该差异值作为其历元时间。如果你在寻找以小时为单位的时间,那么你只需要在
diff
上做一些基本的算术就可以得到不同的时间部分

爪哇:

科特林:

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

所有这些数学运算都将简单地进行整数运算,因此它将截断任何小数点

一些加法: 这里我将字符串转换为日期,然后比较当前时间

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

对我来说最简单的答案。以毫秒为单位发送开始和结束日期

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;
}
使用这些功能

    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;
}
公共静态int-getDateDifference(
上一年,上一个月,上一个月,
下个月,下个月,下个月,
整数差分计数){
//int differenceToCount=可以是以下任意一项
//日历毫秒;
//日历秒;
//日历。分钟;
//日历小时;
//日历。月的第天;
//日历月份;
//日历年;
//日历----
Calendar previousDate=Calendar.getInstance();
previousDate.set(Calendar.DAY\u OF月,previousDayOfMonth);
//月份索引为零,因此月份应为负1
previousDate.set(Calendar.MONTH,previousMonthOfYear);
previousDate.set(Calendar.YEAR,previousYear);
Calendar nextDate=Calendar.getInstance();
nextDate.set(Calendar.DAY\u OF月,previousDayOfMonth);
//月份索引为零,因此月份应为负1
下一个日期集(日历月,上一个月或一年);
下一个日期集(日历年,上一年);
返回getDateDifference(上一个日期、下一个日期、differenceToCount);
}
公共静态int-getDateDifference(日历上一个日期、日历下一个日期、int-differenceToCount){
//int differenceToCount=可以是以下任意一项
//日历毫秒;
//日历秒;
//日历。分钟;
//日历小时;
//日历。月的第天;
//日历月份;
//日历年;
//日历----
//如果previous大于nextdate,则引发异常。
如果(上一个日期与下一个日期相比>0){
抛出新的RuntimeException(“上一个日期晚于下一个日期”);
}
int差=0;
while(previousDate.compareTo(nextDate)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.time
现代java日期和时间API的一部分。它捆绑在较新的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设备上都能很好地工作。它至少需要Java6

  • 在Java8和更高版本以及更新的Android设备上(API级别26),现代API是内置的
  • 在非androidjava6和7中,获取三个后端口,即现代类的后端口(三个十用于jsr310;请参见底部的链接)
  • 在(较旧的)Android上,使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保您使用子包从
    org.ThreeTen.bp
    导入日期和时间类
链接
  • ,解释如何使用
    java.time
  • ,是
    java.time
    到Java6和Java7的后端口
  • ,Android版Three Ten Backport
  • ,解释得非常透彻

使用格鲁吉亚炉

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


}

这是我基于@olev.V.answer的答案

这也适用于单数形式

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编写: 如果您需要两个日期之间的差异,而不关心日期本身(如果您需要在应用程序中执行某些操作,那么这很好,例如,基于共享首选项中保存的其他操作时间)。 保存第一次:

val firstTime:Long= System.currentTimeMillis()
保存第二次:

val now:Long= System.currentTimeMillis()
计算两次之间的毫秒数:

val milisecondsSinceLastTime: Long =(now-lastScrollTime)

如果您在Android开发中使用Kotlin语言,您可以使用
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;
如何使用:

您甚至可以使用instant1.toString()保存即时消息,并使用parse(string)解析该字符串

如果您需要支持Android API级别<26,只需添加 到您的项目。

我可以从中创建日期对象吗
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;
val instant1 = now()
val instant2 = now()
val diff: Duration = Duration.between(instant1, instant2)
val minutes = diff.toMinutes()