【问题标题】:How to compare dates and given the difference between them? [duplicate]如何比较日期并给出它们之间的差异? [复制]
【发布时间】:2013-12-30 06:45:57
【问题描述】:

我发现了一个非常有用的库,它是用于格式化日期的SimpleDateFormat。那不是问题。 compareTo 方法用于比较日期的目的,但我的问题是 compareTo 没有显示 then 之间的区别

例如下面的代码:

    String date1 = "Apr 2010";
    String date2 = "Jan 2009";

    SimpleDateFormat format = new SimpleDateFormat("MMM yy");

    Date d1 = null;
    Date d2 = null;
    d1 = format.parse(date1);
    d2 = format.parse(date2);

    int test1 = d1.compareTo(d2);
    System.out.println(test1);

上面的输出给了我-9。请问compareTo这个方法是怎么计算的?

我想要的是找出那些月份和年份之间的差异。非常感谢。

【问题讨论】:

  • @SotiriosDelimanolis 已编辑。抱歉,刚才忘记包含格式转换器了
  • 你必须定义你所说的“差异”——即你想使用什么单位。天?几个月?年?对于上面给出的两个日期,您希望得到什么“差异”?
  • @JimGarrison 月份和年份之间的差异。
  • 仍然没有足够的信息。对于您示例中的两个日期,请准确地提供您希望看到的结果。

标签: java date


【解决方案1】:

compareTo 方法继承自 Comparable。它的 javadoc 状态

将此对象与指定对象进行比较以进行排序。返回一个 负整数、零或正整数,因为此对象较小 大于、等于或大于指定的对象。

这就是您将从compareTo 获得的全部内容。只是哪个更大/更小/相等。

如果您想比较日期字段,您需要自己进行。或者使用像 Joda Time 这样的第三方库。例如

String date1 = "Apr 2010";
String date2 = "Jan 2009";

DateTimeFormatter formatter = DateTimeFormat.forPattern("MMM yyyy");

DateTime d1 = formatter.parseDateTime(date1);
DateTime d2 = formatter.parseDateTime(date2);

Months monthsBetween = Months.monthsBetween(d1, d2);
System.out.println("Months diff: " + monthsBetween.get(DurationFieldType.months()));
Years yearsBetween = Years.yearsBetween(d1, d2);
System.out.println("Years diff: " + yearsBetween.get(DurationFieldType.years()));

打印

Months diff: -15
Years diff: -1

【讨论】:

  • 我明白了,我认为它会返回日期差异的值。非常感谢您提供的信息。
  • @user3054491 不客气。 Java 8 中对 Date 对象的支持将大大改进,因此请注意。
  • 天哪,谢谢您提供的信息。你对我帮助很大!
  • 一个问题,我将您的代码复制并粘贴到我的 NetBeans 中,但在 Month 上出现错误。 Month 是图书馆吗?因为 NetBeans 没有显示要包含的库,所以我在那里遇到了错误。
  • @user3054491 是的,这就是我所说的 3rd 方库。 Joda Time 是一个专门从事日期处理的库。您可以查看项目here。你可以下载你想要的版本here。您需要将它们添加到您的 Netbeans 项目构建路径中。
【解决方案2】:

查看日历类。它用于获取和设置实际的日期属性,例如年、月、日等。这是我最近写的一个……

public Date addDays(Date date, int deltaDays) {
    Calendar calendar = Calendar.getInstance();
    calendar.setTimeInMillis(date.getTime());
    calendar.add(Calendar.DAY_OF_MONTH, deltaDays);
    return new Date( calendar.getTimeInMillis() );
}

public Date getFirstWeekdayOfYear(int dayOfWeek, int year) {
    Calendar calendar = Calendar.getInstance();
    calendar.set(Calendar.YEAR, year);
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
    calendar.set(Calendar.MILLISECOND, 0);
    calendar.set(Calendar.MONTH, 0);
    calendar.set(Calendar.DAY_OF_MONTH, 1);
    while (calendar.get(Calendar.DAY_OF_WEEK) != dayOfWeek) {
        calendar.add(Calendar.DATE, 1);
    }
    return new Date( calendar.getTimeInMillis());
}

public boolean isOlderThan(Date date, int days) {
    return date.getTime() < getToday(0-days).getTime();
}

【讨论】:

  • 会看一看。谢谢。
【解决方案3】:

你需要制作日期日历

Calendar c1 = Calendar.getInstance();
c1.setTime(d1);
Calendar c2 = ...
...

然后从日历中获取年份和月份

int y1= c1.get(Calendar.YEAR);
int m1 = c1.get(Calendar.MONTH);
int y2 = 
...

现在使用整数算术找出差异

【讨论】:

  • 会看一看。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-10
  • 2017-04-02
  • 2017-04-20
  • 1970-01-01
相关资源
最近更新 更多