【发布时间】:2017-06-20 14:55:33
【问题描述】:
问题
为什么我的 Android 应用无法解析 String str1= "Tue Jun 20 15:56:29 CEST 2017"?
我发现了一些类似的问题,但没有一个对我有帮助。
旁注
在我的项目中,我有一些在计算机上运行的 Java 应用程序和一些 Android 应用程序。他们能够相互交流。
消息中有时间戳。但是,我的 Java 应用程序以 String str1= "Tue Jun 20 15:56:29 CEST 2017" 之类的格式发送时间戳,而我的 Android 应用程序则以 String str2 = "Tue Jun 20 13:40:37 GMT+02:00 2017" 之类的格式发送时间戳。要保存包括时间在内的消息,我必须将传入时间解析为日期。
我的安卓应用
在我的 Android 应用中,我无法正确解析 String str1= "Tue Jun 20 15:56:29 CEST 2017":
java.text.ParseException:无法解析的日期:“Tue Jun 20 15:56:29 CEST 2017”
String str2 = "Tue Jun 20 13:40:37 GMT+02:00 2017"工作正常。
代码:
String str1 = "Tue Jun 20 14:53:08 CEST 2017";
SimpleDateFormat formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss zzzz yyyy", Locale.US);
try {
Date date = formatter.parse(str1);
} catch (ParseException e) {
e.printStackTrace();
}
// test
String str2 = "Tue Jun 20 13:40:37 GMT+02:00 2017";
formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss zzzz yyyy", Locale.US);
try {
Date date = formatter.parse(str2);
} catch (ParseException e) {
e.printStackTrace();
}
我的 Java 应用程序
但是,我的 Java 应用程序可以正确解析这两个字符串。
代码:
String str = "Tue Jun 20 14:53:08 CEST 2017";
SimpleDateFormat formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss zzzz yyyy", Locale.US);
try {
Date date = formatter.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
// test
str = "Tue Jun 20 13:40:37 GMT+02:00 2017";
formatter = new SimpleDateFormat("EE MMM dd HH:mm:ss zzzz yyyy", Locale.US);
try {
Date date = formatter.parse(str);
} catch (ParseException e) {
e.printStackTrace();
}
三十解决方案
本地日期时间字符串
要转换传入的字符串,我使用以下代码:
String time = "Mon Jun 26 15:42:51 GMT 2017";
DateTimeFormatter gmtDateTimeFormatter = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss 'GMT' yyyy", Locale.ENGLISH));
LocalDateTime timestamp = LocalDateTime.parse(time, gmtDateTimeFormatter);
LocalDateTime 到字符串
要将我的 LocalDateTime 转换为字符串,我使用了这个:
LocalDateTime timestamp = LocalDateTime.now();
DateTimeFormatter gmtDateTimeFormatter = DateTimeFormatter.ofPattern("EE MMM dd HH:mm:ss 'GMT' yyyy", Locale.ENGLISH));
String time = gmtDateTimeFormatter.format(timestamp);
【问题讨论】:
-
仅供参考,麻烦的旧日期时间类,如
java.util.Date、java.util.Calendar和java.text.SimpleTextFormat现在是 legacy,被 java.time 类取代。见Tutorial by Oracle。对于 Android,请参阅 ThreeTen-Backport 项目。 -
如果你能得到一个不包含四个字母时区缩写的字符串,那将是最好的。三个字母和四个字母的缩写通常是模棱两可的,有时 - 与 CEST 一样 - 只有半个时区。对于 CEST,如果日期是在未使用 CEST 的冬季,我不知道会发生什么结果。
标签: java android datetime datetime-parsing