当前位置: 首页 > 知识库问答 >
问题:

如何在Java8/JSR 310/threeten.org中处理ISO-8601时间戳中的“可选”T?

蓬化
2023-03-14

在Java8次/JSR 310/threeten.orgbackport...

问:如何解析日期部分和时间部分之间带有“T”或“空格”的ISO-8601时间戳?

ISO-8601时间戳格式指定了文字“T”,以将日期规范与时间规范分开:

2015-05-12T15:42:00.123

许多应用程序以这种格式生成时间戳,并使用空格“char”而不是“T”。参考文献表明,ISO-8601允许通过相互协议实现这一点。

2015-05-12 15:42:00.123

因为我从多个来源摄取数据,所以我想允许“T”或“空格”。

我注意到模式字符串允许指定可选组件,但我看不到在模式字符串中指定“选项”的任何方法。。。

Q: 是否有任何方法可以在JSR 310模式字符串中“选择以下选项之一”?

我可以通过构建一个带有两种可选模式的DateTimeFormatter来实现这一点:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
    .appendOptional(DateTimeFormatter.ISO_LOCAL_DATE_TIME)
    .optionalStart().appendPattern("yyyy-MM-dd HH:mm:ss.SSS").optionalEnd()
    .toFormatter();

看到optionalStart()和optionalEnd()让我想到:

DateTimeFormatter dateTimeFormatter = new DateTimeFormatterBuilder()
    .appendPattern("[yyyy-MM-dd HH:mm:ss.SSS][yyyy-MM-dd'T'HH:mm:ss.SSS]")
    .toFormatter();

然而,我不相信这是处理这种情况的正确方法。。。

问:处理多个DateTime模式的最佳实践解决方案是什么?

提前谢谢。

共有1个答案

晏树
2023-03-14

我自己的做法:

  • 默认情况下,包括T
  • 在调用java之前清除输入数据。时间(或Joda时间)

当接受来自我自己代码之外的文本时,我从不相信这些外部输入。见鬼,我甚至都不相信自己的内在投入。我总是把这些数据通过一个清洁器。作为清理的一部分,我将任何预期的ISO 8601字符串中的任何空格字符替换为T。

String datetimeInput = input.replace( " ", "T" ) ;

我还习惯调用Google Guava库来修剪输入字符串中的空格。有关详细信息,请参阅此答案。

并检查NULL、非打印和其他不合适的字符。那些不可打印的会产生讨厌的错误。

只有在这之后,我才调用日期时间库(Joda time或java.time)。

此外,您应该使用try-catch-to-trap来捕获解析异常,以便在日期时间输入字符串无法满足您的期望时更优雅地处理。

  • java。时间:DateTimeParseException
 类似资料:
  • 我是Groovy的新手,我正在从事一个使用Groovy脚本的项目。我需要在中将Unix时间戳转换为格式。我还找不到简单明了的解决方案。 我现在有以下代码。 然而,当我在Flowable Script Task中尝试此操作时,会出现以下错误; 问题评估脚本:javax.script.ScriptExc的:groovy.lang.Mis看作方法异常:没有签名的方法:java.util.Date.for

  • 我正在将一个项目从Joda Time过渡到java8的本机时间库,我遇到了一个障碍。 我一直找不到持续时间的格式化程序。我想有一个自定义的字符串格式,例如HHH MM,其中75小时15分钟的持续时间将格式化为“75 15”。 通过转换为句点并使用句点Formatter,Joda-Time很容易做到这一点,但是我无法在Java8中找到这种类型的类。我错过了什么吗?

  • 问题内容: 我有一个要求,我要获取两个ISO 8601时间戳格式的字符串,并且必须对其进行比较并获取它们的最大时间戳。字符串采用以下格式。 为了进行比较,我需要将它们转换为DB2时间戳,然后进行比较。问题出在“ T”和“ Z”字母上。因此,我无法施展。我知道我可以简单地 将T和Z进行转换,但是我想知道是否有更好的方法。 我尝试了以下功能,但无法获得所需的结果。 使用DB2 LUW v9.7 问题答

  • 问题内容: 如何将时间转换为ISO 8601日期格式?(-_-;) 问题答案: 面向对象 这是推荐的方法。 程序 对于旧版本的PHP,或者您更熟悉过程代码。

  • 不,我说的不是时区偏移,而是根据夏令时等因素,一个地区的时区偏移在一年中可能会有所不同。我说的是IANA保持的实际时区。我知道ISO 8601不支持这些,对吗? 平台正在采取哪些措施来支持在类似 ISO 8601 的字符串表示中标识时区?我注意到最新的Java日期/时间库为此使用了扩展的ISO 8601格式,例如。(请参见日期时间格式化程序 API。 是否有一些融合的约定(例如与其他语言和平台)来

  • 问题内容: 我将Spring Framework用于我的服务API和日期时间解析。具体来说,我使用,它使用户可以灵活地仅使用日期,或者同时使用日期和时间,这是必需的。 相信我,我已经看到了所有这些我可以告诉人们的相关问题,例如this和this等等。 以前,我以日期为准,然后在服务层中使用上面提到的joda格式化程序处理日期,但是现在我想在控制器中添加请求验证,这意味着如果请求在语法上不正确,则该