20145124 陈威名 关于同窗们第七周博客后的问题汇总和小结

首先回顾一下第七周主要学习内容:
六个时间基准:
1.格林威治标准时间
2.世界时
3.国际原子时
4.世界协调时间
5.Unix时间
6.epochjava

年历:
7.Julian Calendar四年一闰
8.Gergorian Calendar 格里高利历
9.ISO 8601标准学习

Date测试

使用Date实例的各getTime能够得到epoch毫秒数,**Data实例只用来当作时间轴上的某一瞬间;利用DataFormat能够对字符串格式进行处理,分别有GetDateInstance、GetTimeInstance、GetDateTimeInstance设计

DateFormat3d

java.text.DateFormat复责字符串时间格式处理,DataFormat是个抽象类,其操做类为java.text.SimpleDataFormat,getDataInstance()、getTimeInstance()、getDataTimeInstance()等静态用法;能够直接构建SimpleDataFormat实例,或是使用DataFormat的;直接构建SimpleDateFormat,能够自定义字符串格式 parse方法能够将指定的字符串剖析Date实例code

Calendarorm

Calendar实例取得某个时间日期信息,或者对时间日期进行操做;Calendar是个抽象类,java.util.GregorianCalendar是其子类,经过Calendar的getInstance()取得的Calendar实例,默认就是取得GregorianCalendar实例;比较两个Calendar的时间日期前后,使用after()或before()方法;取得Calendar实例后,能够取得年月日信息,能够进行设定,能够进行运算来改变。blog

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

相关文章
相关标签/搜索