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

如果字符串包含000[duplicate],则OffsetDateTime不显示毫秒

萧飞
2023-03-14

我有一个字符串“2020-03-25T22:00:00.000Z”,我想将其转换为OffsetDateTime。下面是我尝试的代码,但当我将毫秒传递为000时,它不会反映在OffsetDateTime中。

OffsetDateTime offsetDateTime=OffsetDateTime.parse("2020-03-25T22:00:01.123Z", 
DateTimeFormatter.ISO_OFFSET_DATE_TIME);
print(offsetDateTime)
//Output: 2020-03-25T22:00:01.123Z

但是当米利是000的时候

OffsetDateTime offsetDateTime=OffsetDateTime.parse("2020-03-25T22:00:01.000Z", 
DateTimeFormatter.ISO_OFFSET_DATE_TIME);
print(offsetDateTime)

//Output: 2020-03-25T22:01Z (mili second is missing)

我也试过自定义格式,但它的行为相同

OffsetDateTime.parse("2020-03-25T22:00:00.123Z",
           DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX"));

谁能帮我一下吗

共有2个答案

宗建章
2023-03-14

我不久前遇到了同样的问题,在Jackson模块GitHub页面上实际上有一个开放的线程:https://GitHub . com/faster XML/Jackson-modules-Java 8/issues/76

正如您从这个帖子中看到的,这似乎是杰克逊模块本身设计中的一个问题。

你不应该担心毫秒丢失。我认为,它的设计是为了省略ISO字符串中的尾随零,以节省时间和内存。

在我看来,这应该是可定制的行为。

你可以在这里找到完全相同的问题:https://stackoverflow.com/a/52191521/4697963

值得一看,并阅读该线程。

翁建弼
2023-03-14

您必须记住,用于解析ISO字符串的格式可能与用于将日期时间对象转换回字符串的格式不同。

打印偏移日期时间时,如下所示:

System.out.println(odt);

然后OffsetDateTime。将调用toString()方法,并从其文档中:

将此日期时间输出为字符串,如 2007-12-03T10:15:30 01:00。输出将是以下 ISO-8601 格式之一:

  • u u u-MM-dd'T'HH: mmXXX XX
  • u u u-MM-dd'T'HH: mm: s sX XXXX
  • uuu-MM-dd'T'HH: mm:ss.SSSXXXXX
  • uuu-MM-dd'T'HH: mm:ss.SSSSSSXXXXX
  • uuu-MM-dd'T'HH: mm:ss.SSSSSSSSSXXXXX

使用的格式将是最短的,输出省略部分被暗示为零的时间的完整值。

同样,请记住java中的任何类。time包没有格式,所有这些类都由一些表示毫秒或天的longfield组成。

我可能无法充分强调这一点,但这是处理日期和时间的本质:java。time类没有格式,您需要将它们转换为适当的格式。

因此,如果您总是想拥有完整的值,那么您只需在打印之前将OffsetDateTime格式化为String

// best is to store that in a static variable
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSX");

// parse using our custom formatter
OffsetDateTime odt = OffsetDateTime.parse("2020-03-25T22:00:00.000Z", dtf);

// print using our custom formatter
String formatted = odt.format(dtf);
System.out.println(formatted);

哪些输出:

2020-03-25T22:00:00.000Z
 类似资料:
  • 问题内容: 我有以下Angular代码: 如何使用ng-if条件查找特定字符: 只在字符在这里时显示代码?我的值是88?77,数字是动态的,但问号始终存在,我似乎无法基于此进行过滤? 问题答案: ES2015更新 ES2015具有检查字符串是否包含另一个字符串的方法。如果目标环境支持,则可以使用它。如果在 干草堆中 找到了 针, 则该方法返回,否则返回。 __ 在这里是要搜索的字符串。 请参阅MD

  • 问题内容: 如果包含关键字,该如何编写整个单词的脚本? 示例: 关键字“ fun”,字符串-鸟很有趣,结果-鸟很有趣*。我做以下 但它只是修饰词。我的鸟是 乐趣 纽约 问题答案: 尝试这个: 匹配关键字前面的任何单词字符(至少)和关键字后面的任何单词字符。 并且我建议您使用转义关键字: 为了支持Unicode,请使用 u 标志,而不要使用:

  • 问题内容: 例如,需要使用 字符串找出只读取字符串中 数字 的方法, 即 我的尝试 问题答案: 试试这个: 由于返回的是文本数组,因此您应该通过来访问第一个元素。

  • 问题内容: 我有以下代码。 如您在上面看到的,如果字符串不包含顶点,名称或透明度,我希望将其打印出来。但是我得到一个编译错误,说|| 参数类型未定义operator。我是编程的新手,所以我不确定这意味着什么,请问有人可以指出正确的方向来修复我的代码吗? 问题答案: || 运算符使用单个布尔项,而不是提供许多不同的参数。

  • 我将一个regex模式列表传递给< code>grep来检查syslog文件。它们通常匹配IP地址和日志条目; 这只是一个模式列表,例如我正在循环传递的“1\.2\.部分,因此我无法传递“-v”。 我很困惑试图做上述的逆,不匹配线与某个IP地址和错误!1.2.3.4.*已爆炸”将匹配除1.2.3.4告诉我它已爆炸之外的任何syslog行。我必须能够包括一个IP地址不匹配。 在Stack Overf

  • 现在假设用户enterd AAA-222 结果将是 ps.拆分的部分应该包括空格。