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

参考资料

20145236 《Java程序设计》第7周学习总结的更多相关文章

  1. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  2. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  3. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

  4. 20145213《Java程序设计》第一周学习总结

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

  5. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  6. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  7. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  8. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  9. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

  10. 《Java程序设计》第九周学习总结

    20145224 <Java程序设计>第九周学习总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的 ...

随机推荐

  1. Creating, Stopping, Re-Starting and Deleting a Timer in Oracle Forms

    I have written many posts previously on Timers in Oracle Forms like how to change images randomly wi ...

  2. [转]ZigBee On Windows Mobile--ZigBee模块天线设计

    原文出处:http://www.cnblogs.com/dearsj001/archive/2008/10/26/1320029.html

  3. 精通正则表达式(第三版)——Mastering Regular Expressions,3rd Edition——读书笔记1

    基础知识介绍: 子表达式匹配 环视 引号内的字符串:"(^")*" 12小时制:(1[0123]|[1-9]):[0-5][0-9]*(am|pm) 24小时制:(([0 ...

  4. IDoc

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  5. kakfa的常用命令总结

    Kafka的版本间差异较大,下面是0.8.2.1的操作方法 首先cd到kafaka的bin目录下;   #step1启动zookeeper服务 nohup bin/zookeeper-server-s ...

  6. 使用Select命令创建菜单

    创建文本菜单的一半功夫都花在了创建菜单布局和获取输入的字符上.bash shell提供了一个很容易上手的小工具来自动完成这些工作select命令允许从单个命令行创建菜单,然后在提取输入的答案并自动处理 ...

  7. 12/09 Oracle练习之新建表

  8. Java存储过程调用CallableStatement

    什么是存储过程? 一个存储过程是一个可编程的函数,它在数据库中创建并保存.它可以有SQL语句和一些特殊的控制结构组成.当希望在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过程是非常有 ...

  9. (一)SecureCRT连接虚拟机linux

    最近在学习linux,在使用SecureCRT连接虚拟机linux时遇到了一些问题,现在总结一下. 1.首先要配置linux配置文件,修改静态IP地址以及掩码,保持与本地在同一网段.更改配置文件方法如 ...

  10. final简介

    final简介 final用来修饰方法和属性表示特殊的意义.修饰方法时表示方法不能被重写:修饰属性时表示属性不能被改变,这里属性又分为对象和基本类型,修饰基本类型表示基本类型赋值以后不能再被赋值,修饰 ...