所以我使用dateString1.compareTo(dateString2)
根据每个字符的Unicode值对字符串进行字典比较,并返回一个int。这是一个代码示例。
String dateString1 = "05-12-2012";
String dateString2 = "05-13-2012";
if (dateString1.compareTo(dateString2) <=0){
System.out.println("dateString1 is an earlier date than dateString2");
}
这是比较Java日期的错误方法吗?
在我的测试中,我没有遇到过我意外结果的情况。我真的不想从字符串中创建一个Date对象,如果我不需要,因为我在一个长时间运行的循环中这样做。
Ninja Edit
从下面的答案中收集,将日期作为字符串进行比较是没有错的,如果它是yyyyMMdd
格式,但如果它是任何其他格式,则显然会导致错误。
我的实际代码中实际上我的日期字符串为yyyyMMdd
格式。 (我在上面给出的示例中输入了错误的格式。)所以现在,我将保留代码,并添加几行注释以证明我的决定。
但我现在看到比较像这样的字符串是非常有限的,如果dba决定改变日期格式,我会遇到错误,我认为没有发生。
答案 0 :(得分:17)
使用字符串来处理Java中的日期并不总是最佳选择。例如,当它是跳跃年份时,2月份会有额外的一天。因为字符串看似正确,所以执行转换更合适。 Java验证日期是否正确。
您可以使用SimpleDateFormat类将字符串转换为日期。
public static void main(String[] args) throws ParseException {
String dateString1 = "05-12-2012";
String dateString2 = "05-13-2012";
SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");
Date date1 = format.parse(dateString1);
Date date2 = format.parse(dateString2);
if (date1.compareTo(date2) <= 0) {
System.out.println("dateString1 is an earlier date than dateString2");
}
}
找出允许检查哪些参数Customizing Formats (The Java™ Tutorials > Internationalization > Formatting)
答案 1 :(得分:8)
我建议您做正确的事(as described here)并转换为正确的Date
个对象进行比较。如果它实际上影响您的应用程序(它可能不会),请担心性能影响。
答案 2 :(得分:4)
现在非常糟糕,因为现在你无法处理一年的变化。
如果你想这样,你可能想把日期格式化为YYYY-MM-DD
所以新的一年不会破坏它。
答案 3 :(得分:3)
使用字母顺序规则来处理日期排序是很糟糕的,主要是因为你遇到根据字母和数字系统对事物进行不同排序的问题
字母
01-02-2011 comes before
01-1-2011 (because 0 in the date field is before 1 in the other date field)
对于号码系统
01, 02, 2011 comes after
01, 1, 2011 because all fields are being compared like numbers
日期对象扩展数字比较以了解哪些字段在比较中优先,因此您不会在较早的月份之前将日期“放在”另一个实际发生在后一个月但是较早年份的日期之前。
如果您严格控制日期格式,则可以将日期对齐,以便它们也遵循字母规则;但是,如果您不小心注入了错误格式化的日期,那么这样做可能会导致您的整个程序以奇怪的方式失败。
执行此操作的典型方法是(不推荐,请使用非字符串日期比较)
YYYYMMDD
(year)(month)(day) all zero-padded.
最后一种技术主要包括在内,因为你最终会在野外看到它,应该认识它是什么:尝试处理没有正确日期库的日期(也就是一个聪明的黑客)。
答案 4 :(得分:2)
如上所述,通常使用日期时间对象而不是字符串更好。
其他答案使用旧的过时的日期时间类,这些类已被证明设计糟糕,令人困惑且麻烦。他们缺少一个真正代表仅限日期的值的类,没有时间和没有时区。
而是使用Java 8及更高版本中内置的java.time框架。见Oracle Tutorial。许多java.time功能都被反向移植到Java 6&amp; ThreeTen-Backport中的7,并在ThreeTenABP中进一步适应Android。
String input = "05-12-2012";
DateTimeFormatter formatter = DateTimeFormatter.ofPattern( "MM-dd-yyyy" );
LocalDate ld = LocalDate.parse( input , formatter );
LocalDate
实施compareTo
。此外,您可以调用方法equals,isBefore,isAfter。
Boolean isEarlier = ld.isBefore( someOtherLocalDate );
答案 5 :(得分:1)
如果您只对每个日期进行一次读取,则YYYYMMDD(不是MMDDYYYY)可能是最佳解决方案。但是,如果您打算多次处理每个日期(例如,您正在对它们进行排序),那么确定最好将它们更改为可以比字符串更快比较的对象(例如日期)