创建日历对象并使用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行会将日历对象的日期部分重置为现在只是更改时间吗?
答案 0 :(得分:1)
是的。
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));
应该为你效劳。
答案 1 :(得分:0)
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 [太平洋/奥克兰]
Jan的Answer是正确的。
或者,您可以使用新的日期时间框架java.time。
Java 8及更高版本中内置的java.time框架取代了棘手的旧java.util.Date/.Calendar类。新课程的灵感来自非常成功的Joda-Time框架,旨在作为其继承者,在概念上类似但重新设计。由JSR 310定义。由ThreeTen-Extra项目扩展。请参阅Tutorial。
如果您的输入缺少offset-from-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 );
顺便说一下,将来将日期,时间或日期时间序列化为字符串时,就像在SQLite数据库中那样,我强烈建议使用标准ISO 8601格式:{{1 },YYYY-MM-DD
和HH:MM
。例如,YYYY-MM-DDTHH:MM:SS.S±00:00
。这些格式是标准化的,易于人们阅读和辨别,并且计算机易于解析而不会产生歧义。
默认情况下,java.time框架以这些格式解析并生成字符串。此外,java.time通过在方括号中附加时区名称来扩展ISO 8601。例如,2007-12-03T10:15:30+01:00
。
java.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和& SimpleDateFormat
现在位于Joda-Time的maintenance mode项目建议迁移到java.time类。
要了解详情,请参阅Oracle Tutorial。并搜索Stack Overflow以获取许多示例和解释。规范是JSR 310。
如果JDBC driver符合JDBC 4.2或更高版本,您可以直接与数据库交换 java.time 对象。不需要字符串或java.sql。* classes。
从哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展java.time。该项目是未来可能添加到java.time的试验场。您可以在此处找到一些有用的课程,例如Interval
,YearWeek
,YearQuarter
和more。