当前位置: 首页 > 知识库问答 >
问题:

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

施锋
2023-03-14

当创建日历对象并使用SimpleDataFormat解析字符串来设置日期/时间时,是否可以在两行单独的代码中设置日期和时间?例如,在我的SQLite数据库中,日期(mm-dd-yyy)与时间(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));

第二个是卡尔。setTime line是否将日历对象的日期部分重置为现在,然后只更改时间?

共有2个答案

宇文兴言
2023-03-14
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 8内置了时间框架,后来取代了麻烦的旧Java。util。日期/。日历课程。新课程的灵感来源于非常成功的Joda时间框架,该框架旨在作为其继任者,在概念上类似,但经过重新设计。由JSR 310定义。再加上三个额外的项目。请参阅教程。

如果您的输入缺少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的答案相同的方法,连接这对字符串,然后解析。

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格式:YYYY-MM-DDHH:MM,以及YYYY-MM-DDTHH:MM:SS。S±00:00。例如,2007-12-03T10:15:30 01:00。这些格式是标准化的,便于人类阅读和识别,也便于计算机解析而不产生歧义。

爪哇。默认情况下,时间框架解析并生成这些格式的字符串。还有java。时间通过在方括号中添加时区名称来扩展ISO 8601。例如,2007-12-03T10:15:30 01:00[欧洲/巴黎]

爪哇。时间框架内置于Java8及更高版本中。这些类取代了麻烦的旧遗留日期时间类,比如java。util。日期日历

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

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

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

在哪里获得java.time类?

  • JavaSE8、JavaSE9及更高版本
    • 内置的
    • 标准Java API的一部分,带有捆绑实现
    • Java9增加了一些小功能和修复
    • 许多java.time功能被反向移植到Java6
    • java.time类的Android捆绑包实现的后续版本。
    • 对于早期的Android,ThreeTenABP项目适应了ThreePre-Backport(上面提到)。请参阅如何使用ThreeTenABP......

    额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间您可以在这里找到一些有用的类,如IntervalYearWeekYearQuarter,等等。

乌翔
2023-03-14

是的,会的。

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

应该对你有用。

 类似资料:
  • 问题内容: 我有一个电影课,里面有开始日期,持续时间和结束日期。开始和停止日期是日期对象(私有日期startDate …)(这是一个分配,因此我无法更改),现在我想通过将持续时间(以分钟为单位)添加到startDate中来自动计算stopDate。 据我所知,不赞成使用Date的时间操作功能,因此是不好的做法,但另一方面,我看不到将Date对象转换为日历对象以操纵时间并将其重新转换为Date对象的

  • 预订类别: 这是保存到导致错误的文本文件中的内容: 1:java.util.GregorianCalendar[time=851385600000,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.zoneInfo[id=“欧洲/伦敦”,offset=0,dstSavings=3600000,use

  • 问题内容: 我有一个小时,分钟,日期和毫秒时间戳,并且正在尝试创建一个表示时间的Date对象。时间戳记是美国东部夏令时。 在剖析问题时,我创建了一些简单的测试代码以查看发生了什么,并观察到以下内容: 产生输出: 但是,如果我稍微更改代码: 我得到以下(不同)结果(!) 有人知道为什么会这样吗? 问题答案: 您需要先设置时区。请参阅下面的GregorianCalendar.setTimeZone的定

  • 我希望使用calendar对象显示日期。 ...和... 我面临的问题是,为什么以下输出中的出生日期会给我一条未知的、荒谬的长线: ID员工编号:123 员工姓名:明武 出生日期:java.util.GregorianCalendar[time=?, areFieldsSet=false, areAllFieldsSet=true, lenient=true, zone=sun.util.cale

  • 问题内容: 我用Java 创建了一个对象。当我这样做时,它显示如下:。结果,我的Excel文件似乎减少了一天(27 feb变为26 feb,依此类推),我认为这一定是因为时间的缘故。如何将其设置为下午5:30? 问题答案: 另请参阅 乔达时间 日历文件

  • 问题内容: 我在JUnit测试中有以下代码,该代码上周似乎正常工作,但本周失败了: 您可能会从我的评论中推断出,由于12日是星期二,因此我希望将DAY_OF_WEEK设置为星期五后,日期将为15。但是,打印的值为22,并导致测试失败。 但是,如果我将代码更改如下,并添加另一个调用以获取: 我得到预期的输出12和15。 有人可以解释发生了什么,为什么上周该测试仍然有效? 问题答案: 首先要了解的是,