20145335郝昊 《Java程序设计》第7周学习总结
教材学习内容总结
-
认识时间与日期
格林威治标准时间:简称GMT时间,参考格林威治皇家天文台的标准太阳时间。
世界时:简称UT,借由观测远方星体跨国子午线。
国际原子时:简称TAI,将秒的时间定义为铯原子辐射震动9192631770周耗费的时间。
世界协调时间:简称UTC,保持TAI与UT的时间不要差距过大。
Unix时间:Unix系统时间表示法,用以表达时间轴上某一瞬间。
epoch:简称为epoch毫秒数,从某个特定时代开始,时间轴上某一瞬间。
儒略历:用来取代罗马力,修正了隔三年设置一闰年的错误,改采四年一闰。
格里高利历:改革了儒略历。
ISO 8601标准:并非年历系统,而是时间日期表示方法的标准,用以统一时间日期的数据交换格式。
时区:大致来说经度15度偏移一个小时,考虑了UTC偏移的时间表示上,通常会标识Z符号。
-
Date与Calendar
-
关于Date:
想要取得系统时间,使用System.CurrentTimeMillis()方>法,返回的是long类型整数。
Date是偏向机器的时间观点。
有两个函数可以调用,一个可使用epoch毫秒数构建,另一个为无自变量构造函数,内部亦是使用SystemcurrentTimeMillis()取得epoch函数,调用getTime()可取得内部保存的epoch毫秒数。
-
关于DateFormat:
java.text.DateFormat用来有关字符串时间格式的处理。
操作类是java.text.SimpleDateFormat,可直接构建SimpleDateFormat实例。其好处是可以使用模式字符串自定义格式。
有个prase()方法,可以按照构建SimpleDateFormat时指定的格式,将指定的字符串剖析为Date实例。
-
关于Canlendar:
可以用其取得某个时间日期信息,或者是对时间日期进行操作,可以使用其实例。
可以使用getTime()方法取得Date实例
要想取得年月日日期时间字段,可以使用get()方法并指定Clendar上的字段枚举常数。
在取得一个Clendar实例后可以采用add()方法,来改变Clendar时间。
GregoricanClendar是Clendar的子类。
日历时间可以使用 GregoricanClendar的setGregoiranChange()方法来修改,设为Date(Long.MAX_VALUE)就是纯粹的儒略历,设为Date(Long.MIN_VALUE)就是纯粹的格里高利历。
想要比较两个Clendar的时间日期先后,可以使用after()或before()方法。
-
关于TimeZone:
使用默认时区,可以使用java.util.TimeZone的getDefault()来取得默认时区信息。
可以通过setTimeZone()方法设定TimeZone
-
-
JDK8新时间日期API
-
机器时间观点的API:
Date实例应该只代表机器观点的时间信息,真正可靠的信息只有内含的epoch毫秒数。如果取得Date实例,应该通过Date的getTime()取得epoch毫秒数,这样就不会混肴。
主要为java.time。设计了Instant类,用以代表自定义的java epoch 精度基本上是毫秒,但可以添加奈秒。
-
人类时间观点的API:
LocalDateTime包括日期与时间、LocatDate只有日期、LoucatTime只有时间。
当补上时区信息后,如果组合起来的时间实际上不存在,ZoneDateTime会自动更正。
在新的时间与日期API中,UTC偏移量与时区的概念是分开的。offsetDateTime单纯代替UTC偏移量,使用ISO 8601。
- 可用Year表示年、用YearMonth表示年月、只想表示月可以使用Month、想表示月日可以使用MonthDay。想取得代表月份的数字,不要使用oridinal()方法,因为其是enum再定义时的顺序,从零开始,想要去的代表月份的数要通过getValue()方法。
实际上以上方法都操作了Temporal接口。
-
-
对时间的运算:
ofPattern是java.time.format.DateFormatter的静态方法。
对于年、月、星期、日的日期的差,则使用Preriod类定义。
ofDays()、ofMonths()、ofWeeks()其实是Preriod的静态方法。
plus()方法接受java.time.temporal.TemporalAmount实例,而TemporalAmount的操作类也就是Preiod与Duration。
plus()另一方法接受java.time.temporal.temporalUnit实例,java.time.temporal.ChronoUnit是TemporalUnit实作类,使用enum实作。
TemporalAccessor定义了只读的时间对象读取操作、实际上Temporal是TemporalAccessor子接口,增加了对时间的处理操作。
年历系统设计:java.time.chrono操作了java.time.chrono.Chronlogy接口的类。
教材学习中的问题和解决过程
学习本章有关时间与日期的,没有之前的java语法那么繁杂,规定自然而然也会少一些。但是还是存在一些问题的。
其中对于理解机器时间的概念和人类时间的概念存在问题。同样对于Date实例真正代表的并不是日期,最接近的概念应该是时间轴上特定的某一瞬间。时间精=精度是毫秒,是UTC时间1970年1月1日0时0分0毫秒至某个特定瞬时的毫秒差。
其实理解有关时间与日期的API,同样也是把握住java是面向对象设计的而不是面向过程这一要点,理解起来知识点就会简单许多。
对于TemporalAmount和TemporalUnit要把握住继承了哪个类,操作了哪个接口,注意各自的操作特点掌握分清各个方法的用途。
代码调试中的问题和解决过程
本周是关于日期与时间,学习难度不大,主要仔细跟着书上的步骤来,代码的难度也比原来小了许多,在书上范例代码调试的问题和解决基本没有存在问题。
但是通过代码的调节发现不论是那一块的知识与运用方法都要掌握准确,不然很容易会出错误。
本周代码托管截图
本周代码托管截图如下
其他(感悟、思考等,可选)
学习java已经很久了,掌握的硬知识也有很多了。但是在这么久的学习java要把握住java是面向对象的,不然在理解一些类和一些方法的时候会存在问题。不论是哪些方面的知识总是记清楚之间的用法和具体区别。通过这门课程不光要学习很多的知识点,而且更要学会这种学习方式,一种遇到问题去解决问题的思维过程,这样才是有益的收获。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 2/4 | 18/38 | |
第三周 | 360/1000 | 3/7 | 22/60 | |
第四周 | 400/1300 | 2/8 | 30/90 | |
第五周 | 200/1400 | 1/10 | 24/95 | |
第六周 | 270/1500 | 2/11 | 32/100 | |
第七周 | 190/1700 | 3/12 | 26/110 | 学会使用idea单元测试 |