Java – 从日期减去天数

我试图从最初以字符串forms出现的日期减去5天。

我已经看了一些关于这个主题的其他post,但我从代码中得到的结果总是不正确的。 主要问题是,当减去天数时,年份值似乎没有变化 – 2012-01-01 subtract 5 days gives me 'Jan 27 2012'使用此代码 –

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

请帮忙。

您是否知道,在Java中,第1个月实际上是2月?

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

这可以解释你所看到的。 如果你想要实例化2012-01-01,你应该这样做:

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

处理Calendar时完全相同:

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

请务必查看Date(int, int, int)Calendar.set(int, int, int)的文档。 此外,您可以检查解析字符串的方式。 如果你使用SimpleDateFormat.parse(...) ,事情SimpleDateFormat.parse(...)得更容易。

奇怪,不是吗? Go figure …就像一个有趣的事实一样,IntelliJ的文档使用@MagicConstant注释第二个参数月,以记住程序员有一些非常奇怪的事情。

Calendar.FEBRUARY是2012年2月1日之前的1天和5天是27 Jab 2012。

您的实现是正确的,您正在获得正确的值。

Calendar的月份从0开始

 0 = Jan 1 = Feb 

所以从2012-01-01减去5 days肯定会让你重新回到Jan 27 2012这里也有什么东西可以帮助你为什么1月0日在Java日历中?

乔达时间

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而不是DateTime。

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

如果需要转换为旧的java.util.Date,请在DateTime上调用toDate

java.time

Java 8有一个新包java.time。 这些新课程的灵感来自Joda-Time,但经过重新设计。 java.time和Joda-Time都能很好地解决这个特殊问题。

使用:

 cal.add(Calendar.DAY_OF_MONTH, -5) 

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

这是我的电脑上运行的一段代码。 首先,你必须让日历实例执行你的计算。

  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