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

教材学习内容总结

第十三章 时间与日期

13.1 认识时间与日期

  • 就目前来说,即使标注为GMT(无论是文件说明,或者是API的日期时间字符串描述),实际上谈到时间指的是UTC时间。

  • 秒的单位定义是基于TAI,也就是铯原子辐射振动次数。

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

  • UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒。

  • Unix时间是1970年1月1日00:00:00为起点而经过的秒数,不考虑闰秒。

13.2 认识Date与Calendar

  • 如果想要取得系统时间,方法之一是使用System.currentTimeMillis()方法,返回的是long类型整数。如:

    import java.util.*;
    import static java.lang.System.*; public class DateDemo {
    public static void main(String[] args) {
    Date date1 = new Date(currentTimeMillis());
    Date date2 = new Date(); out.println(date1.getTime());
    out.println(date2.getTime());
    }
    }
  • Date有两个构造函数可以使用,一个可使用epoch毫秒数构建,另一个为无自变量构造函数,内部亦是使用System.currentTimeMillis()取得毫秒数,调用getTime()可取得内部保存的epoch毫秒数值。范例执行结果如下:

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

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

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

    import java.util.*;
    import java.text.*; public class HowOld {
    public static void main(String[] args) throws Exception {
    System.out.print("輸入出生年月日(yyyy-mm-dd):");
    DateFormat dateFormat = new SimpleDateFormat("yyyy-mm-dd");
    Date birthDate = dateFormat.parse(new Scanner(System.in).nextLine());
    Date currentDate = new Date();
    long life = currentDate.getTime() - birthDate.getTime();
    System.out.println("你今年的歲數為:" +
    (life / (365 * 24 * 60 * 60 * 1000L)));
    }
    }

执行结果如图:

  • Date现在建议作为时间轴上的瞬间代表,要格式化时间日期则通过DateFormat,如果想要取得某个时间日期信息,或者是对时间日期进行操作,可以使用Calendar实例。如:

    Calendar calendar = Calendar.getInstance();
  • Calendar是个抽象类,java.util.GregorianCalendar是其子类,操作了儒略历与格里高利历的混合历,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例。如:

    out.println(calendar.get(Calendar.YEAR));
    out.println(calendar.get(Calendar.MONTH));
    out.println(calendar.get(Calendar.DATE));
  • 若想取得默认时区信息,可以使用java.util.TimeZone的getDefault()方法。如:

    import static java.lang.System.out;
    import java.util.TimeZone; public class TimeZoneDemo {
    public static void main(String[] args) {
    TimeZone timeZone = TimeZone.getDefault();
    out.println(timeZone.getDisplayName());
    out.println("\t時區ID:" + timeZone.getID());
    out.println("\t日光節約時數:" + timeZone.getDSTSavings());
    out.println("\tUTC 偏移毫秒數:" + timeZone.getRawOffset());
    }
    }

执行结果如图:

13.3 JDK8新时间日期API

  • 可以使用Instance的静态方法now()取得代表Java epoch毫秒数。在取得Instance实例后,可以使用plusSeconds()、plusMills()、plusNanos()、minusSeconds()、minusMills()、minusNanos()来做时间轴上的运算,Instance实例本身不会变动,这些操作都会返回新的Instance实例,代表运算后的瞬时。

  • 如果取得了Date实例,而想要改用Instance,则可以调用Date市里的toInstance()方法来取得,如果有个Instance实例,可以使用Date的静态方法from()转为Date。

  • LocalDateTime、LocalDate、LocalTime等类名称开头为Local,表示它们都只是对时间的描述,并没有时区信息。

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

    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());
    }
    }

执行结果如图:

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

问题:

学习了13.3.3 对时间的运算后,发现Period与Duration很相似,不清楚二者的具体区别在哪。

解决过程:

通过学习教材与上网查资料,总结出以下差别:

Period是日期差,between()方法只接受LocalDate,不表示比“日”更小的单位,然而Duration是时间差,
between()可以接受Temporal操作对象,也就是说可以用LocalDate、LocalTime、LocalDateTime来计算
Duration,不表示比“天”更大的单位。

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

问题:

对书上p435页代码片段(如下)中的“Calender calender = (Calender) begin.clone()”不太理解。

public static long yearsBetween(Calendar begin, Calendar end) {
Calendar calendar = (Calendar) begin.clone(); long years = 0;
while (calendar.before(end)) {
calendar.add(Calendar.YEAR, 1);
years++;
}
return years - 1;
} public static long daysBetween(Calendar begin, Calendar end) {
Calendar calendar = (Calendar) begin.clone();
long days = 0;
while (calendar.before(end)) {
calendar.add(Calendar.DATE, 1);
days++;
}
return days - 1;
}

解决过程:

通过看书上对代码范例的分析,得到如下解释:

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

程序运行结果如图:

代码托管截图

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

