java - 如何在 Java 中存储花费的时间或总持续时间?

标签 java time apache-poi duration

我正在使用适用于 Java 的 POI API 自动生成一份 Excel 报告。我将使用 POI 阅读、处理它们并创建新的 Excel 报告。

excel 文件中的一列有总花费时间,也就是说,它可以采用以下格式,46:23:12 - 这显示为 46 小时 23 分钟 12秒

我了解如何读取日期和时间值,并且通常将它们存储在 java.util.Date 中。这里的问题是这是一个持续时间,花费的时间可能超过 24 小时。哪种数据类型适合这个?我如何使用 POI 阅读此内容?

最佳答案

在 Java 8 中,时间量由 class java.time.Duration 表示.

我不确定 Apache POI 是否有直接处理 Duration 的方法,所以我认为最好的方法是获取 String 的值, 然后解析此 String 以获取值并将这些值添加到 Duration:

String s = "46:23:12";
String[] values = s.split(":");
// get the hours, minutes and seconds value and add it to the duration
Duration duration = Duration.ofHours(Integer.parseInt(values[0]));
duration = duration.plusMinutes(Integer.parseInt(values[1]));
duration = duration.plusSeconds(Integer.parseInt(values[2]));

duration 对象将包含相当于输入的量(在本例中:46 小时 23 分 12 秒)。如果调用 duration.toString(),它会在 ISO 8601 format 中返回此持续时间:

PT46H23M12S


当然,此代码假定输入 String 始终包含三个字段(小时、分钟和秒)。但是您可以在解析值之前检查 values.length(并且仅当相应的值不为零时才调用 plus 方法)。


如果您使用的是 Java <= 7,您可以使用 ThreeTen Backport ,Java 8 的新日期/时间类的一个很好的反向移植。对于 Android,有 ThreeTenABP (更多关于如何使用它的信息 here)。

唯一的区别是包名称(在 Java 8 中是 java.time,在 ThreeTen Backport(或 Android 的 ThreeTenABP)中是 org.threeten.bp),但是类和方法名称相同。

关于java - 如何在 Java 中存储花费的时间或总持续时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45192499/

相关文章:

java - 在 Swing/Spring 应用程序中 Autowiring 主类

java - 使用外部数据库处理非常大的吞吐量

C++ gettimeofday() 返回相同的值

Java - 将分钟和秒更改为时间格式? (毫米:ss)

java - 如何使用 SXSSF Streaming api 编辑现有的大型 Excel 文件

java - ResultSet.update(..) 与 st.executeUpdate(sql)

c - 从日期获取 unix 时间

java - 无法通过多个for循环写入excel行列(apache poi)

spring boot jpa 中的 Java.lang.StackOverflowError Excel

java - EntityManager 和 DAO 有什么区别?