我正在尝试一个例子:
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
?
答案 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时区执行计算。这可以有所作为。