【问题标题】:How to find difference between to dates [duplicate]如何找到日期之间的差异[重复]
【发布时间】:2017-02-16 07:53:08
【问题描述】:

我有两个日期,字符串格式为“16-Feb-2017”、“26-Feb-2017” 我用过

SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd-MMM-yyyy");

但我无法得到像“10”这样的确切结果。

【问题讨论】:

  • 你所说的“像'10'这样的精确结果”是什么意思???请修改您的问题或至少添加一些解释...
  • 你的意思是你需要两个日期之间的天数差吗?
  • but I am unable to get exact result like "10". - 10 什么?秒?年?日期和时间在 Java 中以毫秒为单位。

标签: java android date


【解决方案1】:

希望这会对您有所帮助。在 myDate 和 time_ago 中传递您的日期。

int totalMin;

SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss", Locale.ENGLISH);

Date systemDate = Calendar.getInstance().getTime();
                        String myDate = sdf.format(systemDate);


Date Date1 = null;
try {
    Date1 = sdf.parse(myDate);

} catch (ParseException e) {
    e.printStackTrace();
}
Date Date2 = null;
try {
    Date2 = sdf.parse(time_ago);

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

assert Date2 != null;
assert Date1 != null;
long millse = Date1.getTime() - Date2.getTime();


long mills = Math.abs(millse);

Hours = (int) (mills / (1000 * 60 * 60));
Mins = (int) (mills / (1000 * 60)) % 60;
Secs = (int) (mills / 1000) % 60;

long diffDays = millse / (24 * 60 * 60 * 1000);

if (Secs >= 60) {
    Mins = Mins + 1;
    Secs = Secs - 60;
} else if (Mins >= 60) {
    Hours = Hours + 1;
    Mins = Mins - 60;
}

totalMin = (int) ((Mins) + (Secs / 60));
String t_time;

if (diffDays > 0) {
    if (diffDays == 1) {
        t_time = diffDays + " day";
    } else {
        t_time = diffDays + " days";
    }

} else if (Hours > 0) {
    if (Hours == 1) {
        t_time = Hours + " hour";
    } else {
        t_time = Hours + " hours";
    }

} else if (Mins > 0) {
    if (Mins == 1) {
        t_time = totalMin + " minute";
    } else {
        t_time = totalMin + " minutes";
    }

} else {
    if (Secs == 1) {
        t_time = Secs + " second";
    } else {
        t_time = Secs + " seconds";
    }

}

【讨论】:

  • 当输入类似于16-Feb-2017 没有任何小时或分钟时,我不希望输出中需要小时、分钟和秒。最初的提问者最清楚。
【解决方案2】:
DateTimeFormatter formatter =  DateTimeFormatter.ofPattern("dd-MMM-yyyy");
java.time.LocalDate d1 = java.time.LocalDate.parse("16-Feb-2017", formatter);
java.time.LocalDate d2 = java.time.LocalDate.parse("26-Feb-2017", formatter);

Period until = d1.until(d2);
System.out.println("Dif: " + until.getDays());

【讨论】:

  • 感谢您的快速回复......这不适用于android,你能帮我适应android
  • 这是任何可以使用 Java 8(或更高版本)的人推荐的方法。我赞成帮助指导任何可以的读者。
  • 注意DateTimeFormatter.ofPattern("dd-MMM-yyyy") 使用计算机的默认格式区域设置。如果您需要其他语言环境,可以添加 Locale 参数。
  • 你是对的,Ole V.V.关于语言环境。
【解决方案3】:

请使用以下代码初始化 SimpleDateFormat。

SimpleDateFormat dateFormat = new SimpleDateFormat("dd-MMM-yyyy", Locale.ENGLISH);

【讨论】:

  • 感谢您的快速回复...我需要两个日期之间的差异...请让我知道如何继续
【解决方案4】:

正如我在评论中所说,如果可以,请使用 Java 8 java.time 类。 kamehl23’s answer 告诉你怎么做。这是一个既优雅又强大的解决方案,也适用于夏令时 (DST) 前后的变化。

编辑:卡住了较旧的 Java 版本,他们说您可以使用 ThreeTenABP 或 Joda 时间,我没有尝试过其中任何一个。 ThreeTenABP,我读到,是一个将 java.time 向后移植到 Java 6 和 7 的 Android 改编版本,所以我很想试一试。

可以当然可以使用 Java 1.1 Calendar。也适用于夏季时间变化的解决方案是:

    String formattedDate1 = "16-Feb-2017";
    String formattedDate2 = "26-Feb-2017";

    DateFormat df = new SimpleDateFormat("dd-MMM-yyyy", YOUR_LOCALE);

    Date d1 = df.parse(formattedDate1);
    Calendar cal1 = Calendar.getInstance();
    cal1.setTime(d1);

    Date d2 = df.parse(formattedDate2);
    Calendar cal2 = Calendar.getInstance();
    cal2.setTime(d2);

    int daysBetween = 0;
    while (cal1.before(cal2)) {
        daysBetween++;
        cal1.add(Calendar.DATE, 1);
    }
    System.out.println(daysBetween);

这将打印10。它既不是很优雅也不是很高效,但只要“开始”日期早于(或相同)“结束”日期(可以很容易地检查),它就可以正常工作。

【讨论】:

    猜你喜欢
    • 2011-09-29
    • 2011-05-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多