2010-02-07 224 views
3

我想要一个例子:比较今天的日期+ 30天至另一个日期

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

请参阅下面的答案。 – Pointy 2010-02-07 18:33:01

回答

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 2010-02-07 18:34:08

+0

正确。我必须在'todayPlus30'对象上调用套件 – Omnipresent 2010-02-07 18:35:46

+0

哦,对不起;我总是使用GregorianCalendar,而我只是输入机器人模式:-) – Pointy 2010-02-07 18:38:57

3

作为进一步的评论,我会调查JodaTime所有与日期相关的Java工作。它更直观,并且不会遇到日期/时间格式化和解析类中的线程问题(与标准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 todaysDay = System.currentTimeMillis()/MILLIS_PER_DAY; 
long in30days = todaysDay + 30; 
long usefulDay = usefulDate.getTime()/MILLIS_PER_DAY; 
if (in30days == usefulDay) // days are the same. 

注:执行计算为每克MT + 0时区。这可以有所作为。