首先回顾一下第七周主要学习内容:
六个时间基准:
1.格林威治标准时间
2.世界时
3.国际原子时
4.世界协调时间
5.Unix时间
6.epoch
年历:
7.Julian Calendar四年一闰
8.Gergorian Calendar 格里高利历
9.ISO 8601标准
Date
使用Date实例的各getTime可以获得epoch毫秒数,**Data实例只用来当做时间轴上的某一瞬间;利用DataFormat可以对字符串格式进行处理,分别有GetDateInstance、GetTimeInstance、GetDateTimeInstance
DateFormat
java.text.DateFormat复责字符串时间格式处理,DataFormat是个抽象类,其操作类为java.text.SimpleDataFormat,getDataInstance()、getTimeInstance()、getDataTimeInstance()等静态用法;可以直接构建SimpleDataFormat实例,或是使用DataFormat的;直接构建SimpleDateFormat,可以自定义字符串格式 parse方法可以将指定的字符串剖析Date实例
Calendar
Calendar实例取得某个时间日期信息,或者对时间日期进行操作;Calendar是个抽象类,java.util.GregorianCalendar是其子类,通过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例;比较两个Calendar的时间日期先后,使用after()或before()方法;取得Calendar实例后,可以取得年月日信息,可以进行设定,可以进行运算来改变。
TimeZone
TimeZone的getdefault可以取得默认时区的信息;Calender在调用getInstance()时可以指定Timezone,如果已经取得Calender实例,可以通过setTimeZone()的方法设定时区。
•TemporalAmount 时间计量,新时间和日期用API用类Duration来定义,对于年、月、日、星期的日期差,可使用Period类定义,静态方法ofDays()、ofMonths()、ofWeeks(),返回Period实例。
•TemporalUnit plus()方法的另一重载版本,接受java.time.temporal.TemporalUnit实例,java.time.temporal.ChronoUnit是其实做类,使用enum实做。
•Temporal plus()定义在Temporal接口上;Instant、LocalDate、LocalDateTime、LocatTime、OffsetTime、ZonedDateTime等类,都操作了 Temporal 接口。
•TemporalAccessor Temporal是 TemporalAccessor的子接口。
问题: 如何计算一个程序的运行时间?
解决
(1)以毫秒为单位计算:
long startTime=System.currentTimeMillis(); //获取开始时间
doSomeThing(); //测试的代码段
long endTime=System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ms");
(2)以纳秒为单位计算:
long startTime=System.nanoTime(); //获取开始时间
doSomeThing(); //测试的代码段
long endTime=System.nanoTime(); //获取结束时间
System.out.println("程序运行时间: "+(end-start)+"ns");
书上435页的代码为什么要调用clone()?
生日输入的时候一定要遵循标准的格式,10以内的数字输入时一定要加0,例如"09"。
有的同学对显示时间日期的几种表示疑惑。现在总结一下几种不同的表达方式:
import java.util.;
import java.text.;
public class Testdate2 {
public static void main(String[] args) {
Date now = new Date();
Calendar cal = Calendar.getInstance();
DateFormat d1 = DateFormat.getDateInstance(); // 默认语言(汉语)下的默认风格(MEDIUM风格,比如:2013-6-10 13:14:41)
String str1 = d1.format(now);
DateFormat d2 = DateFormat.getDateTimeInstance();
String str2 = d2.format(now);
DateFormat d3 = DateFormat.getTimeInstance();
String str3 = d3.format(now);
DateFormat d4 = DateFormat.getInstance(); // 使用SHORT风格显示日期和时间
String str4 = d4.format(now);
DateFormat d5 = DateFormat.getDateTimeInstance(DateFormat.FULL, DateFormat.FULL); // 显示日期,周,时间(精确到秒)
String str5 = d5.format(now);
DateFormat d6 = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG); // 显示日期。时间(精确到秒)
String str6 = d6.format(now);
DateFormat d7 = DateFormat.getDateTimeInstance(DateFormat.SHORT, DateFormat.SHORT); // 显示日期,时间(精确到分)
String str7 = d7.format(now);
DateFormat d8 = DateFormat.getDateTimeInstance(DateFormat.MEDIUM, DateFormat.MEDIUM); // 显示日期,时间(精确到分)
String str8 = d8.format(now);// 与SHORT风格相比,这种方式最好用
System.out.println("用Date方式显示时间: " + now);// 此方法显示的结果和Calendar.getInstance().getTime()一样
System.out.println("用DateFormat.getDateInstance()格式化时间后为:" + str1);
System.out.println("用DateFormat.getDateTimeInstance()格式化时间后为:" + str2);
System.out.println("用DateFormat.getTimeInstance()格式化时间后为:" + str3);
System.out.println("用DateFormat.getInstance()格式化时间后为:" + str4);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL)格式化时间后为:" + str5);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG)格式化时间后为:" + str6);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT)格式化时间后为:" + str7);
System.out.println("用DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM)格式化时间后为:" + str8);
}
}
书上HowOld.java运行结果如下:
但是事实上一年的毫秒数并不是如上面例子中那么简单计算的,算出来的岁数也是错误的。修改后的代码如下:
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());
}
上面实例可以告诉我们Date实例只能用来当作时间轴上的某一个瞬间,需要进行转换,并且一年的时间并不是3652460601000,这里面还是有许多的不一样。机器时间和人类时间还是有不同,设计程序时要正确地使用,在人类时间观点上还要注意各种历法的不同以及时区的问题,要不然还是会有些不准确(时间本来就挺复杂的)。
为了准确显示经过的毫米数和系统显示时间:
• public class DateTest {
• public static void main(String args[]) {
• DateTest nowDate = new DateTest();
• nowDate.getSystemCurrentTime();
• nowDate.getCurrentDate();
• }
•
• public void getSystemCurrentTime() {
• System.out.println("----获取系统当前时间----");
• System.out.println("系统当前时间 = " + System.currentTimeMillis());
• }
•
• public void getCurrentDate() {
• System.out.println("----获取系统当前日期----");
• //创建并初始化一个日期(初始值为当前日期)
• Date date = new Date();
• System.out.println("现在的日期是 = " + date.toString());
• System.out.println("自1970年1月1日0时0分0秒开始至今所经历的毫秒数 = " + date.getTime());
• }
}