如何将两个不同的字符串日期转换为单一日期格式
How to convert two different string dates into a single date format
我有两个字符串要转换成特定的日期时间格式,以便进行比较。我遇到的问题是它在解析中出错并出现异常,我想知道我是否做错了什么。想问一下将两个不同的字符串日期转换为单一日期格式的最佳方法是什么
SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
String firstDateString= "11 May 2018 21:03:51 GMT";
String secondDateString= "dataStore.get("2018-05-11T21:03:51Z";
Date firstDateFormat =localDateFormat.parse(firstDateString);
Date secondDateFormat =localDateFormat.parse(secondDateString);
Problem I have is that it errors out in the parse with an exception
and I wonder if I am doing something wrong.
=> 是的,您确实在这样做。您首先需要解析日期为实际格式,然后格式化为所需格式。
例如:用于解析和格式化2018-05-11T21:03:51Z
DateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:MM:SS'z'", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
Date date = originalFormat.parse("2018-05-11T21:03:51Z");
String formattedDate = targetFormat.format(date); // 2018 05 11 - 21:03:51
这里:
SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
该格式表示:4 年数字 SPACE 2 天数字 SPACE 2 个月数字 DASH 等等。
事实是:你的字符串日期都不是:
"11 May 2018 21:03:51 GMT"
"2018-05-11T21:03:51Z"
看起来像那样。第一个是 "dd M yyy ..."(不以年份开头),第二个使用“-”而不是“”作为初始日期的分隔符。
答案:您必须使用真正匹配预期日期字符串的模式,请参阅here了解规范。请注意,例如您需要使用 M
来匹配 "May",小写的 m
大约是 个数字 ,而不是单词!
注意:第二个示例是 ISO 日期,DateTimeFormatter 已经为这些日期预定义了格式化程序! (所以要小心重新发明轮子)
java.time
DateTimeFormatter firstFormatteer
= DateTimeFormatter.ofPattern("d MMM uuuu H:mm:ss z", Locale.ENGLISH);
String firstDateString = "11 May 2018 21:03:51 GMT";
String secondDateString = "2018-05-11T21:03:51Z";
Instant firstInstant = firstFormatteer.parse(firstDateString, Instant::from);
Instant seoncdInstant = Instant.parse(secondDateString);
System.out.println("The strings are parsed into " + firstInstant + " and " + seoncdInstant);
输出为:
The strings are parsed into 2018-05-11T21:03:51Z and 2018-05-11T21:03:51Z
来自两个服务的字符串采用两种不同的格式,您能做的最好的事情就是以两种不同的方式处理它们。首先,定义一个匹配格式的格式化程序。第二个是 ISO 8601 格式。 Instant
解析这种格式没有任何明确的格式化程序,所以这里我们不需要定义一个。
比较做例子:
if (firstInstant.isBefore(seoncdInstant)) {
System.out.println("The first date and time comes first");
} else if (firstInstant.equals(seoncdInstant)) {
System.out.println("The date and time is the same");
}
The date and time is the same
Instant
class 是 Date
class 的现代替代品,它代表了一个时刻。
Date
class 设计不佳,SimpleDateFormat
出了名的麻烦,幸运的是它们都已经过时了。我建议您避免使用它们并改用 java.time,现代 Java 日期和时间 API。
Link: Oracle tutorial: Date Time 解释如何使用 java.time.
我有两个字符串要转换成特定的日期时间格式,以便进行比较。我遇到的问题是它在解析中出错并出现异常,我想知道我是否做错了什么。想问一下将两个不同的字符串日期转换为单一日期格式的最佳方法是什么
SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
String firstDateString= "11 May 2018 21:03:51 GMT";
String secondDateString= "dataStore.get("2018-05-11T21:03:51Z";
Date firstDateFormat =localDateFormat.parse(firstDateString);
Date secondDateFormat =localDateFormat.parse(secondDateString);
Problem I have is that it errors out in the parse with an exception and I wonder if I am doing something wrong.
=> 是的,您确实在这样做。您首先需要解析日期为实际格式,然后格式化为所需格式。
例如:用于解析和格式化2018-05-11T21:03:51Z
DateFormat originalFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:MM:SS'z'", Locale.ENGLISH);
DateFormat targetFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
Date date = originalFormat.parse("2018-05-11T21:03:51Z");
String formattedDate = targetFormat.format(date); // 2018 05 11 - 21:03:51
这里:
SimpleDateFormat localDateFormat = new SimpleDateFormat("yyyy dd mm - HH:mm:ss");
该格式表示:4 年数字 SPACE 2 天数字 SPACE 2 个月数字 DASH 等等。
事实是:你的字符串日期都不是:
"11 May 2018 21:03:51 GMT"
"2018-05-11T21:03:51Z"
看起来像那样。第一个是 "dd M yyy ..."(不以年份开头),第二个使用“-”而不是“”作为初始日期的分隔符。
答案:您必须使用真正匹配预期日期字符串的模式,请参阅here了解规范。请注意,例如您需要使用 M
来匹配 "May",小写的 m
大约是 个数字 ,而不是单词!
注意:第二个示例是 ISO 日期,DateTimeFormatter 已经为这些日期预定义了格式化程序! (所以要小心重新发明轮子)
java.time
DateTimeFormatter firstFormatteer
= DateTimeFormatter.ofPattern("d MMM uuuu H:mm:ss z", Locale.ENGLISH);
String firstDateString = "11 May 2018 21:03:51 GMT";
String secondDateString = "2018-05-11T21:03:51Z";
Instant firstInstant = firstFormatteer.parse(firstDateString, Instant::from);
Instant seoncdInstant = Instant.parse(secondDateString);
System.out.println("The strings are parsed into " + firstInstant + " and " + seoncdInstant);
输出为:
The strings are parsed into 2018-05-11T21:03:51Z and 2018-05-11T21:03:51Z
来自两个服务的字符串采用两种不同的格式,您能做的最好的事情就是以两种不同的方式处理它们。首先,定义一个匹配格式的格式化程序。第二个是 ISO 8601 格式。 Instant
解析这种格式没有任何明确的格式化程序,所以这里我们不需要定义一个。
比较做例子:
if (firstInstant.isBefore(seoncdInstant)) {
System.out.println("The first date and time comes first");
} else if (firstInstant.equals(seoncdInstant)) {
System.out.println("The date and time is the same");
}
The date and time is the same
Instant
class 是 Date
class 的现代替代品,它代表了一个时刻。
Date
class 设计不佳,SimpleDateFormat
出了名的麻烦,幸运的是它们都已经过时了。我建议您避免使用它们并改用 java.time,现代 Java 日期和时间 API。
Link: Oracle tutorial: Date Time 解释如何使用 java.time.