tl; dr
LocalDateTime.parse(
"2016-01-23 12:34".replace( " " , "T" )
)
.atZone( ZoneId.of( "Asia/Karachi" ) )
.plusMinutes( 10 )
java.time
使用出色的java.time类进行日期时间工作。这些类取代了麻烦的旧日期时间类,例如java.util.Date
和java.util.Calendar
。
ISO 8601
默认情况下,java.time类使用标准ISO 8601格式来解析/生成日期时间值的字符串。为了使您的输入字符串符合要求,请将中间的SPACE替换为T
。
String input = "2016-01-23 12:34" ;
String inputModified = input.replace( " " , "T" );
LocalDateTime
将输入字符串解析为,LocalDateTime
因为它缺少有关时区或UTC偏移量的任何信息。
LocalDateTime ldt = LocalDateTime.parse( inputModified );
加十分钟。
LocalDateTime ldtLater = ldt.plusMinutes( 10 );
ldt.toString():2016-01-23T12:34
ldtLater.toString():2016-01-23T12:44
请参阅IdeOne.com中的实时代码。
那LocalDateTime
有没有时区,所以它并不能代表在时间轴上的一个点。应用时区以转换为实际时刻。指定适当的时区名称,格式continent/region
,如America/Montreal
,Africa/Casablanca
或Pacific/Auckland
,或Asia/Karachi
。切勿使用3-4个字母的缩写,如EST
或IST
或PKT
因为他们没有真正的时区,不规范,甚至不是唯一的(!)。
ZonedDateTime
如果您知道该值的预期时区,请应用ZoneId
来获取ZonedDateTime
。
ZoneId z = ZoneId.of( "Asia/Karachi" );
ZonedDateTime zdt = ldt.atZone( z );
zdt.toString():2016-01-23T12:44 + 05:00 [亚洲/卡拉奇]
异常现象
考虑在添加时区之前还是之后的十分钟添加这些时间。由于诸如夏令时(DST)之类的异常会改变挂钟时间,您可能会得到截然不同的结果。
是否应在添加区域之前或之后添加10分钟,这取决于业务场景和规则的含义。
提示:如果您打算在时间线上指定某个时刻,请务必保留时区信息。不要像输入数据一样丢失该信息。该值12:34
是要在巴基斯坦中午,在法国中午还是在魁北克中午?如果您是在巴基斯坦中午表示,请至少包含UTC偏移量(+05:00
),最好还包括时区的名称(Asia/Karachi
)。
Instant
如果您希望通过UTC镜头看到相同的瞬间,请提取一个Instant
。该Instant
级表示时间轴上的时刻UTC,分辨率为纳秒(最多小数的9个位数)。
Instant instant = zdt.toInstant();
兑换
尽可能避免使用麻烦的旧日期时间类。但是,如果必须,您可以进行转换。调用添加到旧类中的新方法。
java.util.Date utilDate = java.util.Date.from( instant );
关于java.time
该java.time框架是建立在Java 8和更高版本。这些类取代麻烦的老传统日期时间类,如java.util.Date
,Calendar
,和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time。
要了解更多信息,请参见Oracle教程。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
在哪里获取java.time类?
该ThreeTen-额外项目与其他类扩展java.time。该项目是将来可能向java.time添加内容的试验场。你可能在这里找到一些有用的类,比如Interval
,YearWeek
,YearQuarter
,和更多。