我想用Java 8 DateTime API
代替JodaTime
。
我已经描述了ISO-8601
周期= P2W5DT11H8M
JodaTime
中,我通过执行以下代码非常简单地解析它:
Period.parse("P2W5DT11H8M")
和我得到成功的Period
对象。
我可以在Java 8做同样的吗?
Java 8中的Period只有年/月/日组件。Duration有小时/分钟/秒组成部分。看起来您需要手动解析字符串。一个选项可能看起来像下面的代码(你需要添加输入验证等)-可能有更好的选择。
public static void main(String[] args) {
System.out.println(PeriodAndDuration.parse("P2W5DT11H8M"));
}
public static class PeriodAndDuration {
private final Period p;
private final Duration d;
public PeriodAndDuration(Period p, Duration d) {
this.p = p;
this.d = d;
}
public Period getPeriod() {
return p;
}
public Duration getDuration() {
return d;
}
public static PeriodAndDuration parse(String input) {
int periodStart = input.indexOf("P");
int timeStart = input.indexOf("T");
Period p = Period.parse(input.substring(periodStart, timeStart));
Duration d = Duration.parse("P" + input.substring(timeStart, input.length()));
return new PeriodAndDuration(p, d);
}
@Override
public String toString() {
return p.toString() + d.toString();
}
}
PeriodDuration
Period.parse (P2W5DT11H8M)
我可以在Java 8做同样的吗?
是的。
org.threeten.extra.PeriodDuration.parse( "P2W5DT11H8M" )
ThreeTen-Extra项目
java。Java 8及以后版本中内置的time类由ThreeTen-Extra项目补充。这个项目是由与运行Joda-Time和JSR 310 (java.time的规范)的人Stephen Colebourne运行的。
该项目提供了结合了java.time中Period
和Duration
类的思想的PeriodDuration
。
PeriodDuration.parse
的文档说:
从文本字符串(如PnYnMnDTnHnMnS)中获取实例。
PeriodDuration pd = PeriodDuration.parse( "P2W5DT11H8M" ) ;
<标题>警告h1> 使用PeriodDuration
之前要三思。年-月-日和时-分-秒这两个概念在java中是分开的。时间是有原因的。如果你仔细考虑一下,你可能会发现在实践中把两者结合起来可能没有意义。
如果要继续使用这个类,请务必研究文档及其行为。练习一些场景,看看它是否符合你的期望和需要。
<标题>对 java.time
java。time框架内置于Java 8及以后版本中。这些类取代了麻烦的旧的遗留日期时间类,如java.util.Date
, Calendar
, &SimpleDateFormat
.
Joda-Time项目,现在处于维护模式,建议迁移到java。时间类。
要了解更多信息,请参阅Oracle教程。并搜索Stack Overflow以获得许多示例和解释。规格为JSR 310。
可以交换java。Time 直接与数据库关联。使用符合JDBC 4.2或更高版本的JDBC驱动程序。不需要字符串,不需要java.sql.*
类。
从哪里获取java。时间类?
- Java SE 8、Java SE 9、Java SE 10等
- 内置。
- 标准Java API的一部分,捆绑实现。
Java 9增加了一些小的特性和修复。
- 大部分java。时间功能向后移植到Java 6;7在 ThreeTen-Backport 。
- Android版本的java bundle实现。时间类。
- 对于早期的Android (<26), ThreeTenABP项目适应ThreeTen-Backport(如上所述)。参见如何使用ThreeTenABP…。
Interval
、YearWeek
、YearQuarter
等。
标题>标题>简短回答:
Period period = Period.parse("P2W5DT11H8M");
长回答:Oracle对何时使用Period或Duration有很好的描述。它附带了一些很好的代码示例,应该可以回答您可能遇到的任何后续问题。