Java 如果我使用不推荐的日期';方法查看它们是否在同一天?

Java 如果我使用不推荐的日期';方法查看它们是否在同一天?,java,date,datetime,Java,Date,Datetime,目前,我有两个日期对象。两者都是在相同的设备中使用相同的语言环境生成的 1是使用 SimpleDateFormat FORMATTER = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z"); Date date1 = FORMATTER.parse(date_string); Date date2 = new Date(); 另一个是使用 SimpleDateFormat FORMATTER = new SimpleDateFormat(

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

1是使用

SimpleDateFormat FORMATTER = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
Date date1 = FORMATTER.parse(date_string);
Date date2 = new Date();
另一个是使用

SimpleDateFormat FORMATTER = new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss Z");
Date date1 = FORMATTER.parse(date_string);
Date date2 = new Date();
现在,我想比较两个日期是否是同一天

据我所知,我可以使用

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()


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

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

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);
    }

就这一具体例子而言,不太可能出现任何问题@吉姆有一个可能的情况,但这是一个(极端)边缘的情况。我怀疑如果在不合适的时间更改默认时区,您可能会遇到与其他日期/时间API类似的问题

然而,当您使用
Date
api时,有很多其他(不同的)例子可能会出错

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

  • 你是如何获得这些知识的
  • 你如何知道你已经获得了你所需要的所有知识
  • 你怎么知道下一个维护你的代码的人会知道呢
Date
被弃用的原因是Java设计人员认为由于许多设计问题,它很难正确使用。在国际海事组织,最好尊重他们的判断

因为我在资源有限的移动设备上运行代码

我不知道有任何确凿的证据表明
日历
类比使用
日期
类使用的资源要多得多。将优化决策仅仅建立在假设上是一个坏主意,特别是当优化有引入新bug的明确风险时。(你问这个问题的事实表明,你知道存在潜在风险…)


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

为什么您认为使用正确的类和方法会比使用旧的不推荐的方法造成如此大的资源消耗问题?只要做正确的事情,并优化,如果你有一个问题,并已证明问题是由日历造成的。有几个类似的问题。。。。日历API是资源密集型的,这也是不正确的。日期本身的实际概念是复杂的,当前一代移动设备肯定能够处理它。谢谢你的信息。但是,我们能不能用一个可靠的例子来说明可能出现的问题?在未来的Java版本中,被贬低的方法可能会消失。