EL以人类可读的格式打印持续时间

Pie*_*ira 5 java jsp java-8

首先,我是新手java.time包装.

我正在编写一个webapp,需要在一天中的特定时间和几个事件持续时间内工作.

所以我用包LocalTimeDuration类编写了我的代码java.time.

当我需要在JSP中呈现它们的值时,它对于LocalTime对象来说非常简单(因为.toString()返回一个人类可读的变量),所以我可以只是编写${startTime}并且所有内容都以正确的方式进行(例如,它呈现为9:00).相同的方法对于持续时间不起作用,因为它的表示类似于PT20M(在这种情况下为20分钟).

是否存在一种优雅的方式来直接通过EL在JSP中执行人类可读的转换?

是的,我知道我可以在我的类中(在JSP之前)转换字符串中的对象,但我正在寻找建议的方法(我无法找到)...另一点是我看不到在Duration对象中官方的"convert()"(或其他任何)方法...所以我在想我正在使用错误的对象来映射持续时间(在LocalTimes 上加或减).

谢谢.

K E*_*son 7

不幸的是,Duration在Java 8中没有优雅的内置方式来格式化.我发现最好的方法是使用bobince描述的方法在这个答案中:

    Duration duration = Duration.ofHours(1).plusMinutes(20);
    long s = duration.getSeconds();
    System.out.println(String.format("%d:%02d:%02d", s/3600, (s%3600)/60, (s%60)));
Run Code Online (Sandbox Code Playgroud)

哪个印刷品:

一点20分00秒

如果您需要更长的持续时间,则必须调整代码.

我不确定你是什么意思,你错过了一个convert方法,但Duration非常适合添加/减去LocalTime.方法LocalTime.plus()LocalTime.minus()接受Duration作为参数.


Cha*_*lie 6

如果你对单词感兴趣,apache commons 就能满足你的需求:

 DurationFormatUtils.formatDurationWords(System.currentTimeMillis() - start, true, false))
Run Code Online (Sandbox Code Playgroud)
 2 days 1 hour 5 minutes 20 seconds
Run Code Online (Sandbox Code Playgroud)

https://commons.apache.org/proper/commons-lang/apidocs/org/apache/commons/lang3/time/DurationFormatUtils.html#formatDurationWords-long-boolean-boolean-