20145312 《Java程序设计》第七周学习总结
20145312 《Java程序设计》第七周学习总结
学习笔记
Chapter 13时间与日期
13.1 认识时间与日期
13.1.1 时间的度量
- 格林威治标准时间
- 世界时:观测远方星体跨过子午线而得。
- 国际原子时:铯原子辐射振动。
- 世界协调时间:地球自转越来越慢,提出具有折衷修正版本的世界协调时间。
- Unix 时间:定义为UTC时间1970年(Unix 元年)1月1日00:00:00为起点而经过的秒数。
- epoch:某个特定的时代开始,时间轴上的某一瞬间。
13.1.2 年历简介
- 儒略历:现今公历的前身,用来取代罗马历。
- 格里高利历:由宗教Pope Gregory XIII于1528年颁行。
- ISO 8601 标准:时间日期表示方法的标准。
13.1.3 认识时区
- 从地理上来说,由于地球是圆的,基本上一边白天另一边就是夜晚,因而设置了UTC偏移。
- 有些高纬度国家,夏季、冬季日照时间差异很大,为了节省能源会尽量利用夏季日照,因而实施日光节约时间,也称为夏季时间。
13.2 认识Date与Calendar
13.2.1 时间轴上瞬间的Date
- 使用System.currentTimeMillis()是取得系统时间的方法之一。
代码如下:
package DateCalendar;
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());
}
}
结果截图:

13.2.2格式化时间日期的DateFormat
- 有关字符串时间格式的处理用java.text.DateFormat,DateFormat是个抽象类,其操作类是java.text.Simple.DateFormat。
代码如下:
package DateCalendar;
import java.util.*;
import static java.lang.System.out;
import static java.text.DateFormat.*;
public class DateFormatDemo {
public static void main(String[] args){
Date date=new Date();
dateInstanceDemo(date);
timeInstanceDemo(date);
dateTimeInstanceDemo(date);
}
static void dateInstanceDemo(Date date){
out.println("getDateInstance() demo");
out.printf("\tSHORT:%s%n",getDateInstance(LONG).format(date));
out.printf("\tSHORT:%s%n",getDateInstance(SHORT).format(date));
}
static void timeInstanceDemo(Date date){
out.println("getTimeInstance() demo");
out.printf("\tLONG:%s%n",getTimeInstance(LONG).format(date));
out.printf("\tMEDIUM:%s%n",getTimeInstance(MEDIUM).format(date));
out.printf("\tSHORT:%s%n",getTimeInstance(SHORT).format(date));
}
static void dateTimeInstanceDemo(Date date) {
out.println("getDateTimeInstance() demo");
out.printf("\tLONG:%s%n", getDateTimeInstance(LONG, LONG).format(date));
out.printf("\tMEDIUM:%s%n", getDateTimeInstance(SHORT, MEDIUM).format(date));
out.printf("\tSHORT:%s%n", getDateTimeInstance(SHORT, SHORT).format(date));
}
}
结果截图:

直接构建SimpleDateFormat的好处是,可使用模式字符串自定义格式。
代码如下:
package DateCalendar;
import java.text.*;
import java.util.*;
public class SimpleDateFormatDemo {
public static void main(String[] args){
DateFormat dateFormat=new SimpleDateFormat(
args.length==0?"EE-MM-dd-yyyy":args[0]
);
System.out.println(dateFormat.format(new Date()));
}
}
结果截图:

SimpleDateFormat还有parse()方法,可以按构建SimpleDateFormat时指定的格式,将指定的字符串剖析为Date实例。
代码如下:
package DateCalendar;
import java.text.*;
import java.util.*;
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.printf("你今年的岁数为:%n" +(life/(365*24*60*60*1000L)));
}
}
结果截图:

