• 博客园logo
  • 会员
  • 周边
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
20145236冯佳
博客园    首页    新随笔    联系   管理    订阅  订阅
20145236 《Java程序设计》第7周学习总结

20145236 《Java程序设计》第7周学习总结

教材学习内容总结

第十三章 时间与日期

认识时间与日期

时间的度量

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

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

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

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

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

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

  • 重点总结

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

年历简介

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

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

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

认识时区

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

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

代码调试中的问题和解决过程

认识Date与Calendar

时间轴上瞬间的Date

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

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

格式化时间日期的DateFormat

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

取得SimpleDateFormat实例的方法

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

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

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

处理时间日期的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()复制对象的动作。

设定TimeZone

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

JDK8新时间日期API

机器时间观点的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实例,代表运算后的瞬时。

人类时间观点的API

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

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

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

对时间的运算

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

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

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

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

  • MonthDay是只读的。

年历系统设计

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

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

教材学习中的问题和解决过程

新时间与日期API以类Duration来定义,可用于计量天、时、分、秒的时间差,精度调整可以达纳秒等级,而秒的最大值可以是long类型。简单来说,Period是日期差,between()方法只接受LocalDate,不表示比“日”更小的单位,而Duration是时间差,between()可以接受Temporal操作对象。
下面是使用新时间与日期API改写:

import java.time.*;
import java.util.Scanner;
import static java.lang.System.out;

public class HowOld2 {
    public static void main(String[] args) {
        out.print("输入出生年月日(yyyy-mm-dd):");
        LocalDate birth = LocalDate.parse(new Scanner(System.in).nextLine());
        LocalDate now = LocalDate.now();
        Period period = Period.between(birth, now);
        out.printf("你活了 %d 年 %d 月 %d 日%n",
                period.getYears(), period.getMonths(), period.getDays());
    }
}

运行结果:

本周代码托管截图

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 1/5 22/60
第四周 500/1500 1/6 30/90
第五周 500/2000 1/7 20/110
第六周 500/2500 2/9 20/130
第七周 500/3000 2/11 20/150

参考资料

  • Java学习笔记(第8版)
  • 《Java学习笔记(第8版)》学习指导
恍惚中,时光停滞,岁月静好。。。
posted on 2016-04-17 12:18  20145236冯佳  阅读(323)  评论(1)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3