【问题标题】:ISO Duration Format validation in javajava中的ISO持续时间格式验证
【发布时间】:2016-05-13 07:34:33
【问题描述】:

我用谷歌搜索但找不到任何好的解决方案来验证输入字符串对于ISO Duration Format 是否正确,如果有人有任何想法或解决方案可能使用正则表达式或函数,将会有很大帮助。

注意:持续时间的格式为[-]P[n]DT[n]H[n]M[n][.frac_secs]S,其中 n 指定元素的值(例如,4H 是 4 小时)。这表示 ISO 持续时间格式的子集,任何其他持续时间字母(包括有效的 ISO 字母,例如 Y 和 M)都会导致错误。

Example 1,
input string = "P100DT4H23M59S";
expected output = 100 04:23:59.000000

Example 2,
input string = "P2MT12H";
expected output = error, because the month designator, '2M', isn't allowed.

Example 3,
input string = "100 04:23:59";
expected output = 100 04:23:59.000000

.

【问题讨论】:

  • @WiktorStribiżew,我只想验证不转换的输入字符串
  • 你写了 input string = "P100DT4H23M59S";预期输出 = 100 04:23:59.000000 - 这就是转换,不是吗?
  • @subodh 如果不解析则无效,不是吗?

标签: java regex string format duration


【解决方案1】:

java.time.Duration

java.time 类在解析/生成文本时默认使用ISO 8601 格式。

使用Duration 类。

调用Duration#parse 方法。遇到错误输入时会抛出DateTimeParseException 的陷阱。

String input = "P100DT4H23M59S";
try
{
    Duration duration = Duration.parse( input );
}
catch ( DateTimeParseException e )
{
    System.out.println( "ERROR - Faulty input." );
}

Java 中的Duration 类表示一个独立于时间轴的时间跨度,以通用 24 小时日(不是日历日)、小时、分钟和秒为单位。 (有关日历日,请参阅Period 班级。)

因此,Duration#parse 会自动拒绝您不想要的年、月和周输入。

String input = "P2MT12H";
try
{
    Duration duration = Duration.parse( input );
}
catch ( DateTimeParseException e )
{
    System.out.println( "ERROR - Faulty input." );
}

运行时:

错误 - 输入错误。

【讨论】:

  • 这是在生产代码中推荐的方法。 给 OP 和其他未来访问者的说明:不要在生产中使用正则表达式(如 cmets 中所建议的那样)作为解决此问题的方法。但是,您可以尝试将正则表达式作为解决此问题的方法来学习和娱乐。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多