当创建日历对象并使用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是否将日历对象的日期部分重置为现在,然后只更改时间?
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-DD
,HH: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类?
额外的Three Ten项目扩展了java。有额外课程的时间。这个项目是java未来可能增加的一个试验场。时间您可以在这里找到一些有用的类,如Interval
、YearWeek
、YearQuarter
,等等。
是的,会的。
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。 有人可以解释发生了什么,为什么上周该测试仍然有效? 问题答案: 首先要了解的是,