4

目前,我有 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并不能很好地处理国际化。但是,在上述情况下,是否有任何可靠的例子可以证明,如果我使用不推荐使用的方法,事情可能会出错?

4

2 回答 2

1

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

Date但是,当您使用API时,还有很多其他(不同的)示例可能会出错。

现在,如果您了解DateAPI 及其实现中的所有“技巧和陷阱”,您当然可以避免它们,并安全地使用已弃用的方法。但:

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

不推荐使用的原因Date是 Java 设计人员认为由于许多设计问题,它很难正确使用。IMO,最好尊​​重他们的判断。

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

我不知道有任何确凿证据表明这些Calendar类使用的资源比使用Date. 将优化决策仅仅基于假设是一个坏主意,尤其是在优化有引入新错误的明确风险的情况下。(而您提出这个问题的事实表明您知道存在潜在风险......)

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

于 2014-06-09T01:51:56.887 回答
0

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

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);
    }
于 2014-06-09T01:24:23.397 回答