以特定日期格式向 Java 和 return 中的给定日期添加一天
Add one day to given date in Java and return in specific date format
我希望给给定的 date.If 添加一天,我通过了 2018-08-05,下面的方法 returns 2018-08-06 这是预期的。但是如果传递最后一个日期 -2018-08-31,它 returns 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());
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());
您使用的是旧版 calendar/date 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));
}
}
错误出在您用于输入和输出的 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 在这种情况下无济于事。
我希望给给定的 date.If 添加一天,我通过了 2018-08-05,下面的方法 returns 2018-08-06 这是预期的。但是如果传递最后一个日期 -2018-08-31,它 returns 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());
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());
您使用的是旧版 calendar/date 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));
}
}
错误出在您用于输入和输出的 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 在这种情况下无济于事。