博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

20155217 2016-2017-2 《Java程序设计》第7周学习总结

Posted on 2017-04-08 11:36  20155217杨笛  阅读(236)  评论(8编辑  收藏  举报

20155217 2016-2017-2 《Java程序设计》第7周学习总结

教材学习内容总结

第十三章

13.1认识时间与日期
13.1.1时间的度量

1.格林威治标准时间(GMT):常被不严谨地当成是UTC时间,现已不作为标准时间使用。

2.世界时(UT):在1972年引入UTC之前,GMT与UT是相同的

3.国际原子时(TAI):秒的单位定义是基于TAI,也就是铯原子辐射振动次数。

4.世界协调时间(UTC):UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒。

5.Unix时间:不考虑闰秒修正,用以表达时间轴上某一瞬间

6.epoch:某个特定时代的开始,用以表达时间轴上某一瞬间

13.1.2年历简介

1.儒略历:修正了罗马历隔三年设置一闰年的错误,改采四年一闰。

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

3.ISO 8601标准,采用统一的数据格式例如:yyyy-mm-ddTHHH:MM:SS.SSS。

13.1.3认识时区

每个地区的标准时间各不相同,涉及到地理、法律、经济、社会、政治等问题。

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

有些高纬度国家,夏季、冬季日照时间差异很大,实施日光节约时间。

13.2认识Date与Calendar
13.2.2格式化时间日期的DateFormate

DateFormat是个抽象类,其操作类是java.text.SimpleDateFormat,你可以直接构建SimpleDateFormat实例,或是使用DateFormat的getDateInstance()、getTimeInstance()、getDateTimeInstance等静态方法,用较简便方式按不同需求取得SimpleDateFormat实例。

13.2.3处理时间日期的Calendar
  • Date现在建议作为时间轴上的瞬间代表,要格式化时间日期则通过DateFormat,如果想要取得某个时间日期信息,或者是对时间日期进行操作,可以使用Calendar实例。
  • Calendar是个抽象类,java.util.GregorianCalendar是其子类,操作了儒略历与格里高利历的混合历,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例。
Calendar calendar = Calendar.getInstance();
  • 取得Calendar实例后,可以使用getTime()取得Data实例,如果想要取得年月日等日期数字时段,可以使用get()方法并指定Calendar上的数字段枚举常数。
13.3JDK8新时间日期API
13.3.1机器时间观点的API

Date实例只代表机器观点的时间信息,真正可靠的信息只有内含epoch毫秒数。

同时也可以使用Instant的静态方法now()取得代表Java epoch毫秒数的Instant实例。

在新旧API兼容上,如果取得了Date实例,而想要改用Instant,则可以调用Date实例的toInstant()方法来取得,如果你有个Instant实例,可以使用Instant的静态方法from()转为Date。

13.3.2人类时间观点的API

LocalDateTime:包括日期与时间。
LocalDate:只有日期,如果设定不存在的日期,会抛出DateTimeException。
LocalTime:只有时间。

这些类基于ISO 8601年历系统,是不具时区的时间与日期定义。

对于LocalDateTime.of,由于没有时区信息,程序无从判断这个时间是否不存在,就不会抛出DateTimeException。

13.3.3对时间的运算

1.TemporalAmount

ofPattern()是java.time.format.DateTimeFormatter的静态方法,可以查看API文件了解格式化的方式。

对于时间计量,新时间与日期API以类Duration来定义,可用于计量天、时、分、秒的时间差,精度调整可以达纳秒等级,而秒的最大值可以是long类型可保存值。

对于年、月、星期、日的日期差,使用Period类定义。

plus()方法可以接受Duration实例来计算

2.TemporalUnit

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

TemporalUnit定义了between()等方法。

3.Temporal

相对于plus(),也有两个重载两个重载版本的minus():

plus(TemporalAmount amount)

plus(long amountToAdd,TemporalUnit unit)

minus(TemporalAmount amount)

minus(long amountToSubtract,TemporalUnit unit)

4.TemporalAccessor

TemporalAccessor定义了只读的时间对象读取操作,实际上Temporal是TemporalAccessor子接口,增加了对时间的处理操作,像是plus()、minus()、with()等方法。
13.3.4年历系统设计

java.time套件中的类在需要实行年历系统时都是采用单一的ISO8601年历系统。如需要其他年历系统,则需要明确实行java.time.chrono中等操作了java.time.chrono.Chronology接口的类。

部分代码运行截图:

  • eg:使用Date实例来取得系统时间描述。

  • eg:如何通过DateFormat的各种静态方法进行格式化。

  • eg:SimpleDateFormat有一个parse()方法,可以按构建SimpleDateFormat时指定的格式,将指定的字符串剖析为Date实例。

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

  • eg:使用新时间与日期API改写HowOld范例。

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

  • 问题1:

    不清楚ZonedDateTimeDemo.java程序运行结果中数字的含义.

  • 问题1解决方案:

    将ZonedDateTimeDemo.java程序改写如下:

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

public class ZonedDateTimeDemo2 {
public static void main(String[] args) {
LocalTime localTime = LocalTime.of(0, 0, 0);
LocalDate localDate = LocalDate.of(2016, 4, 16);
ZonedDateTime zonedDateTime = ZonedDateTime.of(
        localDate, localTime, ZoneId.of("Asia/Shanghai"));

out.println(zonedDateTime);
out.println(zonedDateTime.toEpochSecond());
out.println(zonedDateTime.toInstant().toEpochMilli());
}
}

运行结果如下。

之后又运行了一下之前的DateDemo.java,结果如下。

发现运行出来的数字与ZonedDateTimeDemo2.java的数字相差不多,于是可以判断出原来程序中的数字是机器时间起点至今经过的毫秒数。

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

  • 问题1:

    教材P435页提到“想比较两个Calendar的时间日期先后,可以使用after()和before()方法”,但是书中没有给出具体的例子,不知道是什么用法,应该传入什么样的参数。

  • 问题1解决方案:
    通过查询API可知:

    从而也可以推测出before()的用法,与after()恰好相反。

  • 问题2:

    教材p436页TimeZoneDemo.java代码运行结果:

时区ID显示的是Asia/Shanghai,不是北京。

  • 问题2解决方案:

    通过查阅相关资料,发现Java所支持的所有时区ID里面并没有Asia/Beijing,所以对于中国大陆时区的而言,显示的应该都是Asia/Shanghai

  • ...

代码托管

上周考试错题总结

这周的很多都是用英语出的问题,题干看不懂,查单词浪费了很多时间。但在考试的过程中我也发现,很多知识点并没有掌握牢固。

结对及互评

评分标准

  1. 正确使用Markdown语法(加1分):

    • 不使用Markdown不加分
    • 有语法错误的不加分(链接打不开,表格不对,列表不正确...)
    • 排版混乱的不加分
  2. 模板中的要素齐全(加1分)

    • 缺少“教材学习中的问题和解决过程”的不加分
    • 缺少“代码调试中的问题和解决过程”的不加分
    • 代码托管不能打开的不加分
    • 缺少“结对及互评”的不能打开的不加分
    • 缺少“上周考试错题总结”的不能加分
    • 缺少“进度条”的不能加分
    • 缺少“参考资料”的不能加分
  3. 教材学习中的问题和解决过程, 一个问题加1分

  4. 代码调试中的问题和解决过程, 一个问题加1分

  5. 本周有效代码超过300分行的(加2分)

    • 一周提交次数少于20次的不加分
  6. 其他加分:

    • 周五前发博客的加1分
    • 感想,体会不假大空的加1分
    • 排版精美的加一分
    • 进度条中记录学习时间与改进情况的加1分
    • 有动手写新代码的加1分
    • 课后选择题有验证的加1分
    • 代码Commit Message规范的加1分
    • 错题学习深入的加1分
    • 点评认真,能指出博客和代码中的问题的加1分
    • 结对学习情况真实可信的加1分
  7. 扣分:

    • 有抄袭的扣至0分
    • 代码作弊的扣至0分
    • 迟交作业的扣至0分

点评模板:

  • 博客中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:

    • xxx
    • xxx
    • ...
  • 基于评分标准,我给本博客打分:XX分。得分情况如下:xxx

  • 参考示例

点评过的同学博客和代码

  • 本周结对学习情况
    • 20155236
    • 结对照片
    • 结对学习内容
      • Calendar是个抽象类,java.util.GregorianCalendar是其子类,操作了儒略历与格里高利历的混合历,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例。
      • 对于时间计量,新时间与日期API以类Duration来定义,可用于计量天、时、分、秒的时间差,精度调整可以达纳秒等级,而秒的最大值可以是long类型可保存值。
      • TemporalAccessor定义了只读的时间对象读取操作,实际上Temporal是TemporalAccessor子接口,增加了对时间的处理操作,像是plus()、minus()、with()等方法。
  • 上周博客互评情况

其他(感悟、思考等,可选)

这周内容因为只要求一章内容,学习任务相对来说较为轻松。本次接触到了Java中的时间,认识到Java中对时间的处理机制,感觉Java还是很严谨细致的,时间虽然很重要,但在平时真的很少有专门关注到它,这次通过Java的学习,从时间到时区都大致了解了一下,也对Java中的处理方式有了初步的理解。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 5/5 1/4 20/20
第二周 140/145 1/5 18/38
第三周 330/451 1/6 16/54
第四周 578/1038 1/7 18/72
第五周 774/1472 1/8 18/90
第六周 1592/3064 1/9 18/108
第七周 1034/4098 1/10 22/130

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:25小时

  • 实际学习时间:22小时

  • 改进情况:要多看平时记得笔记,多问身边的学霸。

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料