Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/397.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java-从日期中减去天数_Java_Date_Calendar - Fatal编程技术网

Java-从日期中减去天数

Java-从日期中减去天数,java,date,calendar,Java,Date,Calendar,我试图从一个日期中减去5天,这个日期最初以字符串形式出现 我看过其他一些关于这个主题的帖子,但是我从代码中得到的结果总是不正确的。主要问题是,当减去天数时,年份值似乎没有变化,例如-2012-01-01减去5天,我得到了“2012年1月27日”使用此代码- cal.add(Calendar.DATE, -5); 请帮忙。您知道吗,在Java中,1月份实际上是二月 Date februaryTheFirst = new Date(2012,1,1); // equals 2012-02-01

我试图从一个日期中减去5天,这个日期最初以字符串形式出现

我看过其他一些关于这个主题的帖子,但是我从代码中得到的结果总是不正确的。主要问题是,当减去天数时,年份值似乎没有变化,例如-
2012-01-01减去5天,我得到了“2012年1月27日”
使用此代码-

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

请帮忙。

您知道吗,在Java中,
1月份实际上是二月

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.getInstance().set(2012,0,1); // 2012-01-01
确保检查文档中的和。此外,还可以检查解析字符串的方式。如果你使用,事情会更容易

奇怪,不是吗?想想看。。。有趣的是,IntelliJ的文档用
@MagicConstant
注释了第二个参数month,以提醒程序员发生了一些非常奇怪的事情。

使用:

cal.add(Calendar.DAY_OF_MONTH, -5)

编辑:对不起
DAY\u OF\u MONTH
DATE
的同义词。不要使用
1
日历。1月

日历。2月是2012年2月1日之前的1天和5天,2012年2月1日是2012年6月27日。

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

            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开始

0 = Jan
1 = Feb
因此,从
2012-01-01
中减去
5天
,肯定会返回您的
2012年1月27日
这里也有一些东西可以帮助你

Joda Time 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 );
如果您想要一天的开始,请添加一个对
的呼叫,时间为startofday
。在您的情况下,当解析没有时间的仅日期字符串时,这是不必要的

DateTime dateTimeAtStartOfDay = new DateTime( input, zone ).withTimeAtStartOfDay();
如果您只想要日期而不需要一天中的时间或时区,请使用
LocalDate
而不是DateTime

LocalDate then = new LocalDate( "2012-01-01" ).minusDays( 5 );
如果需要转换为旧的java.util.Date,请在DateTime上调用
toDate

LocalDate then = new LocalDate( "2012-01-01" ).minusDays( 5 );
java.time
Java8有一个新包Java.time。这些新课程的灵感来自Joda Time,但经过了重新设计。java.time和Joda-time都可以很好地解决这个问题。

您如何将字符串
2012-01-01
解析为
日历?我怀疑你在那里出错了。