关于如何比较字符串格式的2个日期的任何想法?

时间:2017-08-03 15:44:50

标签: java selenium datetime datetime-parsing datetime-comparison

关于如何比较字符串格式的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;  
}

2 个答案:

答案 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/ChicagoEurope/London)。 避免使用3个字母的缩写(例如CDTPST),因为它们是ambiguous and not standard

more than one timezone that uses CDT,因此您必须选择最适合您系统的那个。 您可以致电TimeZone.getAvailableIDs()

获取可用时区列表

Java新日期/时间API

旧类(DateCalendarSimpleDateFormat)有lots of problemsdesign 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),但类和方法名称是相同的

当您只比较日期(日/月/年)时,最好只使用这些字段并忽略其余字段(小时/分钟/秒和时区信息)。为此,您可以使用LocalDateDateTimeFormatter

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