【发布时间】:2017-11-10 06:47:46
【问题描述】:
我正在尝试用 java.time 替换 org.joda.time.Period。
我们在 DB 中存储了以下值。
P1M, P1Y, P1D, PT1H, PT1M
只是为了解析这个值,
Period monthly = ISOPeriodFormat.standard().parsePeriod(<One of the above value from DB>);
这很简单,并且按预期获得 Period 。但是,现在换成 java.time 就麻烦了。
因为,P1D, P1M, P1Y 应该使用下面的代码来解析,
java.time.Period period = java.time.Period.parse("P1M");
并且,P1H and 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 是01/01/2015 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 那样同时具有周期和时间的组合。但可以是任意数量的月、年或天。
【问题讨论】:
-
我不认为您打算在最后一次代码 sn-p 中除以 1000 的最后两次,分别是年份和月份。
-
您可能想在 ThreeTen Extra 项目中查看
org.threeten.extra.PeriodDuration。 -
我想(像你一样?)我宁愿把所有的解析都留给库方法。一种选择是尝试同时解析为
Period和Duration,然后选择一个可行的。 -
您确定您的经期始终是
Period还是Duration?或者反过来说,P1MT1H之类的内容是否会出现在您的数据中?