3

我试图从最初作为字符串出现的日期中减去 5 天。

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

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

请帮忙。

4

6 回答 6

6

你知道吗,在 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

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

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

奇怪,不是吗?想想看……就像一个有趣的事实一样,IntelliJ 的文档用 注释了第二个参数,月份,@MagicConstant以记住程序员正在发生一些非常奇怪的事情。

于 2012-10-17T08:31:50.717 回答
0

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

于 2012-10-17T08:33:04.600 回答
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,请调用toDateDateTime。

java.time

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

于 2014-11-16T07:17:12.920 回答
0

您的实现是正确的,并且您也得到了正确的值。

Calendar的月份开始于0

0 = Jan
1 = Feb

所以减去肯定会返回你5 days的 东西,这也将帮助你为什么 Java 日历中的 1 月是 0 月?2012-01-01Jan 27 2012

于 2012-10-17T08:49:04.550 回答
-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
于 2012-10-17T08:42:40.317 回答
-1

利用:

cal.add(Calendar.DAY_OF_MONTH, -5)

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

于 2012-10-17T08:32:01.117 回答