我正在尝试在我的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
使用这种格式,您不需要格式化程序,只需执行以下操作:
LocalTime localTime1 = LocalTime.parse(pause);
所有java.time类都可以直接解析字符串,如果它是ISO8601格式,就是这种情况:https://en.m.wikipedia.org/wiki/ISO_8601
我怀疑你的 00:21:07.480781500 实际上是你休息或暂停的长度,所以一个持续时间,一个时间量。如果是这样,那么您确实在表格单元格中使用了错误的类。
Duration
持续时间,时间量,例如 21 分钟和几秒钟。LocalTime
是指一天中从 00:00:00 到 23:59:59.999999999 之间的某个时间。
如果我明白你的意思,从持续时间中获取总分钟数是有意义的,从LocalTime
中获取它们并不是真的。
Duration
的挑战是为用户很好地格式化它。然而,这已经在一些问题和答案中得到了解决。因此,您可能会在此问题中找到解决方案:如何在java中格式化持续时间?(例如格式 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
尝试
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss.SSSSSSSSS");
传递给 parse 方法的时间有 9 个字符(毫秒),但格式字符串仅指定了 6 个字符。
解析字符串时,格式与我使用 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);
有没有更优雅的方法可以做到这一点,或者这是正确的吗?