无法在Java中创建正确的Date对象

时间:2018-09-10 03:05:21

标签: 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();

但是,当我尝试输出日期对象时,它显示为:

Tue Mar 09 00:00:00 EST 2004

4/20/2004打印为:

Sun Sep 04 00:00:00 EDT 2005

问题:这是怎么回事?出了什么问题?

5 个答案:

答案 0 :(得分:2)

您不需要拆分String即可分别提取日期,月份和年份。您可以使用SimpleDateFormat解析此Date字符串:

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);

答案 1 :(得分:1)

(来自Javadoc的参数顺序为GregorianCalendar(int year, int month, int dayOfMonth)-您先传递的是year然后是day然后是month。您还需要考虑1月为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);

答案 2 :(得分:1)

为什么不使用DateTimeFormat解析日期时间文本。试试吧:

String text = "9/2/2004";
SimpleDateFormat format = new SimpleDateFormat("dd/MM/yyyy");
Date dt = format.parse(text);

答案 3 :(得分:1)

只需使用DateTimeFormat来解析您的字符串日期时间:

String dateInString = "9/2/2004";
SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
try {
  Date date = formatter.parse(dateInString);
} catch (ParseException e) {
  e.printStackTrace();
}

答案 4 :(得分:0)

  

问题:这是怎么回事?出了什么问题?

两个基本错误:

  1. 您尝试手动分析日期字符串。推荐的方法是使用库方法来解析日期。
  2. 您使用了错误的类。 DateGregorianCalendar早已过时,不再推荐,因为它们的设计总是很差。此外,尽管它们的名称不代表日期({Date是时间点,而GregorianCalendar是特定时区中的日期和时间)。

用这些旧类弄错事情很容易,所以也难怪你也做过,成千上万的工作要做(只需看看有多少Stack Overflow问题可以解决这个问题)。更具体地说明了什么:您将数字2004、2和9正确传递给了GregorianCalendar构造函数。该构造函数将参数依次指定为年,月和日。此外,它还令人困惑地假设基于0的月份,其中0表示一月,因此2表示三月。因此,您会在JVM的默认时区中于2004年3月9日00:00:00到达。

但是2004年4月20日呢?当月份是0到11时,则20不能是一个月。具有默认设置的GregorianCalendar无关紧要,它只是进行推断,并在第二年持续数月。因此,第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和小写的du。所有可能的格式字母都在文档中。

链接