日期字段的解析错误

我想以YYYY-MM-DD格式将日期解析为YYYYMMDD 。 如果我使用以下函数,它返回YYYYMMDD格式但具有不同的DD。 iE: 2013-05-16成为20130515

听起来为文盲道歉:)我是Java的新手。

任何帮助,将不胜感激。

 String TestDate=yyyymmddParser.format(oLifEExtension.TestDate().getTime()); sb.append(TestDate) 

SimpleDateFormat应该能够实现您所追求的目标。 对格式标记要非常小心, Dd意味着不同的东西

 String oldDateString = "2013-05-16"; System.out.println(oldDateString ); Date date = new SimpleDateFormat("yyyy-MM-dd").parse(oldDateString); System.out.println(date); String newDateString = new SimpleDateFormat("yyyyMMdd").format(date); System.out.println(newDateString); 

(另外,要小心Yy :P)

这输出

 2013-05-16 Thu May 16 00:00:00 EST 2013 20130516 

为了我…

不确定问题是针对java.util.Date (日期加上时间)还是java.sql.Date (仅限日期)。 在这两种情况下,您应该使用现代java.time类而不是麻烦的遗留日期时间类。

其他一些java.sql.Date问题被链接为此问题的副本。 所以我在这里处理这两个类(sql和util)。

java.util.Date

旧的java.util.Date类表示UTC时间轴上的时刻。 这意味着带有时间的日期。 诀窍是你的输入字符串是一个仅限日期的值。 您可以先将字符串解析为仅日期值,然后根据需要指定时间。

您的输入字符串符合YYYY-MM-DD的标准ISO 8601格式。 解析/生成字符串时,java.time类默认为标准格式。 因此无需指定格式化模式。

 LocalDate ld = LocalDate.parse( "2013-05-16" ) ; 

对于一天中的某个时间,您可能想要一天的第一时刻。 不要假设第一时刻是00:00:00 。 在某些时区,诸如夏令时(DST)之类的exception可能导致一天在不同的时间开始,例如01:00:00 。 为了解释这种exception,我们必须在确定当天的第一时刻时指定一个时区。

continent/region的格式指定适当的时区名称 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 。 切勿使用3-4字母缩写,例如ESTIST因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。

 ZoneId z = ZoneId.of( "America/Montreal" ) ; 

在请求java.time时应用该区域以确定当天的第一时刻。 我们生成一个ZonedDateTime对象作为结果。

 ZonedDateTime zdt = ld.atStartOfDay( z ) ; 

如果您需要特定时间,请应用LocalTime对象。 请注意,您的时间可能在该特定区域的特定日期无效。 例如,您可能正在指定DST转换期间发生的时间。 在这种情况下, ZonedDateTime类具有用于调整以适应的策略。 请务必阅读文档以了解该策略及其产生的行为。

 LocalTime lt = LocalTime.of( 12 , 0 ) ; ZonedDateTime zdt = ZonedDateTime.of( ld , lt , z ) ; // Time-of-day may be adjusted as needed. 

java.sql.Date

无需使用java.sql.Date 。 该类由LocalDate替换。 LocalDate类表示没有时间且没有时区的仅日期值。

符合JDBC 4.2的JDBC驱动程序可以通过调用以下方法直接处理java.time类型:

  • PreparedStatement::setObject
    myPrepStmt.setObject(…,myLocalDate);
  • ResultSet::getObject
    LocalDate ld = myResultSet.getObject(…,LocalDate.class);

要向用户显示LocalDate ,请生成一个String,以便在用户界面中显示。 使用DateTimeFormatter自动本地化。 要进行本地化,请指定:

  • FormatStyle用于确定字符串的长度或缩写。
  • 用于确定(a)用于翻译日期名称,月份名称等的人类语言的Locale ,以及(b)决定缩写,大小写,标点符号,分隔符等问题的文化规范。

例:

 Locale l = Locale.CANADA_FRENCH ; DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate( FormatStyle.MEDIUM ).withLocale( l ); String output = zdt.format( f ); 

您也可以转向另一个方向, 解析输入字符串以获取日期。

 LocalDate ld = LocalDate.parse( input , f ) ; 

如果用户输入错误或意外,则抛出exception陷阱。

 try{ LocalDate ld = LocalDate.parse( input , f ) ; myPrepStmt.setObject( … , ld ) ; } catch ( DateTimeParseException e ) { … // Handle the error condition of faulty/unexpected input by user. } 

关于java.time

java.time框架内置于Java 8及更高版本中。 这些类取代了麻烦的旧遗留日期时间类,如java.util.DateCalendarSimpleDateFormat

现在处于维护模式的Joda-Time项目建议迁移到java.time类。

要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。

从哪里获取java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置。
    • 带有捆绑实现的标准Java API的一部分。
    • Java 9增加了一些小function和修复。
  • Java SE 6Java SE 7
    • 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
  • Android的
    • ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
    • 请参见如何使用ThreeTenABP ….

ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如IntervalYearWeekYearQuarter等。