13.2.3 处理时间日期的Calendar
- 如果想要取得某个时间日期信息,或者对时间日期进行操作,可以使用Calendar实例。
- 取得Calendar实例,可以使用getTime()取得Date实例。
- 取得Calendar实例后,可以使用add()方法来改变Calendar时间。
代码如下:
package DateCalendar;
import static java.lang.System.out;
import java.util.Calendar;
public class CalendarUtil {
public static void main(String[] args){
Calendar birth=Calendar.getInstance();
birth.set(1996,Calendar.JANUARY,27);
Calendar now=Calendar.getInstance();
out.printf("岁数:%d%n",yearsBetween(birth,now));
out.printf("天数:%d%n",daysBetween(birth,now));
}
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;
}
}
结果截图:

13.2.4 设定TimeZone
- 可以使用java.util.TimeZone的getDefault()来取得默认时区信息。
代码如下:
package DateCalendar;
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());
}
}
结果截图:

可用的ID可以使用TimeZone.getAvailableIDs()来取得,它会返回String[]。
代码如下:
package DateCalendar;
import static java.lang.System.out;
import java.util.*;
public class TimeZoneDemo2 {
public static void main(String[] args){
TimeZone shanghaiTz=TimeZone.getTimeZone("Asia/Shanghai");
Calendar calendar=Calendar.getInstance(shanghaiTz);
showTime(calendar);
TimeZone copenhagenTz=TimeZone.getTimeZone("Europe/Copenhagen");
calendar.setTimeZone(copenhagenTz);
showTime(calendar);
TimeZone washingtonTz=TimeZone.getTimeZone("American/Washington");
calendar.setTimeZone(washingtonTz);
showTime(calendar);
}
static void showTime(Calendar calendar){
out.print(calendar.getTimeZone().getDisplayName());;
out.printf("%d:%d%n",
calendar.get(Calendar.HOUR),
calendar.get(Calendar.MINUTE));
}
}
结果截图:

13.3 JDK8新时间日期API
13.3.1 机器时间观点的API
- Date名称是机器的时间观念,JDK8新时间日期处理API时,主要套件命名为java.time。
- 对于机器相关的时间观念,设计了Instant类。
- 可以使用now()方法取得Instant实例。
4,取得Date实例后,想改用Instant,可以调用from()方法。
13.3.2 人类时间观念的API
- LocalDateTime、LocalDate和LocalTime
1)对于片段的日期时间,JDK8新时间与新日期API有LocalDateTime(包括日期与时间)、LocalDate(只有日期)、LocalTime(只有时间)等类来定义。 - ZoneDateTime和OffsetDateTime
代码如下:
package DateCalendar;
import static java.lang.System.out;
import java.time.*;
public class ZonedDateTimeDemo {
public static void main(String[] args){
LocalTime localTime=LocalTime.of(0,0,0);
LocalDate localDate=LocalDate.of(1996,1,27);
ZonedDateTime zonedDateTime=ZonedDateTime.of(
localDate,localTime,ZoneId.of("Asia/Shanghai")
);
out.println(zonedDateTime);
out.println(zonedDateTime.toEpochSecond());
out.println(zonedDateTime.toInstant().toEpochMilli());
}
}
结果截图:

Year、YearMonth、Month和MonthDay
代码如下:
package DateCalendar;
import static java.lang.System.out;
import java.time.Month;
public class MonthDemo {
public static void main(String[] args){
for(Month month:Month.values()){
out.printf("original:%d\tvalue:%d\t%s%n",
month.ordinal(),month.getValue(),month);
}
}
}
结果截图:

