我正在从休息服务中获取字符串形式的时间对象。我需要提取时间,然后做一些时间操作。给定的时间字符串是"2015-06-16T14:58:48Z"。我尝试了下面的代码,将字符串转换为时间,但是,得到不正确的值。
String time = "2015-06-16T14:58:48Z";
SimpleDateFormat formatter = new SimpleDateFormat("YYYY-MM-DD'T'hh:mm:ss'Z'", Locale.US);
String dateInString = "2015-06-16T14:58:48Z";
Date date = formatter.parse(dateInString);
System.out.println("Original String : " + time);
System.out.println("After converting to time : " + formatter.format(date));
我得到的输出如下:原字符串 : 2015-06-16T14:58:48Z换算后时间:2015-12-362T02:58:48Z
转换后的日期不知何故获得了错误的值。请建议错误在哪里。谢谢。
格式字符串有几个错误:
-
Y
是指周年,而不是y
年 -
D
表示一年中的某一天。您应该使用d
,这意味着月份中的某一天。 -
h
表示一天中的 12 小时表示法时间。既然你有14
,你应该使用H
,它处理 24 小时表示法。
总结一下:
SimpleDateFormat formatter =
new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX", Locale.US);
将 SimpleDateFormat 更改为 this..
SimpleDateFormat formatter = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ssX", Locale.US);
java.time
问题的根本原因是使用了错误的符号
-
Y
(指定基于周的年份)而不是y
(指定纪元年份) -
D
(指定一年中的某天)而不是d
(指定月份中的某天)。 -
h
(指定时钟小时上午下午)而不是H
(指定小时)。
查看文档页面以了解有关这些符号的更多信息。
另请注意,旧的日期时间 API(java.util
日期时间类型及其格式 API,SimpleDateFormat
)已过时且容易出错。建议完全停止使用它并切换到 java.time
,现代日期时间 API*。
使用现代 API 的解决方案:
现代日期时间 API 基于 ISO 8601,只要日期时间字符串符合 ISO 8601 标准,就不需要显式使用 DateTimeFormatter
对象。您的日期时间字符串符合 ISO 8601 标准(或 OffsetDateTime#parse
使用的默认格式)。
import java.time.LocalTime;
import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class Main {
public static void main(String[] args) {
String strDateTime = "2015-06-16T14:58:48Z";
OffsetDateTime odt = OffsetDateTime.parse(strDateTime);
System.out.println(odt);
// ########################Extract time information########################
LocalTime time = odt.toLocalTime();
// You can also get it as time.getHour()
// Extract other units in a similar way
int hour = odt.getHour();
// Also using time.format(DateTimeFormatter.ofPattern("a", Locale.ENGLISH));
String amPm = odt.format(DateTimeFormatter.ofPattern("h a", Locale.ENGLISH));
System.out.println(time);
System.out.println(hour);
System.out.println(amPm);
}
}
输出:
2015-06-16T14:58:48Z
14:58:48
14
2 PM
注意:
- 输出中的
Z
是零时区偏移量的时区指示符。它代表祖鲁语,并指定Etc/UTC
时区(时区偏移量为+00:00
小时)。 - 出于任何原因,如果您需要将此
OffsetDateTime
对象转换为java.util.Date
对象,您可以按如下方式执行此操作:
Date date = Date.from(odt.toInstant());
要了解有关现代日期时间 API* 的更多信息,请参阅跟踪:日期时间。
<小时 />出于任何原因,如果你必须坚持使用Java 6或Java 7,你可以使用ThreeTen-Backport,它将大部分java.time功能向后移植到Java 6和7。如果您正在为 Android 项目工作,并且您的 Android API 级别仍然不符合 Java-8,请查看通过脱糖提供的 Java 8+ API 和如何在 Android Project 中使用 ThreeTenABP。