如果我使用弃用的日期方法来查看它们是否在同一天,可能会出现什么问题?

时间:2013-09-28 04:31:48

标签: java date datetime

目前,我有2个Date对象。两者都使用相同的语言环境在同一设备中生成。

使用

生成

1

SimpleDateFormat FORMATTER = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
Date date1 = FORMATTER.parse(date_string);

使用

生成另一个
Date date2 = new Date();

现在,我想比较两个日期是否在同一天。

根据Comparing two java.util.Dates to see if they are in the same day,我可以使用

Calendar cal1 = Calendar.getInstance();
Calendar cal2 = Calendar.getInstance();
cal1.setTime(date1);
cal2.setTime(date2);
boolean sameDay = cal1.get(Calendar.YEAR) == cal2.get(Calendar.YEAR) &&
                  cal1.get(Calendar.DAY_OF_YEAR) == cal2.get(Calendar.DAY_OF_YEAR);

由于我在移动设备中运行资源有限的代码,我想知道,如果我使用Date的弃用方法,可能会出现什么问题?

date1.getYear() == date2.getYear() && date1.getMonth() == date2.getMonth() && date1.getDate() == date2.getDate()

http://user.xmission.com/~goodhill/dates/datedeprecation.htm

我知道很多人谈论Date并不能很好地处理国际化问题。但是,在上面的场景中,是否有任何可靠的例子可以证明,如果我使用弃用的方法,那可能会出错?

2 个答案:

答案 0 :(得分:1)

对于那个具体的例子,不太可能出现任何问题。 @Jim有一个可能的场景,但它是一个(非常)边缘的情况。如果您在不合适的时间更改了默认时区,我怀疑您可能会遇到其他日期/时间API的类似问题。

但是,当您使用Date API时,会有很多其他(不同的)示例出现问题。

现在,如果你知道所有"技巧和陷阱"在Date API及其实现中,您当然可以避免它们,并安全地使用已弃用的方法。但是:

  • 你如何获得这些知识?
  • 你怎么知道你已经获得了所有所需的知识?
  • 你怎么知道维护代码的下一个人会有这方面的知识?

不推荐使用Date的原因是,由于许多设计问题,Java设计人员认为正确使用太难。国际海事组织,最好尊重他们的判断。

  

由于我在移动设备中运行资源有限的代码......

我不知道有任何确凿的证据证明Calendar类比使用Date使用的资源要多得多。将优化决策建立在纯粹的假设上是一个坏主意,特别是如果优化具有引入新bug的明确风险。 (而且你问这个问题的事实表明你知道存在潜在的风险......)

最佳策略是避免在新代码中使用已弃用的类和方法。期。并且只根据确凿证据进行优化。

答案 1 :(得分:0)

如果您使用弃用的方法,如果有人在代码中的其他地方或设备本身更改了默认时区(引入副作用问题),则可能会出现奇怪的情况。 java.util.Date上的normalize()方法取决于Timezone保持不变,如果它在移动设备上,我可以想到的一个例子是当用户在国外并且日期在原始时区的午夜附近时,它现在可以被处理就像前一天(这可能是可取的,但生日那天怎么样)?单独使用Date的一个大问题是它实际上是瞬间(fastTime基于以毫秒为单位设置的长值),因此它误导地表示日期和时间。在Java 8之前的最佳实践是通过日历访问日期,因此不存在关于您是否使用日期作为日期或日期时间的歧义。

private final BaseCalendar.Date normalize() {
    if (cdate == null) {
        BaseCalendar cal = getCalendarSystem(fastTime);
        cdate = (BaseCalendar.Date) cal.getCalendarDate(fastTime,
                                                        TimeZone.getDefaultRef());
        return cdate;
    }

    // Normalize cdate with the TimeZone in cdate first. This is
    // required for the compatible behavior.
    if (!cdate.isNormalized()) {
        cdate = normalize(cdate);
    }

    // If the default TimeZone has changed, then recalculate the
    // fields with the new TimeZone.
    TimeZone tz = TimeZone.getDefaultRef();
    if (tz != cdate.getZone()) {
        cdate.setZone(tz);
        CalendarSystem cal = getCalendarSystem(cdate);
        cal.getCalendarDate(fastTime, cdate);
    }