Java LocalDate 解析器不考虑小时、分钟、秒

问题描述 投票:0回答:2

我想从字符串中解析日期时间。 这是我的代码:

String dateStr = "2016-08-18T14:44:56.225Z"
final String Pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
final DateTimeFormatter dtf = DateTimeFormat.forPattern(Pattern);
LocalDate dt = dtf.parseLocalDate(dateStr);

那么我只从上面的代码中收到年、月和日(2016-08-18)。 我无法获取小时、分钟和秒。

以前有人遇到过这个问题吗?你是怎么解决的? 我使用 Java 7。

java localdate
2个回答
2
投票

也可以使用

LocalDateTime
来获取时间:

String dateStr = "2016-08-18T14:44:56.225Z"
final String Pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
final DateTimeFormatter dtf = DateTimeFormat.forPattern(Pattern);
LocalDateTime dt = dtf.parseLocalDateTime(dateStr);

您还忽略了时区(在本例中为 UTC/Zulu - 最后的

Z
) - 确保您是否真的想这样做。


0
投票

Instant

输入末尾的

Z
"2016-08-18T14:44:56.225Z"
+00:00
的缩写,发音为“Zulu”,意思是与 UTC 时间子午线的零时-分-秒偏移。

该输入应被解析为

Instant
java.time.Instant
类代表 UTC 中的时刻。这是 java.time 框架的基本构建块。

Instant instant = Instant.parse( "2016-08-18T14:44:56.225Z" ) ;

现在调整您选择查看这一时刻的时区。请记住,对于任何给定时刻,时间和日期在全球范围内因时区而异。

ZoneId z = ZoneId.of( "America/Edmonton" ) ;

应用该时区,通过该地区人们使用的挂钟/日历查看同一时刻。您生成了一个

ZonedDateTime
对象。

ZonedDateTime zdt = instant.atZone( z ) ;

现在您已在该区域中看到了日期和时间。

LocalDate

LocalDate
类表示仅日期值、年、月和日。没有时间、没有时区、没有偏移。

我们可以从上面的

LocalDate
中提取一个
ZonedDateTime

LocalDate ld = zdt.toLocalDate() ;

解析

关于您的格式模式:`Pattern = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'":

  • 切勿将
    Z
    用单引号引起来。这意味着“期待此文本,但忽略此文本”。您永远不应该忽略该文本。
    Z
    表示重要信息,如上所述,零偏移量。
  • ISO 8601 标准中定义了该特定格式。 java.time 类默认使用标准格式。因此您无需定义该特定格式。在
    toString
    课程上简单调用
    parse
    Instant
  • 按照惯例,Java 变量以小写字母开头命名。所以
    pattern
    ,而不是
    Pattern
© www.soinside.com 2019 - 2024. All rights reserved.