20145110 《Java程序设计》第七周学习总结
教材学习内容总结
13 时间与日期
时间的度量
-
1.格林威治标准时间(GMT):常被不严谨地当成是UTC时间,现已不作为标准时间使用。
-
2.世界时(UT):在1972年引入UTC之前,GMT与UT是相同的
-
3.国际原子时(TAI):秒的单位定义是基于TAI,也就是铯原子辐射振动次数。
-
4.世界协调时间(UTC):UTC考虑了地球自转越来越慢而有闰秒修正,确保UTC与UT相差不会超过0.9秒。
-
5.Unix时间:不考虑闰秒修正,用以表达时间轴上某一瞬间
-
6.epoch:某个特定时代的开始,用以表达时间轴上某一瞬间
认识Date与Calendar
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());
}
}
程序运行结果显示的数字也就是1970年1月1日至今所经过的毫秒数。
格式化时间日期的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(" SHORT: %s%n", getDateInstance(LONG).format(date));
out.printf(" SHORT: %s%n", getDateInstance(SHORT).format(date));
}
static void timeInstanceDemo(Date date) {
out.println("getTimeInstance() demo");
out.printf(" LONG: %s%n", getTimeInstance(LONG).format(date));
out.printf(" MEDIUM: %s%n", getTimeInstance(MEDIUM).format(date));
out.printf(" SHORT: %s%n",getTimeInstance(SHORT).format(date));
}
static void dateTimeInstanceDemo(Date date) {
out.println("getDateTimeInstance() demo");
out.printf(" LONG: %s%n",
getDateTimeInstance(LONG, LONG).format(date));
out.printf(" MEDIUM: %s%n",
getDateTimeInstance(SHORT, MEDIUM).format(date));
out.printf(" SHORT: %s%n",
getDateTimeInstance(SHORT, SHORT).format(date));
}
}
SimpleDateFormat有一个parse()方法,可以按构建SimpleDateFormat时指定的格式,将指定的字符串剖析为Date实例,
处理时间日期的Calendar
- Date现在建议作为时间轴上的瞬间代表,要格式化时间日期则通过DateFormat,如果想要取得某个时间日期信息,或者是对时间日期进行操作,可以使用Calendar实例。
- 取得Calendar实例后,可以使用getTime()取得Data实例,如果想要取得年月日等日期数字时段,可以使用get()方法并指定Calendar上的数字段枚举常数。
out.println(calendar.get(Calendar.YEAR));
out.println(calendar.get(Calendar.MONTH));
out.println(calendar.get(Calendar.DATE));
- 如果你要设定时间日期等字段,不要对Date设定,应该使用Calendar,同样地,月份的部分请使用枚举常数设定。
Calendar calendar = Calendar.getInstace();
calendar.set(2016,Calendar.APRIL,16); // 2016/04/16
out.println(calendar.get(Calendar.YEAR)); // 2016
out.println(calendar.get(Calendar.MOUNTH)); //Calendar.APRIL取值3
out.println(calendar.get(Calendar.DATE)); //16
JDK新时间日期API
如果我们的时间需要带有时区,可以基于LocalDateTime,LocalDate,LocalTime来弥补缺少的信息:
package DateCalendar;
import static java.lang.System.out;
import java.time.*;
public class ZonedDataTimeDemo {
public static void main(String[] args) {
LocalTime localTime = LocalTime.of(0, 0, 0);
LocalDate localDate = LocalDate.of(1975, 4, 1);
ZonedDateTime zonedDateTime = ZonedDateTime.of(
localDate, localTime, ZoneId.of("Asia/Taipei"));
out.println(zonedDateTime);
out.println(zonedDateTime.toEpochSecond());
out.println(zonedDateTime.toInstant().toEpochMilli());
}
}
year,month,yearmonth与monthday:
如果想要取得代表月份的数字,不要使用oridinal()方法,因为oridinal()是enum在定义时的顺序,从0开始,想要取得代表月份的数要通过getValue()方法(调整了格式,使其对齐)。
package DateCalendar;
import java.time.*;
import java.util.Scanner;
import static java.lang.System.out;
public class HowOld {
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 | 1/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 500/1000 | 1/4 | 22/60 | |
第四周 | 300/1300 | 1/5 | 30/90 | |
第五周 | 300/1600 | 1/6 | 30/160 | |
第六周 | 700/2300 | 2/7 | 30/190 | |
第七周 | 400/2700 | 2/9 | 30/220 |