欢迎光临散文网 会员登陆 & 注册

java 核心技术-12版 卷Ⅰ- 4.2.2 LocalDate类

2023-02-18 22:12 作者:CC挑灯夜读_谷  | 我要投稿

    在前面的例子中,我们使用了Java标准类库中的Date 类。Date类的实例有一个状态,也就是一个特定的时间点。

    尽管在使用 Date类时不必知道这一点,但时间是用距离一个固定时间点的毫秒数(可正可负)表示的,这个时间点就是所谓的纪元(epoch),它是UTC时间1970年1月1日 00:00:00。UTC 就是Coordinated Universal Time(国际协调时间),与大家熟悉的GMT(Greenwich Mean Time,格林尼治时间)一样,是一种实用的科学标准时间。

    但是,Date类对于处理人类记录日期的日历信息并不是很有用,如“December 31,1999”。这个特定的日期描述遵循Gregorian 阳历,这是世界上大多数国家使用的日历。但是,同样的这个时间点采用中国或希伯来的阴历来描述会大不相同,倘若我们有来自火星的顾客,基于他们使用的火星历来描述这个时间点就更不一样了。

注释:有史以来,人类的文明与历法的设计息息相关, 日历要为日期指定名字,指定太阳和月亮的周期次序。要了解有关世界上各种日历的有趣解释,从法国大革命的日历到玛雅人计算日期的方法,请参见Nachum Dershowitz 和 Edward M. Reingold 编写的《Calendrical Calculations》第4版(剑桥大学出版社,2018年)

    类库设计者决定将保存时间与给时间点命名分开。所以,标准Java类库分别包含了两个:一个是用来表示时间点的Date类;另一个是用大家熟悉的日历表示法表示日期的LocalDate类。Java8引入了另外一些类来处理日期和时间的不同方面——有关内容参见卷2第6章。

    将时间度量与日历分开是一种很好的面向对象设计。通常,最好使用不同的类表示不同的概念。

    不要使用构造器来构造器LocalDate 类的对象。实际上,应当使用静态工厂方法(factory method),它会代表你调用构造器。下面的表达式:

    LocalDate.now();

    会构造一个一个新对象,表示构造这个对象时的日期。

    可以提供年、月和日来构造有对应一个特定日期的对象:

    LocalDate.of(1999,12,31); 

    当然,通常我们都希望将构造的对象存在一个对象变量中:

    LocalDate newYearsEve = LocalDate.of(1999 , 12, 31);

    一旦有了一个LocalDate对象,可以用方法getYear、getMonthValue和 getDayOfMonth 得到年月和日:

    int year = newYearEve.getYear(); // 1999

    int month = newYearEve.getMonthValue(); // 12

    int day = newYearEve.getDayOfMonth();//31

    看起来这似乎没有多大的意义,因为这正是构造对象时使用的那些值。不过,有时候可能有一个计算得到的日期,然后你希望调用这些方法来了解它的更多信息。例如, plusDays方法会生成一个新的LocalDate,如果把应用这个方法的对象称为当前对象,那么这个新日期对象则是距当前对象指定天数的一个新日期:

    LocalDate 类封装了一些实例字段来维护所设置的日期。如果不查看源代码,就不可能知道类内部的日期表示。当然,封装的意义就在于内部表示并不重要,重要的是类对外提供的方法。

    注释:实际上,Date类也有得到年月日的方法,分别是 getYear getMonth 和getDay,不过这些方法已经废弃。当类库设计者意识到某个方法最初就不该引入时,就把它标记为废弃,不鼓励使用。

    类库设计者意识到应当单独提供类来处理日历,不过在此之前只写方法已经是Date类的一部分了。Java1.1 中引入较早的一组日历类时,Date 方法被标记为废弃。虽然仍然可以在程序中使用这些方法,不过如果这样做,编译时会出现警告。最好不要使用废弃的方法,因为将来的某个类库版本很有可能将它们完全删除。

    

    提示:JDK提供了jdeprscan工具来检查你的代码中是否使用了Java API已经废弃的特性。有关说明参见  http://docs.oracle.com/en/java/javase/17/docs/specs/man/jdeprscan.html


上期参考代码


java 核心技术-12版 卷Ⅰ- 4.2.2 LocalDate类的评论 (共 条)

分享到微博请遵守国家法律