Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
无法在Java中创建正确的日期对象_Java_Date - Fatal编程技术网

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

无法在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(); 但是,当我尝试

我试图从格式为“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();
但是,当我尝试输出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
    是特定时区中的日期和时间)
  • 这些旧类很容易出错,所以难怪您也这么做了,在您之前已经做过数千次了(看看有多少堆栈溢出问题证明了这一点)。更具体的情况是:您正确地将数字2004、2和9传递给了
    GregorianCalendar
    构造函数。该构造函数按该顺序将参数设置为年、月和日。此外,它还令人困惑地假设了一个以0为基础的月,其中0表示一月,所以2表示三月。因此,在您的JVM的默认时区

    但是2004年4月20日,那么?当月份从0到11时,20不能是一个月。带有默认设置的a
    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
    和小写
    d
    u
    。所有可能的格式字母都在文档中

    链接
    • 解释如何使用
      java.time
    • (包括图案字母)
    问题:这里发生了什么?出了什么问题

    两件基本的事情出了问题:

  • 您试图手动分析日期字符串。建议使用库方法分析日期
  • 您使用了错误的类。
    Date
    gregorianalendar
    早已过时,不再推荐,这也是因为它们的设计总是很糟糕。此外,尽管它们的名称并不代表日期(日期是时间点,
    gregorianalendar
    是特定时区中的日期和时间)
  • 这些旧类很容易出错,所以难怪您也这么做了,在您之前已经做过数千次了(看看有多少堆栈溢出问题证明了这一点)。更具体的情况是:您正确地将数字2004、2和9传递给了
    GregorianCalendar
    构造函数。该构造函数按该顺序将参数设置为年、月和日。此外,它还令人困惑地假设了一个以0为基础的月,其中0表示一月,所以2表示三月。因此,在您的JVM的默认时区

    但是2004年4月20日,那么?当月份从0到11时,20不能是一个月。带有默认设置的a
    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
    和小写
    d
    u
    。所有可能的格式字母都在文档中

    链接
    • 解释如何使用
      java.time
    • (包括图案字母)

    您已转换了日期和月份(假设为美国日期格式),并且
    GregoriaCalendar
    月份索引(不幸的是)以0为基础,因此您必须添加1。可能重复(以及许多其他问题,如果您需要更多灵感,请搜索)。我建议您避免使用
    Date
    GregorianCalendar
    类。它们是