【发布时间】:2018-04-20 10:20:17
【问题描述】:
我尝试从字符串中解析日期,但是当我打印它时,它显示了错误的日期。我的代码:
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;
public class Main {
public static void main(String args[]) {
String some_date = "2017-12-31";
Calendar cal_aux = GregorianCalendar.getInstance();
System.out.println("set calendar: " + Integer.parseInt(some_date.substring(0, 4))
+ Integer.parseInt(some_date.substring(5, 7))
+ Integer.parseInt(some_date.substring(8, 10)));
cal_aux.set(Integer.parseInt(some_date.substring(0, 4)),
Integer.parseInt(some_date.substring(5, 7)),
Integer.parseInt(some_date.substring(8, 10)));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("sdf calendar: " + sdf.format(cal_aux.getTime()));
}
}
控制台输出:
set calendar: 20171231
sdf calendar: 2018-01-31 12:51:02
为什么当我使用简单的日期格式时,我得到的是 2018 而不是 2017?
【问题讨论】:
-
请将您的问题编辑成英文,并提供minimal reproducible example。 (或者,当然可以找到最合适的非英语 Stack Overflow 站点 - es.stackoverflow.com?)
-
您忘记从月份值中减去 1。您输入的月份是
12,表示 12 月,但Calendar.set()的 javadoc 表示 "month- 用于设置 MONTH 日历字段的值。月份值为 从 0 开始。例如,0 代表 1 月。” 这是Calendar的常见陷阱,而您是最新的受害者。 -
我投票结束这个问题,因为它不是用英文写的。
-
您正在使用现在遗留的麻烦类,被 java.time 类所取代。
标签: java datetime simpledateformat java.util.calendar