本周学习了第十三章,我了解了一些时间、日期的历史问题,并且知道了应该如何使用Java程序来处理时间日期,我认为新时间日期处理API中最重要的,就是清楚地将机器对时间的概念与人类对时间的概念区隔开来,让机器与人类对时间概念的界线变得分明。这周的学习任务只有一章,因此我有更多的时间来仔细学习这章的内容,把不懂的知识点一一弄清楚明白,我认为这样的学习进度比较合适,不用为了按时完成任务而放弃细究一些不会的问题。

学习进度条

  代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 4500行 30篇 350小时 能将java运用自如 
第一周 150/150 2/2 15/15 学习了与java相关的基础知识 
第二周 200/350 1/3 20/35

学习了java的基本语法

 第三周  450/800  1/4 25/60 

学习了对象和封装的相关知识

 第四周 687/ 1487  1/5 30/90 

学习了继承与接口的相关知识

 第五周 803/2290    1/6    30/120 

学习了异常处理以及Collection与Map的相关知识

 第六周  910/3200 2/8  40/160 

学习了输入、输出和线程的相关知识

 第七周  350/3550 2/10  30/190 

学习了时间与日期的相关知识

参考资料

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

  1. 20145216史婧瑶《网络对抗》Web安全基础实践

    20145216史婧瑶<网络对抗>Web安全基础实践 实验问题回答 (1)SQL注入攻击原理,如何防御 攻击原理: SQL注入攻击指的是通过构建特殊的输入作为参数传入web应用程序,而这些 ...

  2. 20145216史婧瑶《网络对抗》Web基础

    20145216史婧瑶<网络对抗>Web基础 实验问题回答 (1)什么是表单 表单在网页中主要负责数据采集功能.一个表单有三个基本组成部分: 表单标签.表单域.表单按钮. (2)浏览器可以 ...

  3. 20145216史婧瑶 《网络对抗》 MSF基础应用

    20145216史婧瑶 <网络对抗> MSF基础应用 实验回答问题 用自己的话解释什么是exploit,payload,encode. exploit:渗透攻击模块,测试者利用它来攻击一个 ...

  4. 20145216史婧瑶《网络对抗》逆向及Bof进阶实践

    20145216史婧瑶<网络对抗>逆向及Bof进阶实践 基础知识 Shellcode实际是一段代码,但却作为数据发送给受攻击服务器,将代码存储到对方的堆栈中,并将堆栈的返回地址利用缓冲区溢 ...

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

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

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

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

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

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

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

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

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

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

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

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

随机推荐

  1. spring boot 加载jsp

    1.spring boot启动类继承SpringBootServletInitializer ,并且重写configure方法 package com.springapp.mvc;import jav ...

  2. Python--进阶处理7

    # ====================第七章:函数========================= # 为了能让一个函数接受任意数量的位置参数,可以使用一个* 参数# 为了接受任意数量的关键字 ...

  3. glibc-2.23_large_bin链接方式_浅析

    上面两个图应该合并为一个图,但是指针太多了,合并在一起看不清了,所以分成两张图 所有的块都通过fd和bk两个指针链接,但是为了加快查询速度,不同大小的chunk通过fd_nextsize和bk_nex ...

  4. [报错]编译报错:clang: error: linker command failed with exit code 1及duplicate symbol xxxx in错误解决方法之一

    今天添加了一个新类(包括m,h,xib文件),还没有调用,—编译遇到如下错误,根据错误提示, duplicate symbol param1 in: /Users/xxxx/Library/Devel ...

  5. Jumpserver使用

    堡垒机介绍 在一个特定网络环境下,为了保障网络和数据不受外界入侵和破坏,而运用各种技术手段实时收集和监控网络环境中每一个组成部分的系统状态.安全事件.网络活动,以便集中报警.及时处理及审计定责. 我们 ...

  6. LRU算法的Python实现

    http://flychao88.iteye.com/blog/1977653文章中介绍了常见的几种缓存淘汰策略 LRU:least recently used,最近最少使用算法.其实就是按使用时间倒 ...

  7. git 的 pull、fetch、merge

    1.pull = fetch + merge In the simplest terms, git pull does a git fetch followed by a git merge. You ...

  8. python web框架 django 练习1 django 1.11版本

    django练习 在我自己项目里创建一个xiaoliu的文件夹 里面创建s1.py 文件 s1.py文件 里面写各种函数 from django.shortcuts import HttpRespon ...

  9. air游戏接入小米支付sdk

    小米支付sdk要求在Application.onCreate中进行初始化 为了这个初始化搞了半天,最终搞定了.今天将更改的步骤记录下了. 1. 创建ANE.ANE的创建就不罗嗦了,这里须要注意一点,这 ...

  10. 本书版权输出到台湾地区,《深入理解Android内核设计思想》诚挚感谢大家一直以来的支持!