【问题标题】:Java: how to get total minutes from LocalTime ObjectJava:如何从 LocalTime 对象中获取总分钟数
【发布时间】:2018-03-16 23:23:17
【问题描述】:

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

纳秒的长度总是根据表输入而变化,然后抛出 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

【问题讨论】:

  • 您的格式化程序只有微秒。试试HH:mm:ss.SSSSSSSSS
  • 如果我理解正确,您将从JTable 单元格中取出LocalTime 对象,通过String.valueOf 将其转换为String,然后将其解析回LocalTime。这能让你到任何地方吗?
  • 00:21:07.480781500,这是一个时间量,一个持续时间吗?或者是一天中的某个时间,大约是午夜过后 21 分钟?

标签: java time java-time datetime-parsing


【解决方案1】:

使用这种格式,您不需要格式化程序,只需这样做:

LocalTime localTime1 = LocalTime.parse(pause);

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

【讨论】:

    【解决方案2】:

    我怀疑您的 00:21:07.480781500 确实是您休息或暂停的长度,因此是持续时间,一段时间。如果是这样,您确实在表格单元格中使用了错误的类。

    • Duration 表示持续时间、时间量,例如 21 分钟和几秒钟。
    • 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) 和/或搜索其他问题和答案。我认为您需要将DefaultTableCellRenderer 子类化以在表格中显示格式化的Duration。作为回报,获取会议记录很简单:

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

    这个打印出来的:

    结果:21

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

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

    输出是一样的:

    结果:21

    【讨论】:

    • 非常感谢您的解释...实际上我一天中有两次(开始时间和结束时间)以及用户可以放置暂停持续时间的单元格。也使用 LocalTime 来暂停,因为在我的 jtable 中我使用 LGoodDatePicker 并且默认情况下它与 LocalTime 一起使用。我猜 LGoodDatePicker 的输出可以更改为 Duration 但我没有研究它。但是感谢您的 cmets....帮助了我很多!
    • 因此,为了计算从开始到结束的持续时间并减去中断(暂停),您需要类似Duration.between.(startTime, endTime).minus(pause)(其中pauseDuration)。要转换应该是 DurationLocalTime,请使用 Duration.between(LocalTime.MIDNIGHT, localTimeToBeConverted)
    【解决方案3】:

    试试

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

    传递给 parse 方法的时间以毫秒为单位有 9 个字符,但您的格式字符串仅指定了 6 个。

    【讨论】:

    • OP 讨论了不同长度的输入,因此您的固定模式并不总是有效。指定纳秒位数的最小和最大计数的构建器方法更有帮助。
    【解决方案4】:

    解析字符串时,格式与我使用 String.valueOf()-Method 获得的值没有什么不同。

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

    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);
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 2020-03-13
      • 1970-01-01
      • 2023-01-25
      • 2020-08-01
      • 1970-01-01
      • 2014-11-03
      相关资源
      最近更新 更多