Java 删除日期时间字符串中的纳秒 我想要达到的目标。。。

Java 删除日期时间字符串中的纳秒 我想要达到的目标。。。,java,regex,Java,Regex,我的日期可能有两种格式: 2013-07-03T14:30:38Z 2013-07-03T14:30:38.000000Z 我想砍掉.00000,如果它存在的话 我走到这一步,在“.”之后把所有的东西都搬走了 time.replaceFirst(“^(.*?\\b\\..*$”,“$1”) 结果:2013-07-03T14:30:38 问题是,我仍然需要“Z”。。如何保留Z 我不是约会时间专家。。。 所以我不完全确定是否总是有60(如果字符串包含纳秒),或者是否可以有一个可变的0数 爪哇8 我

我的日期可能有两种格式:

2013-07-03T14:30:38Z
2013-07-03T14:30:38.000000Z
我想砍掉
.00000
,如果它存在的话

我走到这一步,在“.”之后把所有的东西都搬走了 time.replaceFirst(
“^(.*?\\b\\..*$”
,“$1”)

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

问题是,我仍然需要“
Z
”。。如何保留
Z

我不是约会时间专家。。。 所以我不完全确定是否总是有60(如果字符串包含纳秒),或者是否可以有一个可变的0数

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

只需将
Z
添加回内部:

time.replaceFirst( "^(.*?)\\b\\..*$", "$1Z");
另一种方法是捕获所有内容,直到遇到句点字符(
):

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

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

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

java.time Java8及更高版本有一个新的内置()。您可以使用它将字符串解析为日期时间值,然后以您想要的任何格式生成新的字符串表示。这里有一些代码,如果您想将其作为正则表达式的替代品来研究的话

两种可能的格式几乎完全相同。严格地说,据我所知,标准只要求分辨率(小数点后3位),但java.time框架将其扩展到(小数点后9位)

time框架在解析和生成字符串时使用ISO8601作为默认值。所以您不需要指定格式化程序模式,而是可以使用针对ISO8601标准格式的几个预定义格式化程序之一

对象表示时间线上的某个时刻。您可以指定特定时区以获取
ZoneDateTime
,但此特定问题不需要。默认情况下,此类可以解析输入字符串

String input = "2013-07-03T14:30:38.123456789Z";
Instant instant = Instant.parse( input );
解析之后,我们手头有一个
即时
对象。从那里,我们可以通过调用方法将分数秒更改为零,从而有效地截断分数秒。从技术上讲,我们并没有改变java.time使用的小数秒。将基于原始对象的值创建新对象

Instant instantTruncated = instant.with( ChronoField.NANO_OF_SECOND , 0 );
最后,我们使用预定义的格式化程序。此格式化程序将自动抑制生成的字符串中的分数零,该字符串由三位数字组成,其中值为零。因此,
..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\u Instant
。因此,从技术上讲,我们可以将代码缩短为只调用
toString
。但我想明确地说明格式化程序是如何涉及的

转储到控制台

System.out.println( "instant: " + instant );
System.out.println( "instantTruncated: " + instantTruncated );
System.out.println( "output: " + output );
跑步的时候

瞬间:2013-07-03T14:30:38.123456789Z 实例运行时间:2013-07-03T14:30:38Z 输出:2013-07-03T14:30:38Z
我们可以为该时刻指定一个时区以获得“ZonedDateTime”

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instantTuncated , zoneId);
我正在使用java,但不想将其标记为java,因为它基本上只是纯正则表达式

最好使用
java.time

但既然你坚持:

time.replaceFirst( "\\.\\d*(Z)?$", "$1");

您有一个utc格式的iso8601日期字符串,您应该能够使用datetime库对其进行解析很好,谢谢-很好的解释。。我遇到了一些问题,原因不是我想的,我想截断字符串可以解决问题-但它没有解决问题,所以我用Instant实现了它,并将其转换为LocalDateTime,以便它可以与我的其余代码一起工作。。。(这是我最初尝试做的,但失败了,但现在成功了)。。但是regex示例帮助我学习regex,所以这也很好)@ycomp通常,在大多数商业应用程序中,您应该使用ZonedDateTime,而不是LocalDateTime。请参阅我在上的评论和回答。好的,谢谢你的提示-我将研究如何用它重新编写代码-我对Java 8非常陌生
time.replaceFirst( "\\.\\d*(Z)?$", "$1");