如何从“ 20201023T200457Z”和“ EEE MMM dd HH:mm:ss zzz yyyy”生成本地化的日期时间?

时间:2020-10-22 22:05:02

标签: java android android-date

我有这个开始日期时间:“ 20201023T200457Z”(似乎是UTC0000) 如何在移动设备上使用本地时间的“ yyyyMMdd HH:mm:ss”模式转换/生成它?

我得到这个结果:星期五十月23 20:04:57 GMT + 02:00 2020 使用以下代码:

    SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd'T'HHmmss'Z'", Locale.getDefault());
    Date startGMTInput = df.parse(start);
    Log.e(TAG, "start: " + startGMTInput.toString());// -> Fri Oct 23 20:04:57 GMT+02:00 2020

但是我的目标是:2020-10-23 22:04:57 //因为我处于GMT + 2时区

2 个答案:

答案 0 :(得分:1)

java.time(通过重复使用或ThreeTenABP

考虑使用java.time(现代Java日期和时间API)进行日期和时间工作。首先定义所需的格式化程序:

private static final DateTimeFormatter inputFormatter
        = DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmssX");
private static final DateTimeFormatter outputFormatter
        = DateTimeFormatter.ofPattern("yyyyMMdd HH:mm:ss");

DateTimeFormatter是线程安全的,因此我们可以安全地将它们声明为静态。)明确进行时区转换:

    String startString = "20201023T200457Z";
    Instant start = inputFormatter.parse(startString, Instant.FROM);
    String target = start.atZone(ZoneId.systemDefault()).format(outputFormatter);
    System.out.println(target);

在我的时区中输出(当前与您所在的时区+02:00偏移):

20201023 22:04:57

问题:java.time是否不需要Android API级别26?

java.time在较新和较旧的Android设备上均可正常运行。它只需要至少 Java 6

  • 在Java 8和更高版本以及更新的Android设备(来自API级别26)中,内置了现代API。仅在这种情况下,使用方法引用Instant::from而不是常量Instant.FROM
  • 在非Android Java 6和7中,获得ThreeTen Backport,这是现代类的backport(JSR 310的ThreeTen;请参见底部的链接)。
  • 在较旧的Android上,请使用废除旧书或Android版本的ThreeTen Backport。称为ThreeTenABP。在后一种情况下,请确保使用子包从org.threeten.bp导入日期和时间类。

链接

答案 1 :(得分:0)

在进行任何日期操作之前,将您的时区设置为GMT + 2。

isoFormat.setTimeZone(TimeZone.getTimeZone("GMT+2"));