将今天的日期+ 30天与另一个日期进行比较

时间:2010-02-07 18:25:38

标签: java date

我正在尝试一个例子:

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

接下来的问题是我如何才能获得date

5 个答案:

答案 0 :(得分: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 :(得分:3)

作为进一步的评论,我会调查JodaTime所有与日期相关的Java工作。它更直观,并且不会遇到日期/时间格式化和解析类中的线程问题(与标准Java库不同)。现在它是事实上的替代java.util.{Date,Calendar}混乱。

e.g。请参阅LocalDate类及其plusDays()方法。

答案 2 :(得分:1)

当你System.out.println(..)时,结果是:

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

所以他们不平等 - 他们的时间不同。这是因为Calendar.getInstance()返回当前日期时间。

如果您希望它们相等,则必须将set(..)小时,分钟和秒字段设为0。

答案 3 :(得分:1)

如果您在示例中添加以下行,您将了解到有用的日期具有不同的时间

System.out.println ("" + usefullDate );
System.out.println ("" + todaysDatePlus30Days.getTime());

答案 4 :(得分: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时区执行计算。这可以有所作为。