您好,登錄后才能下訂單哦!
1. 時區概念
國際經度會議(又稱國際子午線會議)上,規定將全球劃分為24個時區(東、西各12個時區)。規定英國的格林尼治天文臺舊址為中時區(零時區)、東1-12區,西1-12區。每個時區橫跨經度15度,時間正好是1小時。最后的東、西第12區各跨經度7.5度,以東、西經180度為界。每個時區的中央經線上的時間就是這個時區內統一采用的時間,稱為區時,相鄰兩個時區的時間相差1小時。英國(格林尼治天文臺舊址)為本初子午線,即零度經線。
時區的表格劃分
為什么全世界不使用統一的時間
于各個地區所在地球位置不同,所處地球的經度不同,故其日出日落的時間也不相同。在地球上劃定不同的時區,是為了使時間和自然現象(白天黑夜)有固定的對應。如果全世界用統一的時間,那么中國的8:00是早上,而美國的8:00卻是晚上了。這樣容易擾亂人自身生理的節律和對日常生活的安排也及其不方便。人是不能改變白天黑夜的,只好改變衡量白天黑夜的辦法了。
2. 幾種常見的時間
1、GMT
GMT(格林威治標準時間):也就是0時區的時間,理論上來說,格林尼治標準時間的正午是指當太陽橫穿格林尼治子午線時(也就是在格林尼治上空最高點時)的時間。由于地球在它的橢圓軌道里的運動速度不均勻,這個時刻可能和實際的太陽時相差16分鐘。地球每天的自轉是有些不規則的,而且正在緩慢減速。所以,格林尼治時間已經不再被作為標準時間使用。現在的標準時間——協調世界時(UTC)——由原子鐘提供。
2、UTC
UTC(世界協調時間),協調世界時是以原子時秒長為基礎,國際原子時的準確度為每日數納秒,而世界時的準確度為每日數毫秒,現在我們使用的互聯網就采用該計時標準。UTC是GMT微調過的時間,我們可以認為兩者是一致的。
3、CET
歐洲中部時間(CET)比世界標準時間(UTC)早一個小時,部分歐洲國家和北非國家使用,這個標準是地理加政治的產物;
4、CST
北京時間
CET=UTC(GMT) + 1小時
CST=UTC(GMT) + 8小時
3. 時間戳
時間戳是指格林威治時間1970年01月01日00時00分00秒(北京時間1970年01月01日08時00分00秒)起至現在的總秒數(Java中獲得的秒數是以毫秒為單位的)。
例如現在北京時間2015-12-31 17:00:00的時間戳是1451552400,就是指從北京時間1970-01-01 08:00:00到2015-12-31 17:00:00已經過去了1451552400秒。
使用時間戳有如下好處:
4. Java中的時間API
在Java8以前操作時間的常見API有:
Date主要負責存儲一個絕對時間,并對兩邊提供操作接口。Calendar負責對Date中特定信息,比如這個時間是該年的第幾個星期,此外,還可以通過set,add,roll接口來進行日期時間的增減。SimpleDateFormat主要作為一些格式化的輸入輸出。
4.1 Date的簡單列子
Date類比較簡單,支持兩種構造函數。不建議用這個類進行復雜的操作。如果使用的是Java8,建議使用LocalDate。Date類也提供了和Java 8 API相互轉換的接口。
Date date1 = new Date(); Thread.sleep(1000); long nowTime = System.currentTimeMillis(); Date date2 = new Date(nowTime); //Date類和Java 8 API相互轉換的接口 Instant instant = date2.toInstant(); Date date3 = Date.from(instant); System.out.println("nowTime:"+nowTime); System.out.println(date1); System.out.println(date2); System.out.println(date3); System.out.println(date2.getTime());
4.2 SimpleDateFormat使用列子
SimpleDateFormat接收一個String pattern和Local參數來構造對象。其中pattern是預定義的:
G 年代標志符
y 年
M 月
d 日
h 時 在上午或下午 (1~12)
H 時 在一天中 (0~23)
m 分
s 秒
S 毫秒
E 星期
D 一年中的第幾天
F 一月中第幾個星期幾
w 一年中第幾個星期
W 一月中第幾個星期
a 上午 / 下午 標記符
k 時 在一天中 (1~24)
K 時 在上午或下午 (0~11)
z 時區
//默認的方言 SimpleDateFormat sf = new SimpleDateFormat("G yyyy-MM-dd a z"); SimpleDateFormat sf1 = new SimpleDateFormat("G yyyy-MM-dd a z", Locale.US); SimpleDateFormat sf2 = new SimpleDateFormat("G yyyy-MM-dd a z", Locale.KOREA); String format1 = sf.format(date1); String format2 = sf1.format(date1); String format3 = sf2.format(date1); System.out.println("format1:"+format1); System.out.println("format2:"+format2); System.out.println("format3:"+format3); //解析Date Date date = sf.parse(format1);
4.3 Calendar的使用
Calendar還有許多其他API,比如獲得當前月天數,當前年天數等等,需要時可以查詢使用。
Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR); // 獲取月,這里需要需要月份的范圍為0~11,因此獲取月份的時候需要+1才是當前月份值 int month = calendar.get(Calendar.MONTH) + 1; // 獲取日 int day = calendar.get(Calendar.DAY_OF_MONTH); // 獲取時 int hour = calendar.get(Calendar.HOUR); // 獲取分 int minute = calendar.get(Calendar.MINUTE); // 獲取秒 int second = calendar.get(Calendar.SECOND); System.out.println("現在是" + year + "年" + month + "月" + day + "日" + hour + "時" + minute + "分" + second + "秒"); //獲取一個月后的今天 calendar.add(Calendar.MONTH,1);
4.4 存在的問題
5. Java8中新添加的時間API
5.1 LocalDate
//Current Date LocalDate today = LocalDate.now(); System.out.println("Current Date="+today); //Creating LocalDate by providing input arguments LocalDate firstDay_2014 = LocalDate.of(2014, Month.JANUARY, 1); System.out.println("Specific Date="+firstDay_2014); //Try creating date by providing invalid inputs //LocalDate feb29_2014 = LocalDate.of(2014, Month.FEBRUARY, 29); //Exception in thread "main" java.time.DateTimeException: //Invalid date 'February 29' as '2014' is not a leap year //Current date in "Asia/Kolkata", you can get it from ZoneId javadoc LocalDate todayKolkata = LocalDate.now(ZoneId.of("Asia/Kolkata")); System.out.println("Current Date in IST="+todayKolkata); //Getting date from the base date i.e 01/01/1970 LocalDate dateFromBase = LocalDate.ofEpochDay(365); System.out.println("365th day from base date= "+dateFromBase); //2014年的第100天 LocalDate hundredDay2014 = LocalDate.ofYearDay(2014, 100); System.out.println("100th day of 2014="+hundredDay2014);
5.2 LocalTime使用
//Current Time LocalTime time = LocalTime.now(); System.out.println("Current Time="+time); //Creating LocalTime by providing input arguments LocalTime specificTime = LocalTime.of(12,20,25,40); System.out.println("Specific Time of Day="+specificTime); //Try creating time by providing invalid inputs //LocalTime invalidTime = LocalTime.of(25,20); //Exception in thread "main" java.time.DateTimeException: //Invalid value for HourOfDay (valid values 0 - 23): 25 //Current date in "Asia/Kolkata", you can get it from ZoneId javadoc LocalTime timeKolkata = LocalTime.now(ZoneId.of("Asia/Kolkata")); System.out.println("Current Time in IST="+timeKolkata); //java.time.zone.ZoneRulesException: Unknown time-zone ID: IST //LocalTime todayIST = LocalTime.now(ZoneId.of("IST")); //Getting date from the base date i.e 01/01/1970 LocalTime specificSecondTime = LocalTime.ofSecondOfDay(10000); System.out.println("10000th second time= "+specificSecondTime);
5.3 LocalDateTime
//Current Date LocalDateTime today = LocalDateTime.now(); System.out.println("Current DateTime="+today); //Current Date using LocalDate and LocalTime today = LocalDateTime.of(LocalDate.now(), LocalTime.now()); System.out.println("Current DateTime="+today); //Creating LocalDateTime by providing input arguments LocalDateTime specificDate = LocalDateTime.of(2014, Month.JANUARY, 1, 10, 10, 30); System.out.println("Specific Date="+specificDate); //Try creating date by providing invalid inputs //LocalDateTime feb29_2014 = LocalDateTime.of(2014, Month.FEBRUARY, 28, 25,1,1); //Exception in thread "main" java.time.DateTimeException: //Invalid value for HourOfDay (valid values 0 - 23): 25 //Current date in "Asia/Kolkata", you can get it from ZoneId javadoc LocalDateTime todayKolkata = LocalDateTime.now(ZoneId.of("Asia/Kolkata")); System.out.println("Current Date in IST="+todayKolkata); //java.time.zone.ZoneRulesException: Unknown time-zone ID: IST //LocalDateTime todayIST = LocalDateTime.now(ZoneId.of("IST")); //Getting date from the base date i.e 01/01/1970 LocalDateTime dateFromBase = LocalDateTime.ofEpochSecond(10000, 0, ZoneOffset.UTC); System.out.println("10000th second time from 01/01/1970= "+dateFromBase);
5.4 Instant
Instant可以理解為時間戳。
//Current timestamp Instant timestamp = Instant.now(); System.out.println("Current Timestamp = "+timestamp); //Instant from timestamp Instant specificTime = Instant.ofEpochMilli(timestamp.toEpochMilli()); System.out.println("Specific Time = "+specificTime); //Duration example Duration thirtyDay = Duration.ofDays(30); System.out.println(thirtyDay);
5.5 格式化
需要格式化日期時,我們直接調用相關類的format方法即可,如下:
//DateTimeFormatter支持的模式和SimpleDateFormat支持的一致 today.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); 5.6 對舊時間API的支持 Date date= new Date();Instant instant = date.toInstant();LocalDateTime pst = LocalDateTime.ofInstant(instant, ZoneId.of(ZoneId.SHORT_IDS.get("PST")));Calendar calendar = Calendar.getInstance();Instant instant1 = calendar.toInstant();LocalDateTime pst1 = LocalDateTime.ofInstant(instant, ZoneId.of(ZoneId.SHORT_IDS.get("PST")));
6. 在東八區的機器上獲得美國時間
美國屬于西5區,比北京時間晚13個小時。
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對億速云的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。