gpt4 book ai didi

android - 三十ABP : DateTimeParseException

转载 作者:行者123 更新时间:2023-11-29 16:33:01 25 4
gpt4 key购买 nike

尝试更改字符串的日期格式但出现 DateTimeException:

String oldDate = "2018-12-18T17:04:56+00:00";
String outputFormat = "DD-MM";
try {
Instant instant = Instant.parse(oldDate);
LocalDateTime localDateTime = instant.atZone(ZoneId.systemDefault()).toLocalDateTime();
return localDateTime.format(DateTimeFormatter.ofPattern(outputFormat);
} catch (DateTimeException | IllegalArgumentException e) {
Log.e("Error", e.getLocalizedMessage());
return "";
}

我得到的错误是:无法在索引 19 处解析文本“2018-12-18T17:04:56+00:00”

我正在使用 com.jakewharton.threetenabp:threetenabp:1.1.1 因为我不能使用 Java 8 类

最佳答案

tl;dr

OffsetDateTime.parse(                // Represent a moment, a date with time-of-day in the context of an offset-from-UTC (some number of hours-minutes-seconds).
"2018-12-18T17:04:56+00:00" // Input string in standard ISO 8601 format, with an indicator of an offset-from-UTC of zero hours and zero minutes, meaning UTC itself.
) // Returns an `OffsetDateTime` object.
.atZoneSameInstant( // Adjust our moment from UTC to the wall-clock time used by the people of a particular region (a time zone).
ZoneId.systemDefault() // Using the JVM’s current default time zone. NOTE: this default can change at any moment during runtime. If important, confirm with the user.
) // Returns a `ZonedDateTime` object.
.toString() // Generate text in standard ISO 8601 format wisely extended by appending the name of the zone in square brackets. Returns a `String` object.

2018-12-18T09:04:56-08:00[America/Los_Angeles]

详情

这是使用 ThreeTen-Backport 的示例 Java 代码项目,由 ThreeTenABP 扩展适用于 26 岁之前的 Android。

import org.threeten.bp.*;

格式错误

Instant.parse命令使用 DateTimeFormatter.ISO_INSTANT格式化程序。该格式化程序希望末尾有一个 Z 来指示 UTC。

Instant 类是 java.time 框架的基本构建 block 类。要获得更大的灵 active ,请使用 OffsetDateTime。它的默认格式化程序 DateTimeFormatter.ISO_OFFSET_DATE_TIME可以处理您的输入。

String input = "2018-12-18T17:04:56+00:00";
OffsetDateTime odt = OffsetDateTime.parse( input );

odt.toString(): 2018-12-18T17:04:56Z

错误的类

不要使用 LocalDateTime跟踪片刻。该类(class)故意缺少 time zone 的任何概念或 offset-from-UTC .它只是一个日期和一天中的时间。因此,它不能代表一个时刻,永远不是时间轴上的一个点。相反,此类表示 26-27 小时(全局时区范围)内的潜在时刻。

要跟踪某个时刻,请仅使用:

  • Instant
    UTC 时刻,永远是 UTC。
  • OffsetDateTime
    一个日期,一天中的时间,与 UTC 的偏移量。偏移量只是小时-分钟-秒的数字,仅此而已。
  • ZonedDateTime
    通过特定地区、时区的人们使用的挂钟时间看到的时刻。区域是特定区域中使用的偏移量的过去、现在和 future 变化的历史。

要将我们的 OffsetDateTime 从 UTC 调整到某个时区,请应用 ZoneId 以获得 ZonedDateTime

ZoneId z = ZoneId.systemDefault() ;  // If important, confirm the zone with user rather than depending on the JVM’s current default zone.
ZonedDateTime zdt = odt.atZoneSameInstant( z ) ;

zdt.toString(): 2018-12-18T09:04:56-08:00[America/Los_Angeles]

根据这些结果,我们看到在北美西海岸的大部分地区,UTC 下午 5 点同时是上午 9 点。 -08:00 的差异意味着在这一天,西海岸比 UTC 八个小时。


关于java.time

java.time框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧类 legacy日期时间类,例如 java.util.Date , Calendar , & SimpleDateFormat .

Joda-Time项目,现在在maintenance mode , 建议迁移到 java.time类。

要了解更多信息,请参阅 Oracle Tutorial .并在 Stack Overflow 中搜索许多示例和解释。规范为 JSR 310 .

您可以直接与您的数据库交换java.time 对象。使用 JDBC driver符合 JDBC 4.2或以后。不需要字符串,不需要 java.sql.* 类。

从哪里获得 java.time 类?

ThreeTen-Extra项目用附加类扩展 java.time。该项目是 future 可能添加到 java.time 的试验场。您可能会在这里找到一些有用的类,例如 Interval , YearWeek , YearQuarter , 和 more .

关于android - 三十ABP : DateTimeParseException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53838449/

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