如何用Java解析基于时间令牌?(1M 1M 1D 1Y 1W 1S)

gstackoverflow:

我得到以下从FE字符串:

1m
5M
3D
30m
2h
1Y
3W

它对应于1分钟,5个月,3天,30分钟,2小时,1年,3周。

有没有意思在Java解析呢?

我想操纵(加/减)与即时(或LocalDatetTime)。有没有办法做到这一点在Java中?

奥莱VV:

PeriodDuration

我认为以下解决方案简单且相当普遍的(不完全通用)。

public static TemporalAmount parse(String feString) {
    if (Character.isUpperCase(feString.charAt(feString.length() - 1))) {
        return Period.parse("P" + feString);
    } else {
        return Duration.parse("PT" + feString);
    }
}

看来你的基于日期的单位(年,月,周,日)被标以大写字母缩写(YMWD而基于时间的(小时和分钟)都是小写()hm)。所以我测试字符串的最后一个字符的情况来决定是否解析为一个Period或一个Duration我利用的事实,两者Period.parseDuration.parse接受在两种情况下的字母。

你想持续时间增加或减少往返InstantLocalDateTime这适用于大多数情况下。让我们来看看:

    String[] timeAmountStrings = { "1m", "5M", "3D", "30m", "2h", "1Y", "3W" };
    LocalDateTime base = LocalDateTime.of(2019, Month.MARCH, 1, 0, 0);
    for (String tas : timeAmountStrings) {
        TemporalAmount amount = parse(tas);
        System.out.println("String: " + tas + " parsed: " + amount + " added: " + base.plus(amount));

        try {
            System.out.println("Added to Instant: " + Instant.EPOCH.plus(amount));
        } catch (DateTimeException dte) {
            System.out.println("Adding to Instant didn’t work: " + tas + ' ' + dte);
        }

        System.out.println();
    }

输出:

String: 1m parsed: PT1M added: 2019-03-01T00:01
Added to Instant: 1970-01-01T00:01:00Z

String: 5M parsed: P5M added: 2019-08-01T00:00
Adding to Instant didn’t work: 5M java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Months

String: 3D parsed: P3D added: 2019-03-04T00:00
Added to Instant: 1970-01-04T00:00:00Z

String: 30m parsed: PT30M added: 2019-03-01T00:30
Added to Instant: 1970-01-01T00:30:00Z

String: 2h parsed: PT2H added: 2019-03-01T02:00
Added to Instant: 1970-01-01T02:00:00Z

String: 1Y parsed: P1Y added: 2020-03-01T00:00
Adding to Instant didn’t work: 1Y java.time.temporal.UnsupportedTemporalTypeException: Unsupported unit: Years

String: 3W parsed: P21D added: 2019-03-22T00:00
Added to Instant: 1970-01-22T00:00:00Z

我们看到,增加LocalDateTime在所有情况下的作品。添加到Instant在大多数情况下的作品,只有我们不能添加数月或数年给它的。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何计算现在日期和固定日期之间的差异。并像1d,1m,1w一样编辑

是否有一个Java库可以将描述时间量度的字符串(例如“ 1d 1m 1s”)转换为毫秒?

Firestore实时更新1M限制

Java:用 1m 对象过滤 List 的最快方法

在 5M 上移动 1M 的文件

巨大的数组大小[1M]可能是堆栈溢出

哪个MQTT服务器用于> 1M连接

Kubernetes Pod使用的CPU不超过1m

1M行的INDEX MATCH数组公式

在C#中10m * 0.1m等于1m吗?

在Oracle查询中为1000000至1M和1000至1K

在Excel中将1M转换为1,000,000

如何在matplotlib图的xlabel中打印10K,20K ...... 1M

如何使用core.async实现Skynet 1m微基准测试?

比较fread与read.table的速度以读取100M中的前1M行

在1m 9s内建立失败,并完成以下错误:Gradle任务assembleDebug失败,退出代码为1

找到1s的最大矩形

子网是否总是连续的1s?

获得最长的连续序列1s

如何在 TextView android K 和 M 格式中显示,如果视图或喜欢超过 1000 或更多,即使用(JAVA)1K 或 1M

正则表达式匹配 1Y 但不匹配 Javascript 中的 1YY

的具有1M的gradle中的一个错误,我应该怎么办?

优化过滤器和循环以在1M行上运行

查找datastore中是否存在大量key(最多1M)

计算〜1m Hermitian矩阵的频谱范数:numpy.linalg.norm太慢

get_data_yahoo(pandas_datareader)中间隔为1m的问题

为什么 pandas .last('1W') 过去 7 天不显示?

R绘图范围选择器自动选择“ 1W”

如何使CMake通过基于GCC版本的std = c ++ 14 / c ++ 1y或c ++ 17 / c ++ 1z?