`

晦涩的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年的编辑。

分享到:
评论

相关推荐

    java日期处理大全

    ### Java日期处理大全:掌握时间的艺术 在Java编程中,日期和时间的处理是不可或缺的一部分,尤其是在涉及到数据记录、时间戳、定时任务等场景时。本文将深入探讨Java中的日期处理技术,涵盖从基础到进阶的各种技巧...

    java日期处理总结

    java中关于日期处理的总结,包含各种日期格式之间的转java.util.Date(已经不提倡使用,该类的方法比较少) java.util.Calendar(抽象类) java.util.GregorianCalendar(是Calendar的子类,日期处理时候经常使用该类)****...

    java日期处理

    java日期处理

    java语言日期处理大全

    以下是一些关于Java日期处理的关键知识点,这些知识点在给定的文件中有所提及: 1. **获取当前日期**: Java通过`java.util.Date`类可以获取服务器上的当前日期。创建一个Date对象即会返回当前系统时间,如`Date ...

    Java日期处理工具类

    基本涵盖了各种场景的日期处理需要,包括时间类型转换,获取N天前后,月初月末,某段时间按天拆分等功能,欢迎使用。

    java处理日期合并

    ### Java处理日期合并知识点 #### 一、背景与概述 在日常工作中,我们经常会遇到需要对一系列的时间段进行处理的情况,比如安排会议时间、统计员工请假时间等。这些时间段往往存在重叠的情况,如何有效地合并这些...

    Java中日期处理的代码

    根据给定的文件标题、描述、标签以及部分内容,我们可以总结出以下有关 Java 日期处理的知识点: ### 1. 导入必要的包 在 Java 中处理日期时,我们需要导入一些必要的包来支持日期时间的格式化、解析等功能。示例...

    java中的日期处理类总结

    Java中的日期处理涉及到多个类,包括Date、Calendar、GregorianCalendar以及日期格式化类如DateFormat和SimpleDateFormat。这些类主要用于管理、操作和格式化日期和时间。以下是对这些类的详细说明: 1. **Date类**...

    java日期处理小结

    在Java中,日期处理是一项常见的任务,涉及到多个类和方法。本篇文章主要总结了Java中关于日期处理的基础知识,包括`java.util.Calendar`,`java.util.GregorianCalendar`以及`java.util.Date`这三个核心类。 首先...

    java(日期处理大全)

    第一部分关于JAVA的Date (参考关于JAVA的Date总结) 第二部分Date工具类(参考一个总结好的很好的关于JAVA的Date工具类)

    JAVA处理日期时间常用方法

    Java中的日期和时间处理是程序开发中常见的任务,涉及到各种日期和时间的计算、格式化以及比较等操作。在Java中,主要使用`java.util.Date`、`java.util.Calendar`和`java.text.SimpleDateFormat`这三个核心类来处理...

    java日期处理方法

    ### Java日期处理方法 在Java开发中,对日期与时间的操作是极其常见且重要的一个环节。无论是处理用户的出生年月日、注册日期还是订单的创建时间等,都需要使用到Java提供的日期类进行处理。本文将深入探讨Java中的...

    JAVA日期与字符串的转换

    ### JAVA日期与字符串的转换 在Java编程中,经常需要将日期对象转化为字符串形式以便于存储或显示,或者反过来将字符串转化成日期对象来进行日期计算等操作。本文将详细介绍如何在Java中实现这两种转换。 #### 一...

    Java日期管理程序

    在 Java 中,日期类是用于处理日期和时间的类,包括 java.util.Date、java.sql.Date、java.time.LocalDate、java.time.LocalDateTime 等。这些类提供了对日期和时间的操作和处理,例如获取当前日期、计算日期差、...

    常用代码:java日期处理

    这篇博客"常用代码:java日期处理"很可能包含了关于如何在Java中有效地处理日期的实用示例和方法。这里我们将深入探讨Java日期处理的核心概念、API和最佳实践。 1. **Java日期API的发展历程** - Java 1.0引入了`...

    JSON转换为JAVA对象及日期格式转换处理 -

    JSON转换为JAVA对象及日期格式转换处理 -

    Java日期处理类 自己整理的

    自己整理的Java日期处理类 。包含获取两个之间段之间的天数、月初日期,月末日期、一个时间段之间的所有的日期,月份 一周的第一天,最后一天、 当前是周几等。仅供参考

    java日期和查询数据库生成XML文件类

    1. **Java日期处理**: - `java.time`包:Java 8引入的新时间日期API,提供了`LocalDate`, `LocalTime`, `LocalDateTime`等类,它们提供了丰富的日期和时间操作功能。 - `SimpleDateFormat`:旧版日期格式化工具,...

    java日期格式转换

    ### Java日期格式转换详解 在Java开发中,对日期和时间进行操作是非常常见的需求之一。本文将基于给定文件中的代码示例,详细介绍如何在Java中实现日期格式的转换,并探讨其中涉及的关键知识点。 #### 一、理解...

Global site tag (gtag.js) - Google Analytics