【问题标题】:Add one day to given date in Java and return in specific date format [duplicate]在Java中为给定日期添加一天并以特定日期格式返回[重复]
【发布时间】:2018-09-08 09:58:45
【问题描述】:

我希望在给定日期上增加一天。如果我通过 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());

【问题讨论】:

  • 你的格式不对,应该是yyyy-MM-dd,大写M。但是,如果您使用的是 Java 8,请不要使用过时的 Date/Calendaruse LocalDate

标签: java date simpledateformat


【解决方案1】:

您使用的是旧的日历/日期 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));
  }
}

【讨论】:

    【解决方案2】:
    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());
    

    【讨论】:

      【解决方案3】:

      错误出现在您用于输入和输出的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 将无济于事。

      【讨论】:

      • 更正:采用现代 API 将有所帮助,因为它会引发异常,从而通知您代码中有错误。
      猜你喜欢
      • 1970-01-01
      • 2014-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-26
      • 2016-06-15
      相关资源
      最近更新 更多