如何从字符串解析LocalTime,例如mm:ss中的“10:38.0”。什么格式?我很难改变格式。
public static LocalTime parseTime(String time) {
return localTime = LocalTime.parse(time, DateTimeFormatter.ofPattern("mm:ss.S"));
}
出错
java类型的ISO。时间总体安排解析的java。时间总体安排DateTimeParseException:无法分析文本“10:38.2”:无法从TemporalAccessor获取本地时间:{MinuteOfHour=10,MicroOfSecond=200000,MilliOfSecond=200,NanoOfSecond=200000,SecondOfMinute=38},
问题是,mm: ss
不是真正的本地时间。它更像是一个冲刺比赛时间。发生错误是因为翻译需要一个经过的小时数的值,并且没有可用的小时数(“没有小时”在这里被解释为:它们不在模式中,而不是:“它们丢失了,因此让我们假设有0小时”)。
解决这个问题的一种方法是将模式更改为[HH:]mm:ss
,[]
表示可选输入。现在含义发生了变化:just10:20
被解释为(通过可选输入方面)00:10:20的简写,可以分解为本地时间。
但是,也许LocalTime
并不完全是您在这里要找的;如果这确实描述了测量事件所花费的时间,那么您要找的是Duration
,而不是LocalTime
。不幸的是,将10:20
解析为10分20秒的持续时间并非微不足道,API只是不支持它(从DTForey
对象到达那里的唯一方法是通过LocalTime,非常疯狂)。
您可以使用DateTimeFormatterBuilder#parseDefaulting
将一天中的小时数默认为零。
但是,在常识中,10:38.0
表示一个持续时间,您可以通过查找解析的LocalTime
和LocalTime之间的持续时间来获取
。Duration
对象。MIN
演示:
import java.time.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.temporal.ChronoField;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String str = "10:38.0";
DateTimeFormatter dtf = new DateTimeFormatterBuilder()
.parseDefaulting(ChronoField.HOUR_OF_DAY, 0)
.appendPattern("mm:ss.S")
.toFormatter(Locale.ENGLISH);
LocalTime time = LocalTime.parse(str, dtf);
System.out.println(time);
Duration duration = Duration.between(LocalTime.MIN, time);
System.out.println(duration);
}
}
输出:
00:10:38
PT10M38S
在线演示
从Trail:Date-Time了解更多有关现代日期时间API的信息。
*如果您正在为Android项目工作,并且您的Android API级别仍然不符合Java-8,请通过desugaring查看Java 8 API。请注意,Android 8.0 Oreo已经提供了对java的支持。时间
正如其他几个人正确而明智地指出的那样,10:38.0
的示例字符串看起来更像是一个时间量,一个持续时间。不像一天中午夜过后10分钟多一点的时间。因此,LocalTime
不是这里使用的正确类。使用持续时间
。并将字符串解析为Duration
对象。
不过,Duration
类只支持解析ISO 8601格式。ISO 8601格式类似于PT10M38。0秒(例如PT10M38S
或PT10M38.00000S
,它们也可以工作)。有更多的方法可以克服这个限制。阿文德·库马尔·阿维纳什在他的回答中已经给出了一个答案。我的方法是在解析字符串之前转换它:
public static Duration parseTime(String time) {
String iso = time.replaceFirst("^(\\d+):(\\d+(?:\\.\\d*)?)$", "PT$1M$2S");
return Duration.parse(iso);
}
让我们试试:
Duration dur = parseTime("10:38.0");
System.out.println(dur);
输出为:
PT10M38S
您可以看到,持续时间
也以ISO 8601格式打印回来。
根据什么进一步的处理你想要你的持续时间为你很可能会发现许多有用的方法在该类的留档;下面的链接。
time.replaceFirst("^(\\d):(\\d(?:\\.\\d*)?) $", "PT100万$2S")
如何工作:我正在使用正则表达式来匹配您的字符串:
^
:匹配字符串的开头
(\\d)
:与一个或多个数字匹配的捕获组。圆括号表示捕获组。我需要在下面的替换中使用此功能
:
:冒号(确实是)
(\\d(?:\.\\d*)?)
:一组数字,可选后跟一个点和零或更多数字(?:
表示我使用的非捕获组的开始,因为我不需要在替换中单独使用它。?
在非捕获组之后表示它是可选的(因此不带分数的38
也可以在几秒钟内使用)
$
:匹配字符串的结尾
在我的替换字符串中,PT100万美元$2S、1美元和2美元表示第一个和第二个捕获组前进的任何内容,这就是将
10
和38.0
插入到结果字符串中以获得PT10M38.0S
。
使用上面的非平凡正则表达式生成字符串和
持续时间。parse()
meet并不是完美的解决方案。Time4J库支持基于模式的持续时间解析。因此,如果你能容忍外部依赖,考虑使用它。详见Time4J的作者梅诺·霍奇希尔德的答案。
维基百科文章:ISO 8601
Java正则表达式的文档
- 持续时间的记录
- Meno Hochschild对这个问题的回答
我知道我该在约会部分用什么了。但是时间部分需要什么模式呢??
问题内容: 我设法解析一个对象: 但是我不能对。这段代码: 抛出: 我究竟做错了什么? 问题答案: 如果您使用特定格式,请按照API进行操作: 该字符串必须代表有效时间,并使用进行解析。 24小时必须 或持续12h 处理的格式必须具有以下条件: 一天中的两位数字。这将预先填充零以确保两位数。 冒号 分钟数字为两位数。这将预先填充零以确保两位数。 如果分钟不可用,则格式完成。 冒号 分钟为两位数。这
解释器模式 解释器模式虽然听上去有些费解,但是如果用示例说明一下就不难理解了。我们知道在C语言中,关于变量的定义是这样的:一个不以数字开始的由字母、数字和下划线构成的字符串。这种形式的表达式可以用状态自动机解决,当然也可以用解释器的方式解决。 typedef struct _Interpret { int type; void* (*process)(void* pDa
我试图寻找此错误的解决方案,但仍然无法使用类,因此我尝试手动进行导入,但只能看到三个类、和。 在中查看时,我可以看到文件,在打开JAR时,我还可以看到类pattern.class。 有人能帮助Eclipse为什么看不到这个类吗?
我想将我的字符串转换为 LocalTime 格式 我收到错误: 线程“main”java.time.format中出现异常。DateTimeParseException:无法在索引0处分析文本“3:30” 预期产出: 上午3:30
我有一个CXF WebClient,它尝试从REST服务读取XML请求。 我正在使用代码: 技能课程: System.out.println返回: 但我有个例外: 它似乎试图将技能解析为其他东西,其中似乎包含链接、nameUriPair和触发器。我没有这样的类。(我确实检查了导入,这是我的技能,而不是其他东西) 我在3.0.2和3.1.5版本中都尝试了以下工件 GroupID: 组织。阿帕奇。cx