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

时间:2015-12-10 09:22:55

标签: java date calendar simpledateformat

创建日历对象并使用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行会将日历对象的日期部分重置为现在只是更改时间吗?

2 个答案:

答案 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)

TL;博士

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.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 );

ISO 8601

顺便说一下,将来将日期,时间或日期时间序列化为字符串时,就像在SQLite数据库中那样,我强烈建议使用标准ISO 8601格式:{{1 },YYYY-MM-DDHH: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.time框架内置于Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendar和& SimpleDateFormat

现在位于Joda-Timemaintenance 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的试验场。您可以在此处找到一些有用的课程,例如IntervalYearWeekYearQuartermore