无法在Java中创建正确的日期对象
我试图从格式为“9/2/2004”的字符串创建一个日期对象 这是我的密码:无法在Java中创建正确的日期对象,java,date,Java,Date,我试图从格式为“9/2/2004”的字符串创建一个日期对象 这是我的密码: //Set Date String[] date_array = record[0].split("/"); Date date = new GregorianCalendar(Integer.parseInt(date_array[2]), Integer.parseInt(date_array[1]), Integer.parseInt(date_array[0])).getTime(); 但是,当我尝试
//Set Date
String[] date_array = record[0].split("/");
Date date = new GregorianCalendar(Integer.parseInt(date_array[2]), Integer.parseInt(date_array[1]),
Integer.parseInt(date_array[0])).getTime();
但是,当我尝试输出date对象时,它打印为:
Tue Mar 09 00:00:00 EST 2004
和2004年4月20日
打印为:
Sun Sep 04 00:00:00 EDT 2005
问题:这里发生了什么?哪里出了问题?参数的顺序(从)是gregorianalendar(int year,int month,int dayOfMonth)
-你正在通过年
然后天
然后月
。你还需要考虑一月是0
,比如
String record = "4/20/2004";
String[] date_array = record.split("/");
Date date = new GregorianCalendar(Integer.parseInt(date_array[2]),
Integer.parseInt(date_array[0]) - 1,
Integer.parseInt(date_array[1])).getTime();
System.out.println(date);
参数的顺序(从)是GregorianCalendar(int year,int month,int dayOfMonth)
-并且您正在通过year
然后是day
然后是month
。您还需要考虑一月是0
,比如
String record = "4/20/2004";
String[] date_array = record.split("/");
Date date = new GregorianCalendar(Integer.parseInt(date_array[2]),
Integer.parseInt(date_array[0]) - 1,
Integer.parseInt(date_array[1])).getTime();
System.out.println(date);
为什么不使用DateTimeFormat分析日期时间文本。请尝试:
String text = "9/2/2004";
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date dt = format.parse(text);
为什么不使用DateTimeFormat分析日期时间文本。请尝试:
String text = "9/2/2004";
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date dt = format.parse(text);
您不需要拆分字符串来分别提取日期、月份和年份。您可以使用
SimpleDateFormat
解析此日期字符串:
String dateStr = "9/2/2004"; // I assume it is in dd/MM/yyyy format
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date date = format.parse(dateStr);
您不需要拆分字符串来分别提取日期、月份和年份。您可以使用
SimpleDateFormat
解析此日期字符串:
String dateStr = "9/2/2004"; // I assume it is in dd/MM/yyyy format
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date date = format.parse(dateStr);
只需使用
DateTimeFormat
解析字符串日期时间:
String dateInString = "9/2/2004";
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
try {
Date date = formatter.parse(dateInString);
} catch (ParseException e) {
e.printStackTrace();
}
只需使用
DateTimeFormat
解析字符串日期时间:
String dateInString = "9/2/2004";
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
try {
Date date = formatter.parse(dateInString);
} catch (ParseException e) {
e.printStackTrace();
}
问题:这里发生了什么?出了什么问题
两件基本的事情出了问题:
Date
和gregorianalendar
早已过时,不再推荐,这也是因为它们的设计总是很糟糕。此外,尽管它们的名称并不代表日期(日期是时间点,gregorianalendar
是特定时区中的日期和时间)GregorianCalendar
构造函数。该构造函数按该顺序将参数设置为年、月和日。此外,它还令人困惑地假设了一个以0为基础的月,其中0表示一月,所以2表示三月。因此,在您的JVM的默认时区
但是2004年4月20日,那么?当月份从0到11时,20不能是一个月。带有默认设置的aGregorianCalendar
并不重要,它只是推断并持续计算下一年的月份。因此,第11个月应该是2004年12月,第12个月应该是2005年1月,以此类推,所以我们最终得出第20个月是2005年9月
该怎么办?
您的问题的现代解决方案是:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/u");
LocalDate date = LocalDate.parse("9/2/2004", dtf);
System.out.println(date);
输出为:
2004-09-02
M/d/u
是一种格式模式字符串,指定您的格式由月、月、日和年组成,用斜杠分隔。请注意格式模式字符串区分大小写:您需要大写M
和小写d
和u
。所有可能的格式字母都在文档中
链接
- 解释如何使用
java.time
- (包括图案字母)
Date
和gregorianalendar
早已过时,不再推荐,这也是因为它们的设计总是很糟糕。此外,尽管它们的名称并不代表日期(日期是时间点,gregorianalendar
是特定时区中的日期和时间)GregorianCalendar
构造函数。该构造函数按该顺序将参数设置为年、月和日。此外,它还令人困惑地假设了一个以0为基础的月,其中0表示一月,所以2表示三月。因此,在您的JVM的默认时区
但是2004年4月20日,那么?当月份从0到11时,20不能是一个月。带有默认设置的aGregorianCalendar
并不重要,它只是推断并持续计算下一年的月份。因此,第11个月应该是2004年12月,第12个月应该是2005年1月,以此类推,所以我们最终得出第20个月是2005年9月
该怎么办?
您的问题的现代解决方案是:
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("M/d/u");
LocalDate date = LocalDate.parse("9/2/2004", dtf);
System.out.println(date);
输出为:
2004-09-02
M/d/u
是一种格式模式字符串,指定您的格式由月、月、日和年组成,用斜杠分隔。请注意格式模式字符串区分大小写:您需要大写M
和小写d
和u
。所有可能的格式字母都在文档中
链接
- 解释如何使用
java.time
- (包括图案字母)
GregoriaCalendar
月份索引(不幸的是)以0为基础,因此您必须添加1。可能重复(以及许多其他问题,如果您需要更多灵感,请搜索)。我建议您避免使用Date
和GregorianCalendar
类。它们是