13.3.3 对时间的运算
1.TemporalAmount
1)JDK8新日期时间处理实现了流畅API的概念,其中,ofPattern()其实是java.time.format.DateTimeFormatter的静态方法,可以查看API文件了解格式化的方式。
2)TemporalAmount的操作类就是Period与Duration。
代码如下:
package DateCalendar;
import java.time.*;
import java.util.Scanner;
import static java.lang.System.out;
public class HowOld2 {
public static void main(String[] args){
out.print("输入出生年月日(yyy-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());
}
}
结果截图:

代码调试中的问题和解决过程
问题:
教材p436页TimeZoneDemo.java代码运行结果:

所显示的时区ID是Asia/Shanghai,为什么不是Asia/Beijing呢?
解决过程:
通过查阅相关资料,发现Java所支持的所有时区ID里面并没有Asia/Beijing,所以对于中国大陆时区的而言,显示的应该都是Asia/Shanghai
其他(感悟、思考等,可选)
本周学习内容相对简单,学习任务适中,使我能够有结余的时间来复习前面没弄懂的地方。本章###时间与日期从最基础的时间度量开始讲起,主要教给我们输出时间,设置时间,查找时间和运算时间,讲解详细,形成了较为完整的知识架构易于我们的学习。
代码托管截图:

学习进度条

参考资料
20145312 《Java程序设计》第七周学习总结的更多相关文章
- 201521123027 <java程序设计>第七周学习总结
1.本周学习总结 2.书面作业 Q1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 答: 源代码: //contains()方法 public boolean c ...
- 20145312 《Java程序设计》第九周学习总结
20145312 <Java程序设计>第九周学习总结 学习笔记 Chapter 16整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 SUN公司为了简化.统一对数据库的操作, ...
- 201871010106-丁宣元 《面向对象程序设计(java)》第七周学习总结
201871010106-丁宣元 <面向对象程序设计(java)>第七周学习总结 正文开头: 项目 内容 这个作业属于哪个课程 https://home.cnblogs.com/u/nwn ...
- 20145213《Java程序设计》第九周学习总结
20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...
- 21045308刘昊阳 《Java程序设计》第九周学习总结
21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...
- 20145236 《Java程序设计》第九周学习总结
20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...
- 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结
20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...
- 20155303 2016-2017-2 《Java程序设计》第二周学习总结
20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...
- 20145237 《Java程序设计》第九周学习总结
20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...
- 20175209 《Java程序设计》第九周学习总结
20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...
随机推荐
- ios 如何对UITableView中的内容进行排序
- (UITableViewCellEditingStyle)tableView:(UITableView *)tableView editingStyleForRowAtIndexPath:(NSI ...
- <link>标签的rel属性全解析
<link>标签定义了当前文档与 Web 集合中其他文档的关系.link 元素是一个空元素,它仅包含属性.此元素只能存在于 head 部分,不过它可出现任何次数.在 HTML 中,&l ...
- 解决<pre>标签里的文本换行(兼容IE, FF和Opera等)
我们都知道<pre> 标签可定义预格式化的文本,一个常见应用就是用来表示计算机的源代码.被包围在 pre 元素中的文本通常会保留空格和换行符,但不幸的是,当你在<pre>标 ...
- 使用 paramsPrepareParamsStack 拦截器栈后的运行流程
2. 使用 paramsPrepareParamsStack 拦截器栈后的运行流程 1). paramsPrepareParamsStack 和 defaultStack 一样都是拦截器栈. 而 st ...
- Ubuntu下编译C语言程序(同时给编译生成的文件命名)
1.创建c文件 test.c touch test.c 2.编写test.c vim test.c #include "stdio.h" int main(){ printf(&q ...
- VC 常用资源
vckbase:www.vckbase.com emule:http://sourceforge.net/projects/emule/files/eMule/ firefox developer:h ...
- 【转】通过ionice和nice降低shell脚本运行的优先级
对于一些运行时会造成系统满载的脚本, 例如数据库备份, 会影响当时其他服务的响应速度, 可以通过ionice和nice对其IO优先级和CPU优先级进行调整例如降低"/usr/local/bi ...
- 【opencv】相机标定程序内存溢出
运行相机内参标定程序出现内存溢出的错误 opencv的alloc.cpp报cv::OutOfMemoryError 因为同时开了多个线程,每个线程标定一台相机,每个线程都会imread读入所有标定图片 ...
- 如何删除Docker中的镜像相关
1.正常情况下 1.停止所有的container,这样才能够删除其中的images: docker stop $(docker ps -a -q) 如果想要删除所有container的话再加一个指令: ...
- 网络编程(基于udp协议的套接字/socketserver模块/进程简介)
一.基于UDP协议的套接字 TCP是建立可靠连接,并且通信双方都可以以流的形式发送数据.相对TCP,UDP则是面向无连接的协议. 使用UDP协议时,不需要建立连接,只需要知道对方的IP地址和端口号,就 ...