Java: 如何从 LocalTime 对象获取总分钟数

Java: how to get total minutes from LocalTime Object

我正在尝试获取我的 jtable 中本地时间对象的总分钟数。由于我没有找到任何方法,所以我尝试将其转换为字符串,然后将字符串转换为分钟。

纳秒的长度总是根据 table 输入而变化,然后抛出 DateTimeParseException。

如何在没有解析异常的情况下转换它?

这是我使用的代码:

String pause = String.valueOf(table.getValueAt(zeile, 4));
DateTimeFormatter formatter  = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSS");
LocalTime localTime1 = LocalTime.parse(pause, formatter);

抛出以下错误:

Exception in thread "AWT-EventQueue-0" java.time.format.DateTimeParseException: Text '00:21:07.480781500' could not be parsed, unparsed text found at index 15

尝试

    DateTimeFormatter formatter  = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSSSSS");

传递给解析方法的时间有 9 个字符表示毫秒,但您的格式字符串只指定了 6 个。

使用这种格式,您不需要格式化程序,只需执行以下操作:

LocalTime localTime1 = LocalTime.parse(pause);

所有java.time类如果是ISO8601格式的字符串都可以直接解析,就是这样:https://en.m.wikipedia.org/wiki/ISO_8601

解析字符串时,格式与我使用 String.valueOf()-方法获得的值没有区别。

我设法得到这样的会议记录:

String pause = String.valueOf(table.getValueAt(zeile, 4));
if (pause.length()>5) {
        pause = pause.substring(0,pause.indexOf(':') + 3);
}
String[] split = pause.split(":");
int hours = Integer.parseInt(split[0]);
int minutes = Integer.parseInt(split[1]);
int result = hours * 60 + minutes;
System.out.println("result: " + result);

是否有更优雅的方法来做到这一点,或者这是正确的吗?

我怀疑你的 00:21:07.480781500 真的是你休息或暂停的长度,所以持续时间,时间量。如果是这样,您确实在 table 单元格中使用了错误的 class。

  • A Duration 持续时间,一段时间,比如 21 分几秒。
  • A LocalTime 是一天中从 00:00:00 到 23:59:59.999999999.
  • 的时间

如果我理解你的意思,那么从持续时间中获取总分钟数是有意义的,从 LocalTime 中获取它们并不是真的。

Duration 的挑战是为用户很好地格式化它。然而,这已经在许多问题和答案中得到解决。所以你可能会找到一个解决方案 in this question: How to format a duration in java? (e.g format H:MM:SS) and/or 搜索其他问题和答案。我认为您需要 subclass DefaultTableCellRenderer 才能在您的 table 中显示格式化的 Duration。在 return 中,获取会议记录很简单:

    Duration pause = (Duration) table.getValueAt(zeile, 4);
    long result = pause.toMinutes();
    System.out.println("result: " + result);

这打印了:

result: 21

如果您真的指的是一天中的某个时间,您当然应该保留 LocalTime objects。那么答案就是:

    LocalTime pause = (LocalTime) table.getValueAt(zeile, 4);
    int result = pause.get(ChronoField.MINUTE_OF_DAY);
    System.out.println("result: " + result);

输出是一样的:

result: 21