首先回顧一下第七週主要學習內容:
六個時間基準:
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());
• }
}