将字符串解析为日期时间不会返回正确的时间

问题描述 投票:0回答:1

在Android ...我期待下午3:12作为以下代码的时间输出,但我得到4:12 pm。什么是解析此日期时间格式的正确方法。

String dt = "2018-09-02T19:12:00-0400";
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ");

try {
    Date date = dateFormat.parse(dt);
    System.out.println(date);
} catch (ParseException e) {
    e.printStackTrace();
}
java android datetime hour datetime-parsing
1个回答
0
投票

时区

最好明确指定您希望输出的时区:

    DateTimeFormatter inputFormatter 
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXX");
    DateTimeFormatter displayFormatter = DateTimeFormatter
            .ofLocalizedDateTime(FormatStyle.LONG)
            .withLocale(Locale.ENGLISH);
    ZoneId displayZone = ZoneId.of("Pacific/Pitcairn");

    String dt = "2018-09-02T19:12:00-0400";
    OffsetDateTime dateTime = OffsetDateTime.parse(dt, inputFormatter);
    String displayDateTime = dateTime.atZoneSameInstant(displayZone)
            .format(displayFormatter);
    System.out.println(displayDateTime);

这打印:

2018年9月2日太平洋标准时间下午3:12:00

我在我的代码中使用过Pacific / Pitcairn时区,但你知道你想要哪个时区。

我也使用java.time,现代Java日期和时间API。您使用的日期时间类SimpleDateFormatDate被认为是过时的,而java.time可以更好地使用。

您的代码出了什么问题?

解析日期字符串的方法是正确的,并生成正确的Date

打印Date时,你隐含地调用toString。过时的Date类有一种特殊且令人困惑的toString方法:它抓取JVM的时区设置并使用它来生成字符串。因此,根据您的默认时区,您可以在输出中获得任何时间。因此,您的JVM的时区设置似乎与您的预期不符。

由于您在19:12:00-0400的输入中预计下午3:12,我认为您想要一个与9月份UTC相距-08:00的时区。例如,如果您的默认时区是America / Los_Angeles,其标准时间是-08:00,那么您将获得Sun Sep 02 16:12:00 PDT 2018,因为夏季时间(夏令时)在9月份在加利福尼亚州生效,因此偏移量为-07 :00。

依赖于JVM的默认时区始终是脆弱的,因为程序的其他部分或运行在同一JVM中的其他程序可能随时更改该设置。

问题:我可以在Android上使用java.time吗?

是的,java.time适用于较旧和较新的Android设备。它至少需要Java 6。

  • 在Java 8及更高版本和更新的Android设备上(从API级别26,我被告知)现代API内置。
  • 在Java 6和7中获取ThreeTen Backport,新类的后端端口(适用于JSR 310的ThreeTen;请参见底部的链接)。
  • 在(较旧的)Android上使用Android版的ThreeTen Backport。它被称为ThreeTenABP。并确保从org.threeten.bp导入子包的日期和时间类。

链接

© www.soinside.com 2019 - 2024. All rights reserved.