在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();
}
最好明确指定您希望输出的时区:
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。您使用的日期时间类SimpleDateFormat
和Date
被认为是过时的,而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中的其他程序可能随时更改该设置。
是的,java.time
适用于较旧和较新的Android设备。它至少需要Java 6。
org.threeten.bp
导入子包的日期和时间类。java.time
。java.time
首次被描述。java.time
的后端到Java 6和7(JST-310的ThreeTen)。