Java-从日期中减去天数
我试图从一个日期中减去5天,这个日期最初以字符串形式出现 我看过其他一些关于这个主题的帖子,但是我从代码中得到的结果总是不正确的。主要问题是,当减去天数时,年份值似乎没有变化,例如-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
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
解析为日历?我怀疑你在那里出错了。