Java - 从日期减去天数

时间:2012-10-17 08:28:44

标签: java date calendar

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

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

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

请帮忙。

6 个答案:

答案 0 :(得分:6)

您是否知道,在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(...),事情就会变得更容易。

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

您的实施是正确的,并且您获得了正确的值。

Calendar的月份以0

开头
0 = Jan
1 = Feb

所以从5 days减去2012-01-01肯定会让你Jan 27 2012 这里的东西也会帮助你Why is January month 0 in Java Calendar?

答案 3 :(得分: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代替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都能很好地解决这个特殊问题。

答案 4 :(得分:-1)

使用:

cal.add(Calendar.DAY_OF_MONTH, -5)
编辑:抱歉。 DAY_OF_MONTHDATE的同义词。而不是1使用Calendar.JANUARY

答案 5 :(得分:-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