gpt4 book ai didi

java - 删除日期时间字符串中的纳秒

转载 作者:搜寻专家 更新时间:2023-11-01 01:50:53 25 4
gpt4 key购买 nike

我想要达到的目标...

我有两种格式的日期:

2013-07-03T14:30:38Z
2013-07-03T14:30:38.000000Z

如果 .00000 存在,我想砍掉它

我已经走到这一步了,删除了“.”之后的所有内容。time.replaceFirst("^(.*?)\\b\\..*$", "$1");

结果:2013-07-03T14:30:38

问题是,我仍然需要 'Z' .. 我怎样才能保留 Z

我不是日期时间专家...

所以我不完全确定是否总是有 6 个 0(如果字符串包含纳秒)或者是否可以有可变数量的 0...

Java 8

我正在使用 java 但不想将它标记为 java,因为它基本上只是纯正则表达式

最佳答案

字符串 != 日期时间

我应该更正问题中的术语:您(显然)有某种格式的字符串,而不是“日期”。 不要将日期时间值与其字符串表示混淆。

正如“$12.34”不是数字一样,它是应用特定格式的数字的字符串表示形式。该字符串可以解析为数字。

这个概念是下面代码的精髓。我们解析一个字符串以实例化一个日期时间对象,然后使用该日期时间对象生成一个新的字符串表示形式。

java.time

Java 8 及更高版本内置了一个新的 java.time framework ( Tutorial )。您可以使用它来将字符串解析为日期时间值,然后以您想要的任何格式生成新的字符串表示形式。如果您想探索它作为正则表达式的替代方案,这里有一些代码。

您的两种可能格式几乎都是 ISO 8601 格式。严格来说,据我所知,标准只要求 millisecond 分辨率(小数点后 3 位),但 java.time 框架将其扩展到 nanosecond(小数点后 9 位)。

java.time 框架在解析和生成字符串时默认使用 ISO 8601。因此,您无需指定格式化程序模式,而是可以使用针对 ISO 8601 标准格式的多个预定义格式化程序之一。

Instant 对象表示 UTC 时间轴上的一个时刻。您可以分配一个特定的时区以获得 ZonedDateTime,但对于这个特定的问题不需要。这个类可以默认解析你输入的字符串。

String input = "2013-07-03T14:30:38.123456789Z";
Instant instant = Instant.parse( input );

解析后,我们得到了一个instant 对象。从那里我们可以通过调用 with 方法将小数秒更改为零来有效地截断秒的小数部分。从技术上讲,我们不会更改小数秒,因为 java.time 使用 immutable objects。基于原始值创建新对象。

Instant instantTruncated = instant.with( ChronoField.NANO_OF_SECOND , 0 );

最后,我们使用预定义的格式化程序 DateTimeFormatter.ISO_INSTANT 。此格式化程序自动抑制生成的字符串中的小数零,以三位数字为一组,其中值为零。所以 …7.12 打印为 …7.120…7.1234…7.123400,而 …7.0作为…7。最后一个值符合我们的需要。

DateTimeFormatter formatter = DateTimeFormatter.ISO_INSTANT;
String output = formatter.format( instantTruncated );

Instant 上的 toString 方法默认使用格式化程序 DateTimeFormatter.ISO_INSTANT。所以从技术上讲,我们可以缩短代码以仅调用 toString。但我想明确说明格式化程序是如何参与的。

转储到控制台。

System.out.println( "instant: " + instant );
System.out.println( "instantTruncated: " + instantTruncated );
System.out.println( "output: " + output );

运行时。

instant: 2013-07-03T14:30:38.123456789Z
instantTruncated: 2013-07-03T14:30:38Z
output: 2013-07-03T14:30:38Z

我们可以为该 Instant 分配一个时区以获得“ZonedDateTime”。

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instantTuncated , zoneId);

关于java - 删除日期时间字符串中的纳秒,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32826948/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com