我正在尝试用java.time替换org.joda.time.Period。
我们在数据库中存储以下值:
P1M, P1Y, P1D, PT1H, PT1M
仅需解析此值:
Period monthly = ISOPeriodFormat.standard().parsePeriod(<One of the above value from DB>);
这很简单,而且可以按预期获取时间段。但是,现在使用java.time替换会很麻烦。
因为,P1D, P1M, P1Y
应该使用以下代码进行解析:
java.time.Period period = java.time.Period.parse("P1M");
而且,应该使用以下代码解析P1H和P1D
。
Duration dailyD = Duration.parse("P1D");
所以,我可能还需要一些字符串检查,例如:
if(value.startsWith("PT")) {
// Use java.time.Duration
} else {
// Use java.time.Period
}
这个逻辑有没有更好的代码实现?
另外,最终,我需要根据上述 java.time.Period 或 java.time.Duration 找到从某个 startTime 到现在日期的事件次数。
比如,如果 startDateTime 是 2015年1月1日08:30
:
LocalDateTime startDateTime = // the above startDateTime ..
if(value.startsWith("PT")) {
// Use java.time.Duration
ChronoUnit.SECONDS.between(startDateTime,curentDate)/(duration.toMillis()/1000)
} else {
if(value.endsWith("Y")) {
// Use java.time.Period
ChronoUnit.YEARS.between(startDateTime,curentDate)/(period.getYears()/1000)
} else if(value.endsWith("M")){
ChronoUnit.MONTHS.between(startDateTime,curentDate)/(period.getMonths()/1000)
}
有没有其他更好的方法来避免这种值解析?
我的输入可能为P2M、P10M、P2Y、PT15M、PT10M。它不会像P1MT10M这样同时包含Period和时间的组合。但是可能有任意数量的月份、年份或天数。
org.threeten.extra.PeriodDuration
。 - Ole V.V.java.time.Duration
,那么原始信息(例如一天或86400秒)将丢失,因为该类型仅存储秒和纳秒。关于java.time.Period
,它会自动将一周转换为七天,这可能不是您想要的。在我看来,我会避免转换,因为与 JodaTime 相比,java.time
类型在这里受到了太多限制。 - Meno Hochschild