zoukankan      html  css  js  c++  java
  • java JDK8 学习笔记——第13章 时间与日期

    第十三章 时间与日期

    13.1 认识时间与日期

    13.1.1 时间的度量

    1、格林威治标准时间GMT 
    格林威治标准时间的正午是太阳抵达天空最高点之时。现在已经不作为标准时间使用。

    2、世界时UT
    世界时是借由观测远方星体跨过子午线而得,在引入UTC之前,GMT和UT是相同的。

    3、国际原子时TAI 
    将秒的国际单位定义为铯原子辐射振动91926331770周耗费的时间,从UT的1958年开始同步。

    4、世界协调时UTC 
    采用了闰秒修正,确保UTC与UT相差不会超过0.9秒,加入闰秒的时间通常会在6月底或12月底。

    5、Unix时间 
    定义为UTC时间1970年1月1日00:00:00为起点而经过的描述,不考虑闰秒修正,用以表达时间轴上的某一瞬间。

    6、epoch 
    某个特定时代的开始,时间轴上某一瞬间。

    7、重点总结

    (1)即使标注为GMT时间,实际上谈到时间指的是UTC时间。 
    (2)秒的单位定义是基于TAI,也就是铯原子辐射振动次数。
    (3)UTC考虑了地球自转越来越慢而又闰秒修正,确保哦UTC与UT相差不会超过0.9秒。 
    (4)Unix时间是1970年1月1日00:00:00为起点而经过的秒数,不考虑闰秒。

    13.1.2 年历简介

    1、儒略历
    儒略历是现今公历的前身,用来取代罗马历,修正了罗马历隔三年设置一闰年的错误,改采四年一闰。

    2、格里高利历 
    格里高利历将儒略历1582年10月4日星期四的隔天,订为格里高利历1582年10月15日星期五。

    3、ISO 8601标准 
    ISO 8601并非年历系统,而是时间日期表示方法的标准,用意统一时间日期的数据交换格式。在ISO 8601标准的定义中,19世纪是指1900年到1999年,而格里高利历的19世纪是指1801年到1900年。

    13.1.3 认识时区

    1、考虑了UTC偏移的时间表示上,通常会标识Z符号。

    2、日光节约时间 
    也称为夏季时间,基本上就是在时时的第一天,让白天的时间增加一小时,而最后一天结束后在调整一小时回来。

    13.2 认识Date与Calendar

    13.2.1 时间轴上瞬间的Date

    1、取得系统时间的方法之一是: 
    使用System.currentTimeMillis()方法,返回的是long类型的整数,代表1970年1月1日00:00:00至今经过的毫秒数。

    2、Date实例 
    Date实例基本上建议只用来当做时间轴上的某一瞬间。有关字符串时间格式的处理不再是Date的职责。

    13.2.2 格式化时间日期的DateFormat

    1、DateFormat是个抽象类,其操作类是java.text.SimpleDateFormat。

    取得SimpleDateFormat实例的方法

    (1)直接构建SimpleDateFormat实例 
    (2)使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance()等静态方法。

    2、直接构建SimpleDateFormat的好处是,可使用模式字符串自定义格式。

    3、相对于DateFormat可进行日期时间格式化,java.text.NumberFormat可用来进行数字格式化,他们都是java.text.Format的子类。

    13.2.3 处理时间日期的Calendar

    1、Calendar实例 
    用于取得某个时间日期信息,或者是对时间日期进行操作。
    Calendar是个抽象类,java.util.GregorianCalendar是其子类,操作了儒略历与格里高利历的混合历,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar的实例。

    2、如果打算只针对日期中某个字段加减,则可以使用roll()方法。

    3、日历时间可以使用GregorianCalendar的setGregorianCalendar()方法来修改,设为Date(Long.MAXVALUE)就是纯粹的儒略历,设为Date(Long.MINVALUE)就是纯粹的格里高利历。

    4、注意:

    在Calendar实例上进行add()之类的操作,会修改Calendar实例本身,为了避免调用yearsBetween()、daysBetween()之后传入的Calendar自变量被修改,两个方法中都对第一个自变量进行了clone()复制对象的动作。

    13.2.4 设定TimeZone

    使用java.util.TimeZone的getDefault()来取得默认时区信息。

    13.3 JDK8新时间日期API

    13.3.1 机器时间观点的API

    1、Calendar的getTime()返回false实例,取得Date实例,下一步应该获取时间信息,应该是通过Date的getTime()取得epoch毫秒数。

    2、机器相关的时间概念——Instant类
    用以代表自定义的Java epoch之后的某个时间点历经的毫秒数,精确度基本上是毫秒。使用Instant的静态方法now()取得代表Java epoch毫秒数的Instant实例,取得Instant实例后,可以使用plusSeconds()、plusMillis()、plusNanos()、minusSeconds()、minusMillis()、minusNanos()来做时间轴上的运算,Instant实例本身不会变动,这些操作会返回新的Instant实例,代表运算后的瞬时。

    13.3.2 人类时间观点的API

    1、LocalDateTime、LocalDate和LocalTime 
    这些类基于ISO 8601年历系统,是不具失时区的时间与日期定义。LocalDateTime、LocalDate和LocalTime 等类名称开头为Local,表示它们都只是对时间的描述,并没有时区信息。

    2、ZonedDateTime和OffsetDateTime 
    ZonedDateTime和OffsetDateTime间可以通过toXXX()方法互转,Instant通过atZone()与atOffset()转为ZonedDateTime和OffsetDateTime,ZonedDateTime和OffsetDateTime也都可以通过toInstant()取得Instant,ZonedDateTime和OffsetDateTime都有toLocalDate()、toLocalTime()、toLocalDateTime()方法可以取得LocalDate、LocalTime和LocalDateTime。

    3、Year、YearMonth、Month和MonthDay 
    Month是enum类型,想要取得代表月份的数字,不要使用oridinal()方法,需要使用getValue()方法。

    13.3.3 对时间的运算

    1、TemporalAmount
    对于时间的计量,新时间与日期API以类Duration来定义,可拥有计量天、时、分、秒的时间差,精确度调整可以达到纳秒等级,而秒的最大值可以是long类型可保存值。对于年、月、星期、日的日期差,则使用Period类定义。

    2、TemporalUnit 
    plus()方法另一重载版本,接受java.time.temporal.TemporalUnit实例,java.time.temporal.ChronoUnit是TemporalUnit实作类,使用enum实作。

    3、Temporal
    Instant、LocalDateTime、LocalDate、LocalTime、ZonedDateTime和OffsetDateTime都操作了Temporal接口。

    4、TemporalAccessor
    TemporalAccessor定义了只读的时间对象读取操作,实际上Temporal是TemporalAccessor子接口,增加了对时间的处理操作。

    MonthDay是只读的。

    13.3.4 年历系统设计

    1、java.time套件中的类在需要实行年历系统时都是单一的ISO8601年历系统。

    2、需要使用其他年历系统时 
    需要明确实行java.util.chrono中等操作了java.time.chrono.Chronology接口类。

  • 相关阅读:
    bzoj1072: [SCOI2007]排列perm
    bzoj1226: [SDOI2009]学校食堂Dining
    bzoj3208: 花神的秒题计划Ⅰ
    bzoj1079: [SCOI2008]着色方案
    bzoj3573: [Hnoi2014]米特运输
    bzoj1040: [ZJOI2008]骑士
    bzoj 1369: [Baltic2003]Gem
    bzoj2818: Gcd
    bzoj2705: [SDOI2012]Longge的问题
    整数分解
  • 原文地址:https://www.cnblogs.com/java-stx/p/5178514.html
Copyright © 2011-2022 走看看