使用日历的日期问题-Java

时间:2019-05-18 18:08:22

标签: java calendar

尝试使用日历时出现问题。 看:

public static Calendar novaData(Calendar originDate, Integer amountMonth) {
    System.out.println("Origin date: " + originDate.getTime() + " - Add " + amountMonth + " Months");
    Calendar date = new GregorianCalendar(originDate.getTimeZone());
    date.add(Calendar.MONTH, amountMonth);
    System.out.println(date.getTime());
    return date;
}

现在,控制台: enter image description here

在这种方法中,我将设置一个日期以及要添加到该日期的月数。问题就在那里,这一天像今天(18)一样来了,而不是我过去的第一天。预期的结果是五月/ 01/2019-六月/ 01/2019-七月/ 01/2019

2 个答案:

答案 0 :(得分:1)

java.time

    LocalDate originDate = LocalDate.of(2019, Month.MAY, 1);
    for (int amountMonth = 1; amountMonth <= 3; amountMonth++) {
        System.out.println("Origin date: " + originDate + " - Add " + amountMonth + " Months");
        System.out.println(originDate.plusMonths(amountMonth));
    }

输出为:

Origin date: 2019-05-01 - Add 1 Months
2019-06-01
Origin date: 2019-05-01 - Add 2 Months
2019-07-01
Origin date: 2019-05-01 - Add 3 Months
2019-08-01

我从您想要的输出中发现,您只对日期感兴趣,而对一天中的时间或时区不感兴趣。如果是这样,则LocalDate类是要使用的正确类。

如果您只对月份感兴趣,而不对月份中的一天感兴趣,请使用YearMonth而不是LocalDate。除了声明和初始化外,代码将相同:

    YearMonth originDate = YearMonth.of(2019, Month.MAY);
Origin date: 2019-05 - Add 1 Months
2019-06
(etc.)

请勿使用CalendarGregorianCalendar。这些课程设计欠佳,而且已经过时。最重要的是,它们与每个对象一起携带一天中的某个时间,一个时区,一个星期的计划等等,而我认为这些都不是您所需要的,而这只会冒着使读取代码的人迷惑的风险。

链接: Oracle tutorial: Date Time解释了如何使用java.time。

答案 1 :(得分:0)

首先,如果可能的话,请考虑使用较新的Java Date对象。参见例如this blog

但是,OP的特定问题是new GregorianCalendar调用will create based upon the current date/time of the user。它未使用originDate的指定日期/时间。

一种调整代码的方法是:

public static Calendar novaData(Calendar originDate, Integer amountMonth) {
    System.out.println("Origin date: " + originDate.getTime() + " - Add " + amountMonth + " Months");
    Calendar date = new GregorianCalendar();
    date.setTime(originDate.getTime());
    date.setTimeZone(originDate.getTimeZone());

    date.add(Calendar.MONTH, amountMonth);
    System.out.println(date.getTime());

    return date;
}

根据测试输入,输出将月份向前移动。 See it here

  

原定日期:2019年5月18日星期六18:01:21-添加0个月
  2019年5月18日星期六18:01:21 GMT
  起源日期:2019年5月18日星期六18:01:21 GMT-增加1个月
  2019年6月18日星期二18:01:21格林尼治标准时间
  起源日期:2019年5月18日星期六格林尼治标准时间18:01:21-增加2个月
  2019年7月18日星期四18:01:21 GMT

请注意,leap年,负金额等问题并未得到充分考虑。