tl;博士
使用standard ISO 8601 formatting 作为您的时间跨度文本:P13W2DT16H42M。
使用 java.time 框架和 ThreeTen-Extra 库中的现代日期时间类:Instant、PeriodDuration 和 Duration .
Instant
.now()
.plus(
PeriodDuration
.parse(
"P" +
"13 weeks, 2 days, 16 hours, 42 minutes"
.replace( " weeks, " , "W" )
.replace( " days, " , "DT" )
.replace( " hours, " , "H" )
.replace( " minutes" , "M" )
)
)
2019-08-18T18:30:42.007034Z
详情
您将两个不同的概念混为一谈:
-
时刻,时间轴上的一个点
- 一个时间跨度未附加到时间线
时刻
暂时,我们不再使用java.util.Date 类。那个可怕的类在几年前被java.time.Instant 类所取代。
Instant instant = Instant.now() ; // Capture the current moment in UTC.
时间跨度
你的输入字符串不代表片刻。它代表一个时间跨度。
对于年-月-日的跨度,我们使用Period 类。对于以小时-分钟-秒为单位的跨度,我们使用Duration。
PeriodDuration
您可以使用从ThreeTen-Extra 项目构建的外部库中的PeriodDuration 类来组合这两个概念。但是你应该三思而后行。将这两种粒度结合起来几乎没有实际意义。
但是,如果你坚持,让我们试一试。
首先,更改您的输入字符串以使用标准ISO 8601 format 或PnYnMnDTnHnMnS。在这种格式中,P 标志着开始,T 将粗粒度与细粒度分开。
String input = "P" + "13 weeks, 2 days, 16 hours, 42 minutes".replace( " weeks, " , "W" ).replace( " days, " , "DT" ).replace( " hours, " , "H" ).replace( " minutes" , "M" ) ;
P13W2DT16H42M
将新输入解析为PeriodDuration。
PeriodDuration pd = PeriodDuration.parse( input );
以 UTC 捕捉当前时刻。
Instant now = Instant.now();
now.toString(): 2019-05-17T01:48:42.007034Z
添加您的时间段以确定未来的时刻。
Instant later = now.plus( pd );
later.toString(); 2019-08-18T18:30:42.007034Z
如果您想要过去的时刻而不是未来的时刻,请致电Instant::minus。
Instant earlier = now.minus( pd ) ;
经过的分钟数
如果您想要这两个时刻之间经过的总分钟数,请使用Duration 类。
Duration d = Duration.between( now , later ) ;
long minutesTotal = d.toMinutes() ;
分钟总数:134922
时区
如果您想处理特定地区(时区)人们使用的挂钟时间感知的时刻,请使用 ZonedDateTime 和 ZoneId 类。调用同名的plus/minus 方法,如上所示。
ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime now = ZonedDateTime.now( z ) ;
ZoneDateTime earlier = now.minus( pd ) ;
关于java.time
java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。
要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。
Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。
您可以直接与您的数据库交换 java.time 对象。使用符合JDBC 4.2 或更高版本的JDBC driver。不需要字符串,不需要java.sql.* 类。
从哪里获得 java.time 类?
ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。