日期字段的解析错误
我想以YYYY-MM-DD
格式将日期解析为YYYYMMDD
。 如果我使用以下函数,它返回YYYYMMDD
格式但具有不同的DD。 iE: 2013-05-16
成为20130515
听起来为文盲道歉:)我是Java的新手。
任何帮助,将不胜感激。
String TestDate=yyyymmddParser.format(oLifEExtension.TestDate().getTime()); sb.append(TestDate)
SimpleDateFormat
应该能够实现您所追求的目标。 对格式标记要非常小心, D
和d
意味着不同的东西
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);
(另外,要小心Y
和y
: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/Montreal
, Africa/Casablanca
或Pacific/Auckland
。 切勿使用3-4字母缩写,例如EST
或IST
因为它们不是真正的时区,不是标准化的,甚至不是唯一的(!)。
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.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参阅Oracle教程 。 并搜索Stack Overflow以获取许多示例和解释。 规范是JSR 310 。
从哪里获取java.time类?
- Java SE 8 , Java SE 9及更高版本
- 内置。
- 带有捆绑实现的标准Java API的一部分。
- Java 9增加了一些小function和修复。
- Java SE 6和Java SE 7
- 许多java.timefunction都被反向移植到ThreeTen-Backport中的 Java 6和7。
- Android的
- ThreeTenABP项目特别适用于Android的ThreeTen-Backport (如上所述)。
- 请参见如何使用ThreeTenABP ….
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目是未来可能添加到java.time的试验场。 您可以在这里找到一些有用的课程,如Interval
, YearWeek
, YearQuarter
等。