Java Calendar对象,分别设置日期和时间



创建日历对象并使用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的偏移量,那么我们可以分别处理日期和时间。新类包括LocalDateLocalTime,前者表示不带日期的仅限日期的值,后者表示不带时间的仅限时间的值。然后你可以将它们组合起来,并调整到它们想要的时区。

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-DDHH:MMYYYY-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.DateCalendar和&CCD_ 11。

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

要了解更多信息,请参阅Oracle教程。并在Stack Overflow中搜索许多示例和解释。规范是JSR310。

使用符合JDBC 4.2或更高版本的JDBC驱动程序,您可以直接与数据库交换java.time对象。不需要字符串或java.sql.*类。

从哪里获得java.time类?

  • Java SE 8Java SE 9及更高版本
    • 内置
    • 标准Java API的一部分,带有捆绑实现
    • Java 9添加了一些小功能和修复程序
  • Java SE 6Java SE 7
    • 大部分java.time功能都是向后移植到Java6&7英寸ThreeTen背包
  • 安卓
    • java.time类的Android捆绑包实现的后续版本
    • 对于早期的Android,ThreeTenABP项目适用于ThreeTen Backport(如上所述)。请参阅如何使用ThreeTenABP…

ThreeTen Extra项目通过附加类扩展java.time。这个项目是将来可能添加到java.time的试验场。您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter等等。

最新更新