2012-06-20 87 views
3

我遇到了Java日历add()功能的问题。给予或拿来用于提供在旅行网站上出发的日期的迂回日期。Java日历添加问题

end.add(Calendar.DATE, Integer.parseInt(giveOrTake)); 

的代码是上面和我使用的测试条件是选择29/07/2012之日起3天给予或采取。根据文件,这应该出来作为01/08/2012,但它出来于01/07/2012。

我检查了giveOrTake,当它传递给方法,它很好,所以我不知道发生了什么。我可以对giveOrTake值进行硬编码,但仍然会出现错误。

+5

请发布一个简短但完整的程序来演示此问题。 (哦,理想情况下,转移到Joda时间 - 它更合理。) –

+1

您是如何生成输出的? (在8月的Java日历中是7个月......) – Affe

+0

对于忽视这个问题的道歉。原来,这是SimpleDateFormat使用'毫米'而不是'MM' –

回答

0

正是有了日期格式的问题。当它应该是'yyyyMMdd'时,它被设置为yyyymmdd

+1

这就是当你在问题中没有提供足够的信息时发生的情况。根据这些信息,任何人都无法帮助你 - 但如果你提供了一个实际上证明了这个问题的程序,它会很快被发现。 –

5

工作对我来说:

import java.util.*; 

public class Test { 
    public static void main (String []args) { 
     Calendar calendar = Calendar.getInstance(); 
     calendar.set(2012, Calendar.JULY, 29); 
     calendar.add(Calendar.DATE, 3); 
     System.out.println(calendar.getTime()); // August 1st 
    } 
} 

我的猜测是,你有一个月错误调用add前 - 注意我到set通话的上述使用为一个月,因为调用使用基于0的月份数字。

注意,按照我对这个问题的评论,你会好得多,如果你可以移动到Joda Time ......

+0

零月基于相当误导imo – keuleJ

+0

@keuleJ:绝对是一个问题。只是使用Joda的众多原因之一。 –

+0

@JonSkeet你可以使用'Calendar.JUNE'等常数来避免基于0的问题。 –

0

您正在使用麻烦的旧日期时间类,现在是遗留的,由java.time类代替。

另外,您正在使用日期 - 时间对象来表示仅限日期的值,不适合。

使用java.time

LocalDate类表示没有时间一天和不同时区的日期,唯一的价值。

LocalDate ld = LocalDate.of(2012 , 7 , 29) ; 
LocalDate threeDaysLater = ld.plusDays(3); 

ld.toString():2012-07-29

threeDaysLater.toString():2012-08-01

参见code run live in IdeOne.com


关于java.time

java.time框架是建立在Java 8和更高版本。这些类取代了日期时间类legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time项目现在位于maintenance mode,建议迁移到java.time类。请参阅Oracle Tutorial。并搜索堆栈溢出了很多例子和解释。规格是JSR 310

从何处获取java.time类?

ThreeTen-Extra项目与其他类扩展java.time。这个项目是未来可能增加java.time的一个试验场。您可以在这里找到一些有用的类,如Interval,YearWeek,YearQuartermore