2012-10-17 102 views
3

我想减去5天,从该进来作为一个字符串开始的日期。爪哇 - 减去天从日期

我看过一些关于这个主题的其他帖子,但是我从代码中得到的结果总是不正确的。主要的问题是,今年价值似乎没有改变的时候,天相减,例如 - 2012-01-01 subtract 5 days gives me 'Jan 27 2012'使用此代码 -

cal.add(Calendar.DATE, -5); 

请帮助。

+1

你如何解析字符串“2012-01-01”到“日历”?我怀疑你有一个错误。 – Jesper

回答

6

你知道吗,在Java中,月份1实际上是2月?

Date februaryTheFirst = new Date(2012,1,1); // equals 2012-02-01 

这可能解释你所看到的。如果你要实例2012-01-01相反,你应该做的:

Calendar.getInstance().set(2012,0,1); // 2012-01-01 

一定要检查的文档Date(int, int, int)Calendar.set(int, int, int)

Date firstDayOf2012 = new Date(2012,0,1); // this is 2012-01-01 

完全一样的东西与Calendar打交道时发生。此外,你可以检查你解析字符串的方式。如果您使用SimpleDateFormat.parse(...),事情可能会更容易。

奇怪,不是吗?去图...正如一个有趣的事实,的IntelliJ的文档注释这第二个参数,月份,@MagicConstant,要记住,有事情很奇怪的东西程序员。

-1

用途:

cal.add(Calendar.DAY_OF_MONTH, -5) 

编辑:对不起。 DAY_OF_MONTHDATE的同义词。而不是1使用Calendar.JANUARY

0

Calendar.FEBRUARY是前1五天2012年2月1日为27戳刺2012

-1

该代码段是工作在我的电脑。首先你必须让日历实例执行你的计算。

  Calendar cal = Calendar.getInstance(); 
    System.out.println("Today : " + cal.getTime()); 
    // Subtract 300 days from the calendar 
    cal.add(Calendar.DATE, -300); 
    System.out.println("300 days ago: " + cal.getTime()); 

这是输出,你会得到:

Today : Wed Oct 17 10:41:23 EET 2012 
    300 days ago: Thu Dec 22 10:41:23 EET 2011 
0

你的实现是正确的,你得到正确的值ASLO。

Calendar的月开始0

0 = Jan 
1 = Feb 

所以减去5 days2012-01-01肯定会返回你Jan 27 2012 的东西在这里也是这将有助于你Why is January month 0 in Java Calendar?

0

乔达时间

的Joda-Time 2.7库使这项工作更容易。只需拨打minusDays方法即可。

String input = "2012-01-01"; 
DateTimeZone zone = DateTimeZone.forID("America/Montreal"); 
DateTime dateTime = new DateTime(input, zone); 
DateTime then = now.minusDays(5); 
DateTimeFormatter formatter = DateTimeFormat.forStyle("FF").withZone(zone).withLocale(Locale.CANADA_FRENCH); 
String output = formatter.print(then); 

如果你想在一天的开始,添加一个调用withTimeAtStartOfDay。在你的情况下,这是没有必要的,当解析一个没有时间的日期字符串时。

DateTime dateTimeAtStartOfDay = new DateTime(input, zone).withTimeAtStartOfDay(); 

如果你只想要日期没有时间的日或时区,使用LocalDate代替日期时间。

LocalDate then = new LocalDate("2012-01-01").minusDays(5); 

如果你需要转换到老java.util.Date,呼吁日期时间toDate

java.time

Java 8有一个新的包java.time。这些新课程受到Joda-Time的启发,但被重新设计。 java.time和Joda-Time都可以很好地解决这个问题。