关于如何比较字符串格式的2个日期的任何想法:
String1 = "Wed May 18 00:00:00 CDT 2011"
String2= "May. 18, 2011"
我尝试将String1
转换为String2
的日期格式,但效果不是很好。
我尝试使用模式String1
"EEE mmm dd HH:mm:ss z yyyy"
转换为日期
public String formatDateTime(Date date, String pattern) {
SimpleDateFormat formatter = new SimpleDateFormat(pattern);
String dateString = formatter.format(date);
return dateString;
}
答案 0 :(得分:1)
此解决方案可行,但是,您需要注意计算机运行的时区。如果在EDT中生成第二个日期,则第二个日期没有时区会导致问题。
String d1 = "Wed May 18 00:00:00 CDT 2011";
String d2 = "May. 18, 2011";
SimpleDateFormat d1Formatter = new SimpleDateFormat("E MMMM dd HH:mm:ss z yyyy");
SimpleDateFormat d2Formatter = new SimpleDateFormat("MMMM. dd, yyyy");
Date date1 = d1Formatter.parse(d1);
Date date2 = d2Formatter.parse(d2);
date1.equals(date2);
请注意我使用的所有模式来自documentation。我建议创建一个单元测试并测试不同的组合。
@Test
public void test_date_experimentation() {
SimpleDateFormat d1Formatter = new SimpleDateFormat("E MMMM dd HH:mm:ss z yyyy");
// Print the current time in the specified format.
System.out.println(d1Formatter.format(Date.from(Instant.now())));
}
答案 1 :(得分:-1)
要将String
转换为Date
,您应该使用parse
方法。但是您使用的是format
方法,它正好相反(它会将Date
转换为String
)。
要检查2 String
是否与同一日期相对应,您必须为每个SimpleDateFormat
解析它们。但是要记住两个细节:
请注意,星期的月份和星期几是英语,因此您应使用java.util.Locale
来指明要使用的语言。如果您没有指定一个,它将使用系统的默认值,并且不保证始终为英语。
即使是这样,即使在运行时也可以在不事先通知的情况下更改此配置,因此明确使用特定的配置总是更好。
第一个String
有时区信息:CDT
- 我假设它是美国的中部夏令时(尽管it could also be Cuba Daylight Time)。但是第二个String
没有任何时区信息,所以我假设它与第一个String
处于同一时区。
如果我没有指定它,将使用系统的默认值,如果它不是CDT,它可能会给你不同的结果。与locales发生的情况类似,即使在运行时也可以在不事先通知的情况下更改默认值,因此最好指定您正在使用的默认值。
String s1 = "Wed May 18 00:00:00 CDT 2011";
String s2 = "May. 18, 2011";
// use English locale for month and day of week
SimpleDateFormat sdf1 = new SimpleDateFormat("E MMMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
SimpleDateFormat sdf2 = new SimpleDateFormat("MMMM. dd, yyyy", Locale.ENGLISH);
// set timezone, because String 2 has no timezone information
sdf2.setTimeZone(TimeZone.getTimeZone("America/Chicago"));
// parse the dates
Date date1 = sdf1.parse(s1);
Date date2 = sdf2.parse(s2);
// compare them
boolean areDatesEqual = date1.equals(date2);
变量areDatesEqual
的值为true
(日期相同)。
请注意,我使用America/Chicago
作为时区名称。如果我使用CDT
,则TimeZone
类无法识别它,并且会给出错误的结果。
最好使用IANA timezones names(始终采用Region/City
格式,例如America/Chicago
或Europe/London
)。
避免使用3个字母的缩写(例如CDT
或PST
),因为它们是ambiguous and not standard。
有more than one timezone that uses CDT,因此您必须选择最适合您系统的那个。
您可以致电TimeZone.getAvailableIDs()
。
旧类(Date
,Calendar
和SimpleDateFormat
)有lots of problems和design issues,它们将被新API取代。< / p>
如果您使用的是 Java 8 ,请考虑使用new java.time API。它更容易,less bugged and less error-prone than the old APIs。
如果您使用的是 Java&lt; = 7 ,则可以使用ThreeTen Backport,这是Java 8新日期/时间类的绝佳后端。对于 Android ,有ThreeTenABP(更多关于如何使用它here)。
以下代码适用于两者。
唯一的区别是包名称(在Java 8中为java.time
,在ThreeTen Backport(或Android的ThreeTenABP)中为org.threeten.bp
),但类和方法名称是相同的
当您只比较日期(日/月/年)时,最好只使用这些字段并忽略其余字段(小时/分钟/秒和时区信息)。为此,您可以使用LocalDate
和DateTimeFormatter
:
String s1 = "Wed May 18 00:00:00 CDT 2011";
String s2 = "May. 18, 2011";
// use English locale for month and day of week
DateTimeFormatter fmt1 = DateTimeFormatter.ofPattern("E MMMM dd HH:mm:ss z yyyy", Locale.ENGLISH);
DateTimeFormatter fmt2 = DateTimeFormatter.ofPattern("MMMM. dd, yyyy", Locale.ENGLISH);
// parse the strings
LocalDate d1 = LocalDate.parse(s1, fmt1);
LocalDate d2 = LocalDate.parse(s2, fmt2);
// compare the dates
boolean areDatesEqual = d1.equals(d2);
由于LocalDate
只有日,小时和分钟(没有小时/分钟/秒,没有时区信息),因此您无需关心格式化程序中的时区设置 - 尽管关注英语现场仍然存在。
结果也是true
。