将符合 ISO 8601 的字符串转换为 java.util.Date

2024-03-14

我正在尝试转换ISO 8601 http://en.wikipedia.org/wiki/ISO_8601格式化字符串为java.util.Date.

我找到了模式yyyy-MM-dd'T'HH:mm:ssZ如果与区域设置一起使用,则符合 ISO8601 标准(比较示例)。

然而,使用java.text.SimpleDateFormat,我无法转换正确格式的字符串2010-01-01T12:00:00+01:00。我必须先将其转换为2010-01-01T12:00:00+0100,没有冒号。

所以目前的解决方案是

SimpleDateFormat ISO8601DATEFORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ", Locale.GERMANY);
String date = "2010-01-01T12:00:00+01:00".replaceAll("\\+0([0-9]){1}\\:00", "+0$100");
System.out.println(ISO8601DATEFORMAT.parse(date));

这显然不太好。我错过了什么还是有更好的解决方案?


Answer

感谢JuanZe的评论,我找到了乔达时间 http://www.joda.org/joda-time/魔法,它也是此处描述 http://johannburkard.de/blog/programming/java/date-time-parsing-formatting-joda-time.html.

所以,解决方案是

DateTimeFormatter parser2 = ISODateTimeFormat.dateTimeNoMillis();
String jtdate = "2010-01-01T12:00:00+01:00";
System.out.println(parser2.parseDateTime(jtdate));

或者更简单地说,通过构造函数使用默认解析器:

DateTime dt = new DateTime( "2010-01-01T12:00:00+01:00" ) ;

对我来说,这很好。


不幸的是,可用的时区格式简单日期格式 http://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html(Java 6 及更早版本)不是ISO 8601 https://en.wikipedia.org/wiki/ISO_8601符合。 SimpleDateFormat 可以理解“GMT+01:00”或“+0100”等时区字符串,后者根据RFC#822 http://www.ietf.org/rfc/rfc0822.txt.

即使 Java 7 根据 ISO 8601 添加了对时区描​​述符的支持,SimpleDateFormat 仍然无法正确解析完整的日期字符串,因为它不支持可选部分。

使用正则表达式重新格式化输入字符串当然是一种可能性,但替换规则并不像您的问题中那么简单:

  • 某些时区并非全时休息UTC https://en.wikipedia.org/wiki/Coordinated_Universal_Time,因此字符串不一定以“:00”结尾。
  • ISO8601 只允许时区中包含小时数,因此“+01”相当于“+01:00”
  • ISO8601 允许使用“Z”来表示 UTC,而不是“+00:00”。

更简单的解决方案可能是使用 JAXB 中的数据类型转换器,因为 JAXB 必须能够根据 XML 模式规范解析 ISO8601 日期字符串。javax.xml.bind.DatatypeConverter.parseDateTime("2010-01-01T12:00:00Z")会给你一个Calendar对象,如果您需要一个对象,您可以简单地使用 getTime() 对其进行Date object.

你可能可以使用乔达时间 http://www.joda.org/joda-time/也是如此,但我不知道你为什么要为此烦恼(2022 年更新;也许是因为整个javax.xml.bindAndroid 中缺少此部分javax.xml包裹)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将符合 ISO 8601 的字符串转换为 java.util.Date 的相关文章

