创建日历对象并使用SimpleDateFormat设置日期/时间以解析字符串时,是否可以在两行单独的代码中设置日期和时间?例如,在我的SQLite数据库中,日期(mm-dd-yyyy)与时间(hh:mm)存储在一个单独的列中。做这样的事情是犹太洁食吗:
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdfDate = new SimpleDateFormat("MM-dd-yyyy");
SimpleDateFormat sdfTime = new SimpleDateFormat("hh:mm zzz");
cal.setTime(sdfDate.parse(DATE));
cal.setTime(sdfTime.parse(TIME));
第二个cal.setTime行会将日历对象的日期部分重置为现在并只更改时间吗?
setTime()
设置时间,而不管日期是否包含时间值(00:00:00)或日期值(01.01.1970)。
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdfDate = new SimpleDateFormat("MM-dd-yyyy hh:mm zzz");
cal.setTime(sdfDate.parse(DATE+ " " + TIME));
应该对你有用。
tl;dr
ZonedDateTime.of(
LocalDate.parse( "12-23-2015" , DateTimeFormatter.ofPattern( "MM-dd-yyyy") ) ,
LocalTime.parse( "21:43" ) ,
ZoneId.of( "Pacific/Auckland" )
)
.toString()
2015-12-23T21:43+13:00〔太平洋/奥克兰〕
详细信息
简的回答是正确的。
java.time
或者,您可以使用新的日期-时间框架java.time.
java 8中内置的java.time框架以及后来的版本取代了麻烦的旧java.util.Date/.Calendar类。新类的灵感来自于非常成功的Joda Time框架,该框架旨在作为其继任者,在概念上类似,但经过了重新设计。由JSR 310定义。由ThreeTen Extra项目扩展。请参见教程。
如果您的输入缺少与UTC的偏移量,那么我们可以分别处理日期和时间。新类包括LocalDate
和LocalTime
,前者表示不带日期的仅限日期的值,后者表示不带时间的仅限时间的值。然后你可以将它们组合起来,并调整到它们想要的时区。
DateTimeFormatter formatterDate = DateTimeFormatter.ofPattern( "MM-dd-yyyy");
LocalDate localDate = LocalDate.parse( "12-23-2015" , formatterDate );
LocalTime localTime = LocalTime.parse( "21:43" );
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.of( localDate , localTime , zoneId );
但是您的时间字符串确实包含与UTC的偏移量。因此,我们应该采用与Jan的Answer相同的方法,连接这对字符串,然后进行解析。
String input = "12-23-2015" + " " + "21:43-05:00" ;
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM-dd-yyyy HH:mmxxx");
ZonedDateTime zdt = ZonedDateTime.parse( input , formatter );
ISO 8601
顺便说一句,在将来将日期、时间或日期时间序列化为字符串时,如您在SQLite数据库中所做的那样,我强烈建议使用标准ISO 8601格式:YYYY-MM-DD
、HH:MM
和YYYY-MM-DDTHH:MM:SS.S±00:00
。例如,2007-12-03T10:15:30+01:00
。这些格式是标准化的,人类很容易阅读和辨别,计算机也很容易解析而不会产生歧义。
默认情况下,java.time框架解析并生成这些格式的字符串。此外,java.time通过将时区名称附加在方括号中来扩展ISO8601。例如,2007-12-03T10:15:30+01:00[Europe/Paris]
。
关于java.time
java.time框架构建在Java8及更高版本中。这些类取代了诸如java.util.Date
、Calendar
和&CCD_ 11。
现在处于维护模式的JodaTime项目建议迁移到java.Time类。
要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。
使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类。
从哪里获得java.time类?
- Java SE 8、Java SE 9及更高版本
- 内置
- 标准Java API的一部分,带有捆绑实现
- Java 9添加了一些小功能和修复程序
- Java SE 6和Java SE 7
- 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
- 安卓
- java.time类的Android捆绑包实现的后续版本
- 对于早期的Android,ThreeTenABP项目适用于ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…
ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
等等。