在Java中添加一天到给定日期并以特定日期格式返回[重复]

问题描述 投票:-3回答:3

这个问题在这里已有答案:

我希望在给定的日期添加一天。如果我通过2018-08-05,则以下方法返回2018-08-06,这是预期的。但如果通过该月的最后一个日期-2018-08-31,则返回2018-08-01而不是2018-09-01的预期结果。

DateFormat format = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH);
Date date = null;
try {
    date = format.parse("2018-08-31");
} catch (ParseException e) {
}
Calendar cal = Calendar.getInstance();
cal.setTime(date);
cal.add(Calendar.DATE ,1);
return format.format(cal.getTime());
java date simpledateformat
3个回答
5
投票

您正在使用旧的日历/日期API。这个API非常糟糕(它做了奇怪的事情,并没有准确地模拟日期的实际工作方式)。

它已被新的java.time API取代。我强烈建议你改用它。如果您使用的是java7或更低版​​本,则可以将“JSR310-backport”库用于依赖项列表以使用此API。 (JSR310是java添加的名称)。

在java.time中,你会这样做:

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public class Test {
  public static void main(String[] args) {   
    DateTimeFormatter fmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
    LocalDate date = LocalDate.parse("2018-08-31", fmt);
    System.out.println(fmt.format(date.plusDays(1)));

    // yyyy-MM-dd so happens to be the default for LocalDate, so...
    // we can make it a lot simpler:
    date = LocalDate.parse("2018-08-31");
    System.out.println(date.plusDays(1));
  }
}

0
投票
DateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH);
Date date = null;
try {
date = format.parse("2018-08-31");
} catch (ParseException e) {
}
Calendar cal = new GregorianCalendar();
cal.setTime(date);
cal.setTimeInMillis(cal.getTimeInMillis() + 86400000); //86400000ms = 1 day
return format.format(cal.getTime());

0
投票

该错误是您用于输入和输出的SimpleDateFormat模式。这种两用掩盖了错误:

public class Main {
    public static void main(String[] args) throws Exception {
        DateFormat format = new SimpleDateFormat("yyyy-mm-dd", Locale.ENGLISH);
        Date date = format.parse("2018-08-31");

        System.out.println("format: " + format.format(date) +", real: " + date);

        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.DATE ,1);

        System.out.println("format: " + format.format(cal.getTime()) +", real: " + cal.getTime());
    }
}

这给你:

format: 2018-08-31, real: Wed Jan 31 00:08:00 CET 2018
format: 2018-08-01, real: Thu Feb 01 00:08:00 CET 2018

使用正确的模式yyyy-MM-dd产生正确的答案:

format: 2018-08-31, real: Fri Aug 31 00:00:00 CEST 2018
format: 2018-09-01, real: Sat Sep 01 00:00:00 CEST 2018

由于新的和旧的Java-Time API使用相同的模式,因此在这种情况下简单地采用新的API将无济于事。

© www.soinside.com 2019 - 2024. All rights reserved.