晦涩的Java日期处理

原文链接:http://blog.csdn.net/rmartin/article/details/1452867

本文实在是旨在对Java标准库中日期处理之晦涩不堪现状的怒斥。在你反驳之前,请确信你了解过Joda(译注1)。我们问题的引发是因为所交付的客户不接受(因为某种原因)在其项目中使用开源的资源。

我与我的同事们最近在开发管理类库的一个简单的Java应用程序。昨天,我开始编写一个用来计算过期图书的罚金的模块,完成该模块就要算出截止日期与当前日期的间隔天数。其实也就是两个日期做下减法,可是,Java标准库却把这件事情搞得很复杂。

这两个日期是保存在Date对象中的。为了能做减法我必须要这样做:

  1. 把它们转换为Calendar对象
  2. 清除时间为午夜零时
  3. 把它们转换为基于epoch的毫秒数值
  4. 毫秒数值相减
  5. 除以86,000,000(一天转换为毫秒数)


下面是我写的代码:

  private int daysBetween(Date now, Date returnDate) {
    Calendar cNow = Calendar.getInstance();
    Calendar cReturnDate = Calendar.getInstance();
    cNow.setTime(now);
    cReturnDate.setTime(returnDate);
    setTimeToMidnight(cNow);
    setTimeToMidnight(cReturnDate);
    long todayMs = cNow.getTimeInMillis();
    long returnMs = cReturnDate.getTimeInMillis();
    long intervalMs = todayMs - returnMs;
    return millisecondsToDays(intervalMs);
  }

  private int millisecondsToDays(long intervalMs) {
    return (int) (intervalMs / (1000 * 86400));
  }

  private void setTimeToMidnight(Calendar calendar) {
    calendar.set(Calendar.HOUR_OF_DAY, 0);
    calendar.set(Calendar.MINUTE, 0);
    calendar.set(Calendar.SECOND, 0);
  }


很可能还有更好的方法,但这是我在昨天下午经过多次迭代之后所能想到的。可以设想一下,Java标准库可是动用了大量的智慧与精力打造而成的,像这种日期减法的基本功能想必是经过设计的。

这个问题我较早就碰到过。只不过在此前我是用其他类库来解决的,但在目前情形下,它不得已而变成了唯一的选择。

看着Java标准库的Date/Calendar,倒让我回想起了我10年前学到的一课。当时,我正在努力开发一个C++的可重用类库。记得那时 Stroustrup一言以蔽之:“唯一的可重用类库是那些现在已经被重用了的类库。”换句话说,如果你决定用假象现实困难的办法来开发类库的话,那就注 定要失败。从另一个角度说,你只能通过参与多项真实的工程,并为它们提供有效部件的方式来确保框架的成功打造。

我其实不知道Data/Calendar类库是如何创建的,但它暴露出了假象现实困难的马脚。而且,至少我认为它还不够好用。


(Tim的看法)

我的记得有过这样的说法,软件是有用的还是废品差别取决于开发它的人是为自己而开发还是为别人,前者创造出的必是有价值的软件,而后者的只能是废 品。现在看来依然是经典之谈。当我看到Java或MFC的日期类型库,也或是其它的什么库,然后再转而看看perl、python、ruby或甚至是 C++,我都能从中看出了这应验之道。尽管好用的东西也会慢慢的落伍,但至少它们是有用的。


译注1,Joda,某个知名的Java开源类库,在时间日期的处理上相比Java标准库更加强大且意用。对此感兴趣的朋友,可以在sourceforge网站找到详细资料。

 (原文链接网址:的英文blog网址:  http://butunclebob.com/ArticleS.UncleBob.JavaDates; Robert C. Martinhttp://www.butunclebob.com/ArticleS.UncleBob

作者简介:Robert C. MartinObject Mentor公司总裁,面向对象设计、模式、UML、敏捷方法学和极限编程领域内的资深顾问。他不仅是Jolt获奖图书《敏捷软件开发:原则、模式与实践》(中文版)(《敏捷软件开发》(英文影印版))的作者,还是畅销书Designing Object-Oriented C++ Applications Using the Booch Method的作者。MartinPattern Languages of Program Design 3More C++ Gems的主编,并与James Newkirk合著了XP in Practice。他是国际程序员大会上著名的发言人,并在C++ Report杂志担任过4年的编辑。

猜你喜欢

转载自usench.iteye.com/blog/2227640