- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在尝试用 java.time 替换 org.joda.time.Period。
我们在数据库中存储了以下值。
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 和 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 找出从某个开始时间到截止日期的出现次数。
比如,如果 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 那样同时具有 Period 和 time 的组合。但可能有任何月数、年数或天数。
最佳答案
Java-8 没有类 org.joda.time.Period
这样复杂的持续时间类型。但是您可以直接创建自己的接口(interface) TemporalAmount
实现:
import java.time.DateTimeException;
import java.time.temporal.ChronoUnit;
import java.time.temporal.Temporal;
import java.time.temporal.TemporalAmount;
import java.time.temporal.TemporalUnit;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import static java.time.temporal.ChronoUnit.*;
public class SimpleDuration implements TemporalAmount {
private static final List<TemporalUnit> SUPPORTED_UNITS =
Collections.unmodifiableList(Arrays.asList(YEARS, MONTHS, DAYS, HOURS, MINUTES));
private final int amount;
private final ChronoUnit unit;
private SimpleDuration(int amount, ChronoUnit unit) {
this.amount = amount;
this.unit = unit;
}
public static SimpleDuration of(int amount, ChronoUnit unit) {
if (SUPPORTED_UNITS.contains(unit)) {
return new SimpleDuration(amount, unit);
} else {
throw new IllegalArgumentException("Not supported: " + unit);
}
}
@Override
public long get(TemporalUnit unit) {
if (this.unit.equals(unit)) {
return this.amount;
}
return 0;
}
@Override
public List<TemporalUnit> getUnits() {
return SUPPORTED_UNITS;
}
@Override
public Temporal addTo(Temporal temporal) {
return temporal.plus(this.amount, this.unit);
}
@Override
public Temporal subtractFrom(Temporal temporal) {
return temporal.minus(this.amount, this.unit);
}
@Override
public boolean equals(Object obj) {
if (obj instanceof SimpleDuration) {
SimpleDuration that = (SimpleDuration) obj;
return this.unit == that.unit && this.amount == that.amount;
} else {
return false;
}
}
@Override
public int hashCode() {
return this.unit.hashCode() + 37 * Integer.hashCode(this.amount);
}
@Override
public String toString() {
StringBuilder sb = new StringBuilder();
if (this.amount < 0) {
sb.append('-');
}
sb.append('P');
if (this.unit.isTimeBased()) {
sb.append('T');
}
sb.append(Math.abs(this.amount));
switch (this.unit) {
case YEARS :
sb.append('Y');
break;
case MONTHS :
sb.append('M');
break;
case DAYS :
sb.append('D');
break;
case HOURS :
sb.append('H');
break;
case MINUTES :
sb.append('M');
break;
default :
throw new UnsupportedOperationException(this.unit.name());
}
return sb.toString();
}
public static SimpleDuration parse(String input) {
int len = input.length();
int index = 0;
boolean negative = false;
if (len > 0 && input.charAt(0) == '-') {
negative = true; // for XML-Schema (not for ISO-8601)
index++;
}
if (len >= 3 && input.charAt(index) == 'P') {
boolean timeBased = (input.charAt(index + 1) == 'T');
char last = input.charAt(len - 1);
ChronoUnit unit;
switch (last) {
case 'Y' :
unit = YEARS;
break;
case 'M' :
unit = (timeBased ? MINUTES : MONTHS);
break;
case 'D' :
unit = DAYS;
break;
case 'H' :
unit = HOURS;
break;
default :
throw new DateTimeException(
"Unknown unit symbol found at last position: " + input
);
}
if (unit.isTimeBased() != timeBased) {
throw new DateTimeException("Invalid XML-Schema-format: " + input);
}
try {
int amount =
Integer.parseInt(
input.substring(index).substring(timeBased ? 2 : 1, len - 1 - index));
if (amount < 0) {
throw new DateTimeException(
"XML-Schema does not allow negative amounts inside: " + input);
}
return SimpleDuration.of(negative ? -amount : amount, unit);
} catch (NumberFormatException ex) {
throw new DateTimeException("Invalid XML-Schema-format: " + input, ex);
}
}
throw new DateTimeException("Cannot parse: " + input);
}
public static void main(String... args) {
System.out.println(parse("-PT10M")); // -PT10M
}
}
关于java - 将 org.joda.time.Period 转换为 java.time.Period,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47217098/
我写了一个 mdx 脚本来显示 Internet Sales Amount 的周期增长,一切正常。我们正在使用一个界面,您可以在其中放置一个切片器,以便用户可以选择他感兴趣的 date.Calenda
我有一列数据,例如 '1971q1'、'1972q2' 等(年份后跟季度)当我这样做时: print(type(df.Quarterly)) 答案是系列 我需要的是将此列“转换”/转换为真正的 pd.
下面是我要处理的句子。它由前面以两个哈希值 (##2312435) 开头的 ID 以及其余文本组成。我需要一个正则表达式来查找其中包含单词 likely 的句子,并检索整个句子和 ID。 句子: ##
这两条线有什么区别? call apoc.periodic.iterate("MATCH (n:Nodes) return n", "DETACH DELETE n", {batchSize:1000
这个问题在这里已经有了答案: When does Thread.CurrentThread.Join() make sense? (6 个答案) 关闭 9 年前。 有人可以向我解释 Thread.S
我正在尝试用 java.time 替换 org.joda.time.Period。 我们在数据库中存储了以下值。 P1M, P1Y, P1D, PT1H, PT1M 只是解析这个值: Period m
我正在尝试解析 linux dig 的输出使用正则表达式在一次拍摄中执行多项操作。 假设我挖掘主机 mail.yahoo.com : /usr/bin/dig +nocomments +noquest
我正在尝试创建一个匹配以下内容的正则表达式: 一个或多个数字 允许在第一个数字后有 0 到 1 个句点 如果有句号 句点后需要 1 - 2 位数字 这是我目前使用的正则表达式,它并不适用于所有情况:
这是我的代码。我想绘制美国东部夏令时9:30-10点的最高点和最低点。我破解了这个代码,但我搞不清时间了。只有当我将其设置为0800-0900时才有效,这没有任何意义。如果我把它设置为0930-100
我正在制作一个仅用于学习目的的应用程序。我试图计算两个日期之间的差异 LocalDate today = LocalDate.now(); LocalDate localHoudbaarheid =
我正在使用 SEO 友好的 URL,我可以通过 ASP.NET 处理其中的大部分,通过将 aspnet_isapi.dll 映射到所有 URL。 (我在 IIS 中设置了一个处理程序映射,它对所有路径
我准备了以下数据 Timestamp Weighted Value SumVal Group 1 1600 800 1 2
为什么结果为periodBetween.Days和 substracted.Days不同的? 我可以看到一个 periodBetween.Months是 0 和 substracted.Months是
我有生日和第二个 LocalDate.now()我使用 Periof 打印这个 Period test = Period.between(dateofbirth,LocalDa
我使用 cocoa 在 Mac 上开发了一个应用程序。我需要将 cmd + period(.) 键盘事件作为我设计的命令来处理。但现在 cmd + period(.) 键盘事件没有像我预期的那样得到很
我有4000个观测值的数据,所以这是head(both): kön gdk age fbkurs pers stterm 1 man
我有一个包含特定类元素 vector 的类。主要思想是根据序列的一个周期(elems_)和周期数(nperiod_)生成元素的周期性序列,因此我不需要存储所有元素,而只需存储一个周期。 class P
我正在尝试添加句点“。”以及变量的后缀“-on”(下面第 4 行): function globalProducts(cat, self){ $("div.info").hide();
例如: requests.get() 是一个带有句点的函数。我如何制作自己的函数,例如: def foo(): return 'bar' 并像这样调用该函数: x.foo() 不是这样的: f
我尝试使用java.time.Period,结果与我手动计算的结果相差了三天。这里奇怪的是,当我将时间段分为两个时间段时,结果与我的手动计算相符。 第二种方法就像我手动计算周期一样。 我是不是漏掉了什
我是一名优秀的程序员,十分优秀!