我得到两个日期作为字符串值,我想检查开始时间是否早于结束时间。我将它们比较为未使用SimpleDateFormat
将它们转换为日期,如下所示:
String startTime = "2013-01-02 14:25:56";
String endTime = "2013-01-02 14:30:56";
if(endTime.compareTo(startTime) > 0){
System.out.println("End time is greater than start time");
}
是否真的有必要将它们转换为日期并进行比较?我会错过什么吗?我做对了吗?
答案 0 :(得分:17)
如果日期格式正确,您将缺少的是验证。
如果日期格式化完全,则每次都显示,那么这将有效。如果它可能有所不同,那么解析和比较生成的Date
对象将至少增加一些检查。
例如,如果两个日期中的一个碰巧被格式化为2013.01.02 14:30:56
,或者它甚至包含未格式化的日期,例如yesterday
,那么您的代码会默默地假设某个订单(这很可能与实际订单没什么关系)并继续。它应该做的是通知用户(或日志文件,......)某些期望未得到满足。
答案 1 :(得分:11)
是否真的有必要将它们转换为日期并进行比较?
如果您不必包含时区,并且可以确保您始终拥有此格式,则词法顺序将起作用。
我会错过什么吗?
你失去了灵活性
我做对了吗?
这取决于观点。我在专门的搜索引擎中使用类似的东西(仅出于性能原因)。通常我会转换为日期并比较这些对象。
答案 2 :(得分:8)
这不是好习惯和代码味道。
您丢失了语义正确且可读的代码。 (以及已经说过的可扩展性,时区和其他正确的事情)
您不想比较两个String
,想要比较2 Date
s - 所以只需这样做,比较两个Date
个对象。
如果您创建单元测试并测试比较方法,则永远不会编写一个方法,在每种情况下都能正确地比较2个“字符串” - 日期,而不会将它们转换为日期。
答案 3 :(得分:7)
当且仅当满足以下3个条件时,您可以比较日期时间而不正确解析它:
日期时间始终采用相同的格式:
Jan
> April
,Wed
> Thu
)。10:01
< 1:01
(:
的ASCII码比数字大。)字段按单位大小按降序排列(右侧较大,左侧较小)。例如:YEAR-MONTH-DAY HOUR:MINUTE:SECOND.MILISECOND
他们必须在同一时区。时区信息(如果存在)应具有相同的显示(SGT
和UTC+8
当前是等效的,但字符串比较不知道这一点。请注意,上述 不明确的 条件"相同的时区" 足以比较相等,但要比较大/小,在比较的两个日期之间,时区一定不会发生变化。
答案 4 :(得分:2)
怎么样
"999-01-01 00:00:00"
"10000-01-01 00:00:00"
答案 5 :(得分:1)
我建议首先将它们转换为日期更安全一点,但只要您确定格式(或时区等)永远不会改变您,那么日期比较并比较该格式字符串应始终等效。
答案 6 :(得分:1)
你的方法很好,因为yyyy-mm-dd hh:ii:ss可以比较为字符串并得到正确的结果,其他日期格式将失败
另一种选择是阅读此stackoverflow问题
你只需解析你的字符串并创建日期或日历对象,取决于你想做什么,下面是我认为有用的东西
http://www.mkyong.com/java/java-how-to-get-current-date-time-date-and-calender/
答案 7 :(得分:1)
是的,最好将String转换为Date并进行比较。
答案 8 :(得分:1)
是否使用Java,您必须首先问以下问题:
如果您需要比较天数,那么'YYYY-MM-dd'格式的字符串就完美而有效:
'2018-01-23' < '2018-03-21'
。始终以任何语言。
有时间且没有时区,然后将时间存储为“ YYYY-MM-dd HH:mm:ss”也很好。
使用时区,那么您必须学习平台(代码和数据库),并了解utc是什么(祝您好运!)。
(根据http://xkcd.com/1179/的CC BY-NC 2.5许可使用。)
答案 9 :(得分:0)
我的日期来自基于字符串的来源,并且始终格式为YYYY-MM-DD,没有时区信息或其他复杂情况。因此,在比较一长串日期时,将它们作为字符串进行比较更简单,更有效,而不是先将它们转换为日期对象。
在我的代码中犯了这个错误之前,这从来都不是问题:
boolean past = (dateStart.compareTo(now) == -1);
这会产生一些不正确的结果,因为compareTo不会仅将值返回为-1,0或1.这是一个简单的修复:
boolean past = (dateStart.compareTo(now) < 0);
我在这里包含了这个问题,因为这是我在弄清楚我做错了什么时发现的SO问题之一。