在 Android 上将 UTC 转换为本地时间

新手上路,请多包涵

在我的项目中,我得到了 json 格式的 API 响应。我得到一个 UTC 时间格式的时间字符串值,就像这样 Jul 16, 2013 12:08:59 AM

我需要将其更改为当地时间。那就是我们使用这个应用程序需要显示当地时间的地方。我该怎么做?

这是我尝试过的一些代码:

 String aDate = getValue("dateTime", aEventJson);
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss z");
simpleDateFormat.setTimeZone(TimeZone.getDefault());
String formattedDate = simpleDateFormat.format(aDate);

假设 aDate 包含 Jul 16, 2013 12:08:59 AM

原文由 MadTech 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 603
2 个回答

这是我的尝试:

 String dateStr = "Jul 16, 2013 12:08:59 AM";
SimpleDateFormat df = new SimpleDateFormat("MMM dd, yyyy HH:mm:ss a", Locale.ENGLISH);
df.setTimeZone(TimeZone.getTimeZone("UTC"));
Date date = df.parse(dateStr);
df.setTimeZone(TimeZone.getDefault());
String formattedDate = df.format(date);

还要注意上午/下午标记的“a”……

原文由 devconsole 发布,翻译遵循 CC BY-SA 3.0 许可协议

我想提供现代答案。虽然 SimpleDateFormat 是我们在 2013 年用于解析和格式化日期时间的类(除了 Joda-Time),但它现在已经过时了,而且我们在 java.time 或 JSR-310,这是 2014 年随 Java 8 一起推出的现代 Java 日期和时间 API。

但大多数 Android 设备仍然不运行 Java 8,我听到你说。幸运的是,您仍然可以通过 ThreeTenABP 在它们上使用现代 Java 日期和时间 API,ThreeTenABP 是 JSR-310 到 Android Java 7 的反向移植。详细信息在 这个问题中:How to use ThreeTenABP in Android Project

现在代码是:

     DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("MMM dd, uuuu hh:mm:ss a", Locale.ENGLISH);
    String aDate = "Jul 16, 2013 12:08:59 AM";
    String formattedDate = LocalDateTime.parse(aDate, formatter)
            .atOffset(ZoneOffset.UTC)
            .atZoneSameInstant(ZoneId.systemDefault())
            .format(formatter);
    System.out.println(formattedDate);

由于我的计算机运行的是 Europe/Copenhagen 时区,该时区在 7 月比 UTC 早 2 小时,因此打印

Jul 16, 2013 02:08:59 AM

进一步的观点:

  • 由于您的字符串中有 AM,我假设您的时间在 AM 内,从 1 到 12。要正确解析和格式化它们,您需要在格式模式字符串中使用小写字母 h 。大写 H 是从 0 到 23 的小时。
  • 更愿意为格式化程序提供明确的语言环境(无论是 SimpleDateFormat 还是 DateTimeFormatter )。如果没有给出区域设置,格式化程序将使用设备的默认区域设置。 “Jul”和“AM”是英文的,你的代码可能在许多设备上运行良好,直到有一天它在非英语语言环境的设备上运行并崩溃,你很难弄清楚原因。
  • 如果可以,请明确给出所需的时区,例如 ZoneId.of("Asia/Kolkata") 。 JVM 的默认时区可能会被程序的其他部分或运行在同一 JVM 中的其他程序更改,因此不可靠。

原文由 Ole V.V. 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
logo
Stack Overflow 翻译
子站问答
访问
宣传栏