以EL方式将时间间隔以人类可读的格式打印出来

8
首先,我对java.time包不太熟悉。
我正在编写一个Web应用程序,需要处理每天的特定时间和多个事件的持续时间。
因此,我使用java.time包中的LocalTime和Duration类编写了我的代码。
当我需要在JSP中呈现它们的值时,对于LocalTime对象非常简单(因为.toString()返回人类可读的值),所以我只需写${startTime},一切就会正常进行(例如,呈现为9:00)。 对于Duration,相同的方法不起作用,因为它的表示形式类似于PT20M(在这种情况下为20分钟)。
是否存在一种优雅的方法通过EL在JSP中直接执行人类可读的转换?
是的,我知道我可以在我的类中将对象转换为字符串(在JSP之前),但我正在寻找建议的方法(我无法找到...),另一个问题是我没有看到Duration对象中的官方“convert()”(或其他任何)方法...所以我想我正在使用错误的对象来映射时间的持续时间(添加或减去LocalTime)。
谢谢。

2
你需要一个格式化的文本时间长度仅用英语还是其他任何语言(例如德语中的“1小时20分钟”)?如果其他语言很重要,那么我建议使用额外的第三方库。Java-8不包含任何内置的时间长度格式,另外请参阅@Erlandsson的正确答案,如果您只需要数字形式,则已足够。 - Meno Hochschild
实际上我只需要一个20代表20分钟,或者1:20代表1小时20分钟...与本地化无关,只是为了更易读... - Pierpaolo Cira
2个回答

7

很不幸,在Java 8中没有一种优雅的内置方法来格式化Duration。我找到的最好方法是使用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)));

输出结果为:

1:20:00

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

我不确定您所说的“缺少convert方法”的含义是什么,但是Duration非常适合在LocalTime上进行加减。方法LocalTime.plus()LocalTime.minus()接受Duration作为参数。


谢谢...我只是使用duration来表示事件的持续时间(因此,如果LocalTime是9:00,持续时间为30分钟,我可以使用您所写的内容来获得另一个LocalTime作为总和:9:30)。说到像“convert()”方法这样的东西,我只是指没有将Duration对象转换为字符串表示的方法(这又是问题的主题...只是重复)。顺便说一句...没有一个标签库或其他东西来完成我对Duration所需的操作非常奇怪,但是LocalTime通过其toString()方法就可以简单地执行此操作。 - Pierpaolo Cira
最后,我决定在我的bean中创建另一个get方法,该方法将根据需要由我的EL代码使用:我写了${item.myDurationStr}而不是${item.myDuration},它将“转换”格式,使用类似以下的代码:public String getMyDurationStr() { long sec = myDuration.getSeconds(); return String.format("%02d:%02d", sec/3600, (sec%3600)/60); // 我不需要秒 } - Pierpaolo Cira

6

很好,正是我正在寻找的。谢谢! - Vitaliy Moskalyuk

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接