在安卓设备上将UTC转换为本地时间

2022-08-31 14:19:06

在我的项目中,我得到了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


答案 1

这是我的尝试:

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”...


答案 2

我想提供现代的答案。虽然我们在2013年(除了Joda-Time)用于解析和格式化日期时间的课程,但它现在已经过时了,我们在JSR-310中已经有了更好的功能,JSR-310是2014年Java 8推出的现代Java日期和时间API。SimpleDateFormatjava.time

但是大多数Android设备仍然不运行Java 8,我听到你说。幸运的是,您仍然可以通过ThreeTenABP(JSR-310到Android Java 7的向后移植)在它们上使用现代Java日期和时间API。细节在这个问题中:如何在Android项目中使用ThreeTenABP

现在的代码是:

    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);

由于我的计算机正在运行欧洲/哥本哈根时区,即 7 月比 UTC 早 2 小时,因此打印

Jul 16, 2013 02:08:59 AM

其他要点:

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

推荐