java8日期_Java8日期与时间
我們知道Java8一個比較大的改動就是引入了新的表示日期和時間的API,還是很有必要抽點時間了解一下基本的用法。
Java8之前的問題
在討論Java8的API之前,我們先看看原來API的問題。我們知道Java8之前只有java.util.Date和java.util.Calendar來表示和處理時間,它們的一些常見的問題如下:Date返回getMonth返回值為0~11,分別對應(yīng)1~12月;
Calendar處理夏令時可能會引起問題;
這兩個類以及DateTimeFormat都不是線程安全的;
缺乏很多時間概念,如無時區(qū)日期,時間,間隔等等;
缺乏很多常用的日期操作,如計算兩個日期相差天數(shù)
JSR 310就是這樣應(yīng)運而生,Java8的API也是依據(jù)此規(guī)范而來。This JSR will tackle the problem of a complete date and time model, including dates and times (with and without time zones), durations and time periods, intervals, formatting and parsing.
概覽包名功能java.time表示日期、時間、瞬時和期間的公共類
java.time.chrono非ISO日歷系統(tǒng)的API
java.time.format格式化類
java.time.temporal使用fields,units,adjusters訪問日期和時間
java.time.zone支持時區(qū)及其規(guī)則
常用類類功能Instant自1970年1月1日以來的一個時間點,以納秒為單位
Duration時長,以納秒為單位
Calendrical與底層API有關(guān)
DateTimeFields存儲域——值對的一個映射,不要求一致
DayOfWeek星期中的一天
LocalDate本地日期(年月日),沒有調(diào)整
LocalTime本地時間(時分秒),沒有調(diào)整
LocalDateTimeLocalDate和LocalTime的組合
MonthDay月日
OffsetTime帶時區(qū)的偏移時間,不包括日期或時區(qū)值
OffsetDateTime帶時區(qū)偏移的日期時間,不包括時區(qū)值
Period時間長度的描述,如兩個月零三天
ZonedDateTime帶時區(qū)和偏移的日期時間
Year年
YearMonth年月
ZoneOffset從UTC開始的時間偏移(時分秒)
ZoneId定義一個時區(qū),如Canada/Eastern,及其轉(zhuǎn)換規(guī)則
如果對哪個類不是特別理解,打開IDE,簡單的操作一下即可。
簡單用例
查看當天日期1
2
3
4
5
6
7
8System.out.println(LocalDate.now());
System.out.println(LocalTime.now());
System.out.println(LocalDateTime.now());
output:
2017-01-03
16:24:11.520
2017-01-03T16:24:11.520
格式化日期和時間
下面是DateTimeFormatter類提供的格式化樣式,只需簡單了解一下即可,需要時可以查詢DateTimeFormatter文檔。
還有一個值得注意的是,模式中字母的重復(fù)次數(shù)對應(yīng)這字符串預(yù)期長度。例如”MMM”對應(yīng)”Jan”,””MMMM”對應(yīng)”January”。你可能會好奇為什么”MMMM”為什么不是對應(yīng)”Janu”,這點可以參考上面的文檔,如何對應(yīng)在文檔中也有說明。符號含義顯示形式例子G公元文本AD;Anno Domini
y公元年年份2004;04
u公元年年份公元年和y相同,公元前3年,y返回3,u返回-2
D一年中的第幾天數(shù)字189
M/L月數(shù)字/文本7;07;Jul;July;J
d一月中的第幾天數(shù)字10
Q/q一年中的第幾季數(shù)字/文本3;03;Q3,3rd quarter
Y年年份1996;96
w一年中的某一周數(shù)字27
W一個月中的某一周數(shù)字4
e/c星期中的本地天數(shù)數(shù)字/文本2;02;Tue;Tuesday;T
E星期中的第幾天文本Tue;Tuesday;T
F某月中星期幾出現(xiàn)的序數(shù)(第幾個)數(shù)字3
aAM/PM表示文本PM
h12小時制的小時數(shù)(1~12)數(shù)字12
K12小時制的小時數(shù)(0~11)數(shù)字0
k24小時制的小時數(shù)(1~24)數(shù)字24
H24小時制的小時數(shù)(0~23)數(shù)字0
m小時內(nèi)第幾分數(shù)字30
s一分內(nèi)第幾秒數(shù)字55
S秒的小數(shù)(毫秒)小數(shù)978
A千分之一天數(shù)字1234
n納秒數(shù)字987654321
N十億分之一(納)天數(shù)字1234000000
V時區(qū)ID值文本America/Los_Angeles;Z;-08:30
z時區(qū)名文本Pacific Standard Time;PST
X時區(qū)偏移ZOffset-XZ;-08;-0830;-08:30;-083015;-08:30:15
x時區(qū)偏移Offset-x+0000;-08;-0830;-08:30;-083015;-08:30:15
Z時區(qū)的GMT偏移Offset-Z+0000;-0800;-08:00
O本地時區(qū)偏移Offset-OGMT+8;GMT+08:00;UTC-08:00
p填充下一個填充符11
2
3
4
5
6
7DateTimeFormatter df = DateTimeFormatter.ofPattern("yy/LL/dd");
System.out.println(df.format(LocalDate.now()));
System.out.println(LocalDate.parse("17/01/04",df));
output:
17/01/04
2017-01-04
日期和時間戳轉(zhuǎn)換1
2
3
4
5
6
7
8
9
10System.out.println(ZonedDateTime.now());
System.out.println(ZonedDateTime.now().toInstant().getEpochSecond());
Instant instant = Instant.ofEpochSecond(1483492172L);
ZonedDateTime zonedDateTime = ZonedDateTime.ofInstant(instant, ZoneId.of("Asia/Shanghai"));
System.out.println(zonedDateTime);
output:
2017-01-04T09:13:39.624+08:00[Asia/Shanghai]
1483492419
2017-01-04T09:09:32+08:00[Asia/Shanghai]
字符串解析為日期1
2
3
4
5
6
7
8
9
10
11
12
13
14
15LocalDate localDate = LocalDate.parse("2016-01-04");
System.out.println(localDate);
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("dd LLL yyyy");
System.out.println(pattern.format(LocalDate.now()));
//注意LocalDate是和本地相關(guān)的,所以要用一月,上面就是看看本地輸出格式
DateTimeFormatter df = DateTimeFormatter.ofPattern("dd MMM yyyy");
System.out.println(LocalDate.parse("04 一月 2011", df));
output:
2016-01-04
04 一月 2017
2011-01-04
日期間的計算1
2
3
4
5
6
7
8
9
10
11LocalDate last = LocalDate.of(2016, 1, 1);
LocalDate now = LocalDate.now();
Period diff = Period.between(last, now);
System.out.println(diff);
//今天是2017/1/4
Period p = Period.ofDays(1);
System.out.println(now.plus(p));
output:
P1Y3D
2017-01-05
參考鏈接
總結(jié)
以上是生活随笔為你收集整理的java8日期_Java8日期与时间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux查看线程的命令(linux查看
- 下一篇: java的封装性的优点_18、Java的