【问题标题】:How can I find the number of days between two Dates?如何找到两个日期之间的天数?
【发布时间】:2011-06-02 18:47:20
【问题描述】:

我有两个Dates。如何区分这两个日期的天数?

听说过SimpleDateFormat,但是不知道怎么用。

我试过这个:

String fromdate = "Apr 10 2011";

SimpleDateFormat sdf;
sdf = new SimpleDateFormat("MMM DD YYYY"); 

sdf.parse(fromdate);

Calendar cal = Calendar.getInstance();
cal.setTime(sdf);

我也试过这个:

String date1 = "APR 11 2011";
String date2 = "JUN 02 2011";
String format = "MMM DD YYYY";
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date dateObj1 = sdf.parse(date1);
Date dateObj2 = sdf.parse(date2);
long diff = dateObj2.getTime() - dateObj1.getTime();
int diffDays = (int) (diff / (24* 1000 * 60 * 60));
System.out.println(diffDays);

但我得到了例外“非法模式字符'Y'。”

【问题讨论】:

标签: java date days elapsedtime elapsed


【解决方案1】:

其他答案正确但已过时。

java.time

java.time 框架内置于 Java 8 及更高版本中。这些类取代了旧的麻烦的日期时间类,例如 java.util.Date.Calendarjava.text.SimpleDateFormatJoda-Time 团队还建议迁移到 java.time。

要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。

大部分 java.time 功能在ThreeTen-Backport 中向后移植到 Java 6 和 7,并在 ThreeTenABP 中进一步适应 Android。

ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。

LocalDate

LocalDate 类表示没有时间和时区的仅日期值。

我建议尽可能为您的字符串使用标准的ISO 8601 格式。但是在您的情况下,我们需要指定格式模式。

String input = "Apr 10 2011";

DateTimeFormatter f = DateTimeFormatter.ofPattern ( "MMM d uuuu" );
LocalDate earlier = LocalDate.parse ( input , f );

DateTimeFormatter formatterOut = DateTimeFormatter.ofLocalizedDate ( FormatStyle.MEDIUM ).withLocale ( Locale.US );
String output = earlier.format ( formatterOut );

LocalDate later = earlier.plusDays ( 13 );

long days = ChronoUnit.DAYS.between ( earlier , later );

转储到控制台。

System.out.println ( "from earlier: " + earlier + " to later: " + later + " = days: " + days + " ending: " + output );

从早前:2011-04-10 到晚:2011-04-23 = 天数:13 结束:2011 年 4 月 10 日

【讨论】:

    【解决方案2】:

    这是一篇使用日历解决此问题的文章。 http://tripoverit.blogspot.com/2007/07/java-calculate-difference-between-two.html

    相信Joda Time也为这个场景提供API支持

    【讨论】:

    • 如果比较的日期在同一天的不同时间,则博客文章中的代码不起作用。当它应该为 0 时,它将返回 1 的差异
    【解决方案3】:

    你有两个 Date 对象?

    答案再简单不过了。

    public double computeDaysBetweenDates(Date d1, Date d2) {
        long diff;
    
        diff = d2.getTime() - d1.getTime();
        return ((double) diff) / (86400.0 * 1000.0);
    }
    

    Date 对象是包含 UTC POSIX EPOCH 时间的 long 的瘦包装器,该时间是自 UTC 1970 年 1 月 1 日午夜以来经过的毫秒数。您只需从较晚的值中减去较早的值即可获得间隔毫秒数。知道这一点,您只需除以一天中的毫秒数。

    请注意,此答案假定一天为 86400 秒,并且......这基本上是正确的。

    请注意,即使您已格式化日期字符串,此解决方案仍然适用。如果您能够先将日期/时间解析为 Date 对象,那么您仍然可以使用它们调用此函数。

    【讨论】:

    • 这篇文章只告诉你两个日期之间的 24 小时周期数,而不是日历天数
    • “天差”和“日历天差”有什么区别?
    【解决方案4】:

    这段代码应该告诉你如何做你需要的……

    public static void main(String[] args) {
        Calendar firstOfTheMonthCalendar = Calendar.getInstance();
        firstOfTheMonthCalendar.set(Calendar.DAY_OF_MONTH, 1);
    
        Date firstOfTheMonthDate = firstOfTheMonthCalendar.getTime();
        Date nowDate = new Date();
    
        int diffInDays = determineDifferenceInDays(firstOfTheMonthDate, nowDate);
        System.out.println("Number of days betweens dates: " + diffInDays);
    }
    
    private static int determineDifferenceInDays(Date date1, Date date2) {
        Calendar calendar1 = Calendar.getInstance();
        calendar1.setTime(date1);
        Calendar calendar2 = Calendar.getInstance();
        calendar2.setTime(date2);
        long diffInMillis = calendar2.getTimeInMillis() - calendar1.getTimeInMillis();
        return (int) (diffInMillis / (24* 1000 * 60 * 60));
    }
    

    【讨论】:

    • 我阅读了链接到 nsfyn55 答案的博客文章,看来我的解决方案在某些时区不起作用。该文章显示了解决此问题的更明确的方法,但我的答案在大多数情况下应该有效。
    【解决方案5】:

    Difference between two date strings in java

    这将帮助您获得一些想法

    【讨论】:

      猜你喜欢
      • 2011-06-24
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-14
      相关资源
      最近更新 更多