如何将UTC时间转换为用户时区



我正在以2021-06-20T09:56:05.697Z格式从服务器获取UTC时间。我想把它格式化为用户时区,我尝试了下面的代码。但它返回

java.text.ParseException:无法解析的日期:"2021-06-20T09:56:05.697Z";

使用的代码:(来自服务器的dateInString为"2021-06-20T09:56:05.697Z"(

String dateStr = dateInString;
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date dateex = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(dateex);

java.time通过desugaring

考虑使用现代java日期和时间API java.time来进行日期和时间工作。让我们首先为我们想要的格式声明一个格式化程序:

private static final DateTimeFormatter FORMATTER
= DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss z", Locale.ENGLISH);

现在转换如下:

String dateStr = "2021-06-20T09:56:05.697Z";
Instant dateex = Instant.parse(dateStr);
ZonedDateTime dateTime = dateex.atZone(ZoneId.systemDefault());
String formattedDate = dateTime.format(FORMATTER);

System.out.println("Formatted date and time: " + formattedDate);

示例输出:

格式化日期和时间:2021-06-20 05:56:05 AST

这是在美洲/托尔托拉时区的计算机上运行的,我们看到日期和时间已按要求转换为大西洋标准时间。

我正在利用这样一个事实,即来自服务器的字符串是ISO 8601格式的,java.time的类通常在没有任何显式格式化程序的情况下以本机方式解析这种格式。

你的代码出了什么问题

从服务器解析字符串时,如果使用格式化程序,则该格式化程序需要知道要解析的格式。它知道以后要格式化的格式,这并没有帮助。

问:java.time不需要安卓API 26级吗

java.time在较旧和较新的Android设备上都能很好地工作。它只需要至少Java 6

  • 在Java 8及更高版本中,以及在较新的Android设备上(从API 26级开始(,现代API内置
  • 在非Android Java 6和7中,获得ThreeTen Backport,即现代类的Backport(JSR310的ThreeTen;请参阅底部的链接(
  • 在旧的安卓系统上,可以使用desugaring或安卓版的ThreeTen Backport。它被称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类

链接

  • Oracle教程:日期时间,解释如何使用java.Time
  • Java规范请求(JSR(310,其中首次描述了java.time
  • ThreeTen Backport项目,java.time到Java 6和7的Backport(JSR-310的ThreeTen(
  • 通过降级提供Java 8+API
  • ThreeTenABP,安卓版ThreeTen背包
  • 问题:如何在Android项目中使用ThreeTenABP,有一个非常彻底的解释
  • 维基百科文章:ISO 8601

最新更新