随机推荐

  • java JNI 错误 java.lang.UnsatisfiedLinkError:

    java Djava library path TestJNI gt gt gt gt Exception in thread main java lang UnsatisfiedLinkError TestJNI calibrate D
  • 如何配置 GroovyConsole 以便我不必在启动时导入库?

    我有一个使用第三方库的常规脚本 每次我打开应用程序并尝试运行我的脚本时 我都必须导入正确的库 我希望能够打开 GroovyConsole 并运行我的应用程序 而无需导入库 在 Linux 中你也有 usr share groovy conf
  • NSString stringWithFormat 问题

    我正在尝试使用 NSString 构建一个小表 我似乎无法正确格式化字符串 这是我所拥有的 NSString stringWithFormat 8 6f e v 其中 e 是来自其他地方的 NSString v 是浮点数 我想要的是输出类似
  • Boost.Fusion运行时开关

    我正在从文件中读取对象的类型 enum class type index type index typeidx read file handle type index 根据类型索引 我想创建一个类型 从可能类型的列表中 并用它做一些通用的事
  • Pymongo 使用 $exists

    我是 pymongo 的新手 使用存在时遇到问题 使用时 collection find cwc exists True 我收到以下错误 Unsupported projection option exists 我想要完成的是找到所有 id
  • 可以使用反射访问方法变量吗?

    如何使用反射访问方法内定义的变量 我必须在 Hibernate 中创建标准 数据库是基于属性的 考虑一部电影 一部电影可以有多种语言和多种类型 例如 Movieid Property Value 1 Language Hindi 1 Lan
  • Gulp Typescript + Browserify;捆绑的 sourcemap 指向转译的 JS 而不是源 TS

    我正在开发一个 Typescript 项目 该项目被转换为 ES5 JS 然后通过 browserify 运行以创建单个 js 包和源映射 捆绑的源映射指向转译的 JS而不是源TS即使我生成的源映射在转换为 JS 时正确指向源 TS 这就好
  • 在内存中SQLite3共享数据库python

    我试图充分利用 aws 服务器 并想到跨多个线程使用内存数据库 在 python 中使用 SQLite 3 我在网上找到了这个命令 conn sqlite3 connect file memory cache shared 但后来我得到了这
  • 在Python中,如何在一行代码中创建一个包含n个字符的字符串?

    我需要在Python中生成一个包含n个字符的字符串 是否有一个简单的答案可以使用现有的 Python 库来实现这一目标 例如 我需要一串 10 个字母 string val abcdefghij 简单地重复同一个字母 10 次 string
  • xargs的默认分隔符可以更改吗?

    我想要以下行为 而不必使用选项显式指定它 xargs d n 与大多数命令不同 您不能只使用别名 因为管道无法识别别名 顺便说一句 为什么要这样设计 我也尝试创建自己的 bin xargs脚本 但我认为这并不像在脚本中读取 作为字符串那么简
  • D3 单击更新数据集并重新绘制条形图

    我是 d3 和 javascript 的新手 并且在更新数据集以及重新绘制条形时遇到问题 这是我到目前为止一直在查看的代码 http jsfiddle net TwEhT 2 http jsfiddle net TwEhT 2 我有一个函数
  • python 或 dask 并行生成器?

    是否有可能在Python中 也许使用dask 也许使用多重处理 将生成器 放置 在核心上 然后并行地单步执行生成器并处理结果 它需要特别是生成器 或带有 iter 生成器生成的所有生成元素的列表不适合内存 尤其 有了熊猫 我可以打电话rea
  • CSS margin vh 无法正常工作

    grenze background green height 96vh width 96vh baukasten background white height 86vh width 86vh margin 5vh border 1px s
  • 保持 CurrentCulture 处于异步/等待状态

    我有以下伪代码 string GetData var steps new List
  • 春季安全3.1

    当我尝试使用 Spring Security 的自定义登录表单时 无论我是否输入了正确的凭据 它都会将我返回到 admin login 页面 当我使用空的
  • joomla 将视图添加到另一个视图中

    我使用 joomla MVC 我想构建一个具有不同选项卡的表单 这些选项卡是表单的不同部分 其中包含输入 我需要包含一些与其他表单通用的选项卡 我希望能够从单独的文件或视图加载此常见内容 这样我就没有重复的代码 而且当我需要对表单进行更改时
  • 获取Enum值的名称

    我正在尝试创建一个函数 我们可以在其中获取枚举值的名称值 例如 Get Enum ValueName DayOfWeek 0 这将返回 Sunday 但我的代码不起作用 它说类型未定义 Private Function Get Enum V
  • Powershell 脚本可以记录已扫描的文件并在下次运行时忽略它们?

    我正在尝试编写一个脚本 该脚本将递归扫描目录 带有 Error 扩展名的本地文件 然后通过电子邮件向一群人发送文件列表 我计划通过 Control M 运行此脚本 并让它每 20 分钟运行一次 我希望脚本记录自上次运行以来已扫描的文件 而不
  • 输入组和表单组之间的区别

    css类之间的使用有什么区别input group and form group在引导程序中 输入组是扩展的表单控件 使用输入组 您可以轻松地将文本或按钮添加到基于文本的输入中 例如 您可以根据需要添加 符号 作为 Twitter 用户名或
  • 将符合 ISO 8601 的字符串转换为 java.util.Date

    我正在尝试转换ISO 8601 http en wikipedia org wiki ISO 8601格式化字符串为java util Date 我找到了模式yyyy MM dd T HH mm ssZ如果与区域设置一起使用 则符合 ISO