[學習筆記] 日期和時間
日期(Date)和時間(Time)是計算機可以處理的重要資料;
日期代表日曆中的某一天,由年/月/日組成,被看作是離散的資料;
時間代表某個時間點,由時/分/秒組成;
本地時間
我們通常說的時間指的是本地時間,即本時區時間。同一時刻,不同時區的本地時間不同。
時區
由於存在時區的概念,帶有日期的時間依然無法準確指明某個時刻,還需要給日期和時間加上時區資訊才能準確表示當前時刻;
目前,全球一共分為24時區,以倫敦所在時區為標準時區,其他時區以東/西偏移的小時數區分;
時區的表示方式
1 使用GMT/UTC+時區偏移量表示,例如GMT+8:00或UTC+8:00表示東八區
相比於GMT,UTC使用更精確的原子鐘計時,但基本上可以認為GMT和UTC相同;
2 縮寫
CST可以是China Standard Time的縮寫,表示中國標準時間;
CST也可以是Central Standard Time(USA)的縮寫,表示美國中部時間;
CST還可以是Central Standard Time(Australia)的縮寫,表示澳大利亞中部時間;
由此可見,使用縮寫容易產生混淆,所以不推薦使用;
3 用洲/城市表示
城市名使用的是國際標準組織規定的城市名,例如Asia/Shanghai表示上海所在的時區
夏令時
夏令時(Daylight Saving Time)/夏時制又稱"日光節約時制"和"夏令時間"。在這一制度實施期間的時間稱為"夏令時間";
採用夏令時,就是在夏季人為的將時間調快1小時,當夏令時結束後,就會將時間調慢1小時;
本地化
在計算機中,可以將日期、時間、數字、貨幣等資料的格式按Locale資訊進行本地化;
Locale由語言_國家的字母縮寫而成,比如zh_CN表示中文_中國,en_US表示英文_美國,語言使用小寫,國家使用大寫;
新紀元時間/曆元時間
曆元時間是從1970年1月1日零點(格林威治時區/GMT+0:00)到當前時刻所經過的秒數;
曆元時間又稱時間戳,有多種儲存方式:
- 以秒為單位的整數:1652966134,精度只能到秒;
- 以毫秒為單位的整數:1652966134280,最後三位表示毫秒數;
- 以秒為單位的浮點數:1652966134.280,小數點後表示毫秒數;
Java中的時間戳通常是long表示的毫秒數,要獲取當前時間戳,可以使用System.currentTimeMillis()
System.out.print(System.currentTimeMillis());
輸出為:
1652966134280 //以毫秒為單位的整數
Java標準庫提供的處理日期和時間的API
Java標準庫有兩套處理日期和時間的API:一套定義在java.util包,它主要包括Date、Calendar和TimeZone這幾個類;一套定義在java.time包,它主要包括LocalDateTime、ZonedDateTime這幾個類;
Date類
java.util.Date類封裝當前的日期和時間,它提供了兩個構造方法例項化Date物件;
Date( ) //使用當前日期和時間初始化物件
Date(long millisec) //接收一個引數初始化物件,該引數是從1970年1月1日零點起的毫秒數
獲取當前日期和時間並輸出
Date date=new Date(); System.out.print(date); //Thu May 19 21:47:45 GMT+08:00 2022
Date總是以當前計算機系統的預設時區輸出日期和時間,除了使用toGMTString()方法按GMT+0:00的時區格式化日期和時間外,不能轉換時區並且很難對日期和時間進行加減以計算兩個日期之間相差多少天;
Calendar類
Calendar類可以用於獲取和設定年、月、日、時、分、秒,相比於Date類,Calendar類可以進行簡單的日期和時間的計算;
Calendar類獲取當前時間
System.out.print(Calendar.getInstance());
//輸出:
//java.util.GregorianCalendar[time=1653054546124,areFieldsSet=true,areAllFieldsSet=true,lenient=true,zone=sun.util.calendar.ZoneInfo[id="GMT+08:00",offset=28800000,dstSavings=0,useDaylight=false,transitions=0,lastRule=null],firstDayOfWeek=1,minimalDaysInFirstWeek=1,ERA=1,YEAR=2022,MONTH=4,WEEK_OF_YEAR=21,WEEK_OF_MONTH=3,DAY_OF_MONTH=20,DAY_OF_YEAR=140,DAY_OF_WEEK=6,DAY_OF_WEEK_IN_MONTH=3,AM_PM=1,HOUR=9,HOUR_OF_DAY=21,MINUTE=49,SECOND=6,MILLISECOND=124,ZONE_OFFSET=28800000,DST_OFFSET=0]
使用Calendar類設定時間
Calendar cal=Calendar.getInstance(); //獲取當前時間
cal.clear(); //清除所有欄位
cal.set(Calendar.YEAR,2022); //設定年份為2022
Calendar物件轉Date物件
Calendar cal=Calendar.getInstance();
Date date=cal.getTime();
使用功能Calendar類的getTime()方法可以將Calendar物件轉換為Date物件
GregorianCalendar類
Calendar類實現了公曆日曆,是一個抽象類,GregorianCalendar類是Calendar類的一個具體實現;
Calendar 的getInstance()方法返回一個預設用當前的語言環境和時區初始化的GregorianCalendar物件;
格式化日期和時間
使用SimpleDateFormat格式化日期
Date date = new Date( ); SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss"); System.out.print(ft.format(date));
SimpleDateFormat方法中指定的字串規定了日期和時間輸出的格式
使用printf格式化日期
Date date = new Date(); System.out.printf("%tD", date);