比较今天日期加上30天与另一个日期的差异

3

我正在尝试一个例子:

DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
String date = "03/09/2010"; //30 days from today
Date usefullDate = df.parse(date);

Calendar todaysDatePlus30Days = Calendar.getInstance();
todaysDatePlus30Days.add(Calendar.DAY_OF_YEAR, 30);

System.out.println ("Compared Value: " +
usefullDate.compareTo(todaysDatePlus30Days.getTime()))

打印的值为-1。为什么它没有打印0

我认为问题在于todaysDatePlus30Days.getTime()会带上实际时间,而usefullDate的时间是00:00:00

那么下一个问题是如何只获取日期

5个回答

3

您解析的日期默认为当天午夜。而您构建的日期则是当前的时间。

建议尝试:

Calendar todayPlus30 = new GregorianCalendar() {{
  add(Calendar.DAY_OF_YEAR, 30);
  set(Calendar.HOUR_OF_DAY, 0);
  set(Calendar.MINUTE, 0);
  set(Calendar.SECOND, 0);
  set(Calendar.MILLISECOND, 0);
}};

我可能有一些常量写错了,如果你喜欢,你可以使用Calendar.newInstance()来完成这个操作,不过语法会有一点不同。


1
你的想法是正确的,但你不能像那样对返回值进行子类化。你必须保留一个引用并在该引用上调用设置,或者使用 new GregorianCalendar(){{ - Yishai
哦,对不起;我总是使用GregorianCalendar,而且我刚才是在机器人模式下输入的 :-) - Pointy

3
作为进一步的评论,我建议在所有与日期相关的Java工作中使用JodaTime。它更加直观,而且不像标准Java库那样在日期/时间格式化和解析类中存在线程问题。现在它已成为java.util.{Date,Calendar}混乱的事实上的替代品。
例如,请参见LocalDate类及其plusDays()方法。

1

当你使用System.out.println(..)打印它们时,结果是:

Tue Mar 09 00:00:00 EET 2010
Tue Mar 09 20:31:39 EET 2010

所以它们不相等 - 它们的小时数不同。这是因为Calendar.getInstance()返回当前日期和时间。

如果你想让它们相等,你需要将小时、分钟和秒字段set(..)为0。


1
如果您将以下行添加到示例中,您将了解到有用的日期具有不同的时间。
System.out.println ("" + usefullDate );
System.out.println ("" + todaysDatePlus30Days.getTime());

0
我建议使用JodaTime,但如果您使用long类型来表示日期/时间,您可以...
long todaysDay = System.currentTimeMillis() / MILLIS_PER_DAY;
long in30days = todaysDay + 30;
long usefulDay = usefulDate.getTime() / MILLIS_PER_DAY;
if (in30days == usefulDay) // days are the same.

注意:此程序根据GMT+0时区执行计算,这可能会产生差异。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接