电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

深度思考JDK8中日期類型該如何使用詳解

瀏覽:92日期:2024-07-21 10:25:44

在JDK8之前,處理日期時間,我們主要使用3個類, Date 、 SimpleDateFormat 和 Calendar 。

這3個類在使用時都或多或少的存在一些問題,比如 SimpleDateFormat 不是線程安全的,

比如 Date 和 Calendar 獲取到的月份是0到11,而不是現實生活中的1到12,關于這一點,《阿里巴巴Java開發手冊》中也有提及,因為很容易犯錯:

深度思考JDK8中日期類型該如何使用詳解

不過,JDK8推出了全新的日期時間處理類解決了這些問題,比如 Instant 、 LocalDate 、 LocalTime 、 LocalDateTime 、 DateTimeFormatter ,在《阿里巴巴Java開發手冊》中也推薦使用 Instant 、

LocalDateTime 、 DateTimeFormatter :

深度思考JDK8中日期類型該如何使用詳解

但我發現好多項目中其實并沒有使用這些類,使用的還是之前的 Date 、 SimpleDateFormat 和 Calendar ,所以本篇博客就講解下JDK8新推出的日期時間類,主要是下面幾個:

Instant LocalDate LocalTime LocalDateTime DateTimeFormatter1. Instant 1.1 獲取當前時間

既然 Instant 可以代替 Date 類,那它肯定可以獲取當前時間:

Instant instant = Instant.now();System.out.println(instant);

輸出結果:

2020-06-10T08:22:13.759Z

細心的你會發現,這個時間比北京時間少了8個小時,如果要輸出北京時間,可以加上默認時區:

System.out.println(instant.atZone(ZoneId.systemDefault()));

輸出結果:

2020-06-10T16:22:13.759+08:00[Asia/Shanghai]

1.2 獲取時間戳

Instant instant = Instant.now();// 當前時間戳:單位為秒System.out.println(instant.getEpochSecond());// 當前時間戳:單位為毫秒System.out.println(instant.toEpochMilli());

輸出結果:

1591777752

1591777752613

當然,也可以通過 System.currentTimeMillis() 獲取當前毫秒數。

1.3 將long轉換為Instant

1)根據秒數時間戳轉換:

Instant instant = Instant.now();System.out.println(instant);long epochSecond = instant.getEpochSecond();System.out.println(Instant.ofEpochSecond(epochSecond));System.out.println(Instant.ofEpochSecond(epochSecond, instant.getNano()));

輸出結果:

2020-06-10T08:40:54.046Z

2020-06-10T08:40:54Z

2020-06-10T08:40:54.046Z

2)根據毫秒數時間戳轉換:

Instant instant = Instant.now();System.out.println(instant);long epochMilli = instant.toEpochMilli();System.out.println(Instant.ofEpochMilli(epochMilli));

輸出結果:

2020-06-10T08:43:25.607Z

2020-06-10T08:43:25.607Z

1.4 將String轉換為Instant

String text = '2020-06-10T08:46:55.967Z';Instant parseInstant = Instant.parse(text);System.out.println('秒時間戳:' + parseInstant.getEpochSecond());System.out.println('豪秒時間戳:' + parseInstant.toEpochMilli());System.out.println('納秒:' + parseInstant.getNano());

輸出結果:

秒時間戳:1591778815

豪秒時間戳:1591778815967

納秒:967000000

如果字符串格式不對,比如修改成 2020-06-10T08:46:55.967 ,就會拋出 java.time.format.DateTimeParseException 異常,如下圖所示:

深度思考JDK8中日期類型該如何使用詳解

2. LocalDate 2.1 獲取當前日期

使用 LocalDate 獲取當前日期非常簡單,如下所示:

LocalDate today = LocalDate.now();System.out.println('today: ' + today);

輸出結果:

today: 2020-06-10

不用任何格式化,輸出結果就非常友好,如果使用 Date ,輸出這樣的格式,還得配合 SimpleDateFormat 指定 yyyy-MM-dd 進行格式化,一不小心還會出個bug,比如去年年底很火的1個bug,我當時還是截了圖的:

深度思考JDK8中日期類型該如何使用詳解

這2個好友是2019/12/31關注我的,但我2020年1月2號查看時,卻顯示成了2020/12/31,為啥呢?格式化日期時格式寫錯了,應該是 yyyy/MM/dd ,卻寫成了 YYYY/MM/dd ,剛好那周跨年,就顯示成下一年,也就是2020年了,當時好幾個博主寫過文章解析原因,我這里就不做過多解釋了。

劃重點:都說到這了,給大家安利下我新注冊的公眾號「申城異鄉人」,歡迎大家關注,更多原創文章等著你哦,哈哈。

2.2 獲取年月日

LocalDate today = LocalDate.now();int year = today.getYear();int month = today.getMonthValue();int day = today.getDayOfMonth();System.out.println('year: ' + year);System.out.println('month: ' + month);System.out.println('day: ' + day);

輸出結果:

year: 2020

month: 6

day: 10

獲取月份終于返回1到12了,不像 java.util.Calendar 獲取月份返回的是0到11,獲取完還得加1。

深度思考JDK8中日期類型該如何使用詳解

2.3 指定日期

LocalDate specifiedDate = LocalDate.of(2020, 6, 1);System.out.println('specifiedDate: ' + specifiedDate);

輸出結果:

specifiedDate: 2020-06-01

如果確定月份,推薦使用另一個重載方法,使用枚舉指定月份:

LocalDate specifiedDate = LocalDate.of(2020, Month.JUNE, 1);2.4 比較日期是否相等

LocalDate localDate1 = LocalDate.now();LocalDate localDate2 = LocalDate.of(2020, 6, 10);if (localDate1.equals(localDate2)) { System.out.println('localDate1 equals localDate2');}

輸出結果:

localDate1 equals localDate2

2.5 獲取日期是本周/本月/本年的第幾天

LocalDate today = LocalDate.now();System.out.println('Today:' + today);System.out.println('Today is:' + today.getDayOfWeek());System.out.println('今天是本周的第' + today.getDayOfWeek().getValue() + '天');System.out.println('今天是本月的第' + today.getDayOfMonth() + '天');System.out.println('今天是本年的第' + today.getDayOfYear() + '天');

輸出結果:

Today:2020-06-11

Today is:THURSDAY

今天是本周的第4天

今天是本月的第11天

今天是本年的第163天

2.6 判斷是否為閏年

LocalDate today = LocalDate.now();System.out.println(today.getYear() + ' is leap year:' + today.isLeapYear());

輸出結果:

2020 is leap year:true

3. LocalTime3.1 獲取時分秒

如果使用 java.util.Date ,那代碼是下面這樣的:

Date date = new Date();int hour = date.getHours();int minute = date.getMinutes();int second = date.getSeconds();System.out.println('hour: ' + hour);System.out.println('minute: ' + minute);System.out.println('second: ' + second);

輸出結果:

深度思考JDK8中日期類型該如何使用詳解

注意事項:這幾個方法已經過期了,因此強烈不建議在項目中使用:

深度思考JDK8中日期類型該如何使用詳解

如果使用 java.util.Calendar ,那代碼是下面這樣的:

Calendar calendar = Calendar.getInstance();// 12小時制int hourOf12 = calendar.get(Calendar.HOUR);// 24小時制int hourOf24 = calendar.get(Calendar.HOUR_OF_DAY);int minute = calendar.get(Calendar.MINUTE);int second = calendar.get(Calendar.SECOND);int milliSecond = calendar.get(Calendar.MILLISECOND);System.out.println('hourOf12: ' + hourOf12);System.out.println('hourOf24: ' + hourOf24);System.out.println('minute: ' + minute);System.out.println('second: ' + second);System.out.println('milliSecond: ' + milliSecond);

輸出結果:

深度思考JDK8中日期類型該如何使用詳解

注意事項:獲取小時時,有2個選項,1個返回12小時制的小時數,1個返回24小時制的小時數,因為現在是晚上8點,所以 calendar.get(Calendar.HOUR) 返回8,而 calendar.get(Calendar.HOUR_OF_DAY) 返回20。

如果使用 java.time.LocalTime ,那代碼是下面這樣的:

LocalTime localTime = LocalTime.now();System.out.println('localTime:' + localTime);int hour = localTime.getHour();int minute = localTime.getMinute();int second = localTime.getSecond();System.out.println('hour: ' + hour);System.out.println('minute: ' + minute);System.out.println('second: ' + second);

輸出結果:

深度思考JDK8中日期類型該如何使用詳解

可以看出,LocalTime只有時間沒有日期。

4. LocalDateTime4.1 獲取當前時間

LocalDateTime localDateTime = LocalDateTime.now();System.out.println('localDateTime:' + localDateTime);

輸出結果:

localDateTime: 2020-06-11T11:03:21.376

4.2 獲取年月日時分秒

LocalDateTime localDateTime = LocalDateTime.now();System.out.println('localDateTime: ' + localDateTime);System.out.println('year: ' + localDateTime.getYear());System.out.println('month: ' + localDateTime.getMonthValue());System.out.println('day: ' + localDateTime.getDayOfMonth());System.out.println('hour: ' + localDateTime.getHour());System.out.println('minute: ' + localDateTime.getMinute());System.out.println('second: ' + localDateTime.getSecond());

輸出結果:

深度思考JDK8中日期類型該如何使用詳解

4.3 增加天數/小時

LocalDateTime localDateTime = LocalDateTime.now();System.out.println('localDateTime: ' + localDateTime);LocalDateTime tomorrow = localDateTime.plusDays(1);System.out.println('tomorrow: ' + tomorrow);LocalDateTime nextHour = localDateTime.plusHours(1);System.out.println('nextHour: ' + nextHour);

輸出結果:

localDateTime: 2020-06-11T11:13:44.979

tomorrow: 2020-06-12T11:13:44.979

nextHour: 2020-06-11T12:13:44.979

LocalDateTime 還提供了添加年、周、分鐘、秒這些方法,這里就不一一列舉了:

深度思考JDK8中日期類型該如何使用詳解

4.4 減少天數/小時

LocalDateTime localDateTime = LocalDateTime.now();System.out.println('localDateTime: ' + localDateTime);LocalDateTime yesterday = localDateTime.minusDays(1);System.out.println('yesterday: ' + yesterday);LocalDateTime lastHour = localDateTime.minusHours(1);System.out.println('lastHour: ' + lastHour);

輸出結果:

localDateTime: 2020-06-11T11:20:38.896

yesterday: 2020-06-10T11:20:38.896

lastHour: 2020-06-11T10:20:38.896

類似的, LocalDateTime 還提供了減少年、周、分鐘、秒這些方法,這里就不一一列舉了:

深度思考JDK8中日期類型該如何使用詳解

4.5 獲取時間是本周/本年的第幾天

LocalDateTime localDateTime = LocalDateTime.now();System.out.println('localDateTime: ' + localDateTime);System.out.println('DayOfWeek: ' + localDateTime.getDayOfWeek().getValue());System.out.println('DayOfYear: ' + localDateTime.getDayOfYear());

輸出結果:

localDateTime: 2020-06-11T11:32:31.731

DayOfWeek: 4

DayOfYear: 163

5. DateTimeFormatter

JDK8中推出了 java.time.format.DateTimeFormatter 來處理日期格式化問題,《阿里巴巴Java開發手冊》中也是建議使用 DateTimeFormatter 代替 SimpleDateFormat 。

5.1 格式化LocalDate

LocalDate localDate = LocalDate.now();System.out.println('ISO_DATE: ' + localDate.format(DateTimeFormatter.ISO_DATE));System.out.println('BASIC_ISO_DATE: ' + localDate.format(DateTimeFormatter.BASIC_ISO_DATE));System.out.println('ISO_WEEK_DATE: ' + localDate.format(DateTimeFormatter.ISO_WEEK_DATE));System.out.println('ISO_ORDINAL_DATE: ' + localDate.format(DateTimeFormatter.ISO_ORDINAL_DATE));

輸出結果:

深度思考JDK8中日期類型該如何使用詳解

如果提供的格式無法滿足你的需求,你還可以像以前一樣自定義格式:

LocalDate localDate = LocalDate.now();System.out.println('yyyy/MM/dd: ' + localDate.format(DateTimeFormatter.ofPattern('yyyy/MM/dd')));

輸出結果:

yyyy/MM/dd: 2020/06/11

5.2 格式化LocalTime

LocalTime localTime = LocalTime.now();System.out.println(localTime);System.out.println('ISO_TIME: ' + localTime.format(DateTimeFormatter.ISO_TIME));System.out.println('HH:mm:ss: ' + localTime.format(DateTimeFormatter.ofPattern('HH:mm:ss')));

輸出結果:

14:28:35.230

ISO_TIME: 14:28:35.23

HH:mm:ss: 14:28:35

5.3 格式化LocalDateTime

LocalDateTime localDateTime = LocalDateTime.now();System.out.println(localDateTime);System.out.println('ISO_DATE_TIME: ' + localDateTime.format(DateTimeFormatter.ISO_DATE_TIME));System.out.println('ISO_DATE: ' + localDateTime.format(DateTimeFormatter.ISO_DATE));

輸出結果:

2020-06-11T14:33:18.303

ISO_DATE_TIME: 2020-06-11T14:33:18.303

ISO_DATE: 2020-06-11

6. 類型相互轉換 6.1 Instant轉Date

JDK8中, Date 新增了 from() 方法,將 Instant 轉換為 Date ,代碼如下所示:

Instant instant = Instant.now();System.out.println(instant);Date dateFromInstant = Date.from(instant);System.out.println(dateFromInstant);

輸出結果:

2020-06-11T06:39:34.979Z

Thu Jun 11 14:39:34 CST 2020

6.2 Date轉Instant

JDK8中, Date 新增了 toInstant 方法,將 Date 轉換為 Instant ,代碼如下所示:

Date date = new Date();Instant dateToInstant = date.toInstant();System.out.println(date);System.out.println(dateToInstant);

輸出結果:

Thu Jun 11 14:46:12 CST 2020

2020-06-11T06:46:12.112Z

6.3 Date轉LocalDateTime

Date date = new Date();Instant instant = date.toInstant();LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());System.out.println(date);System.out.println(localDateTimeOfInstant);

輸出結果:

Thu Jun 11 14:51:07 CST 2020

2020-06-11T14:51:07.904

6.4 Date轉LocalDate

Date date = new Date();Instant instant = date.toInstant();LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());LocalDate localDate = localDateTimeOfInstant.toLocalDate();System.out.println(date);System.out.println(localDate);

輸出結果:

Thu Jun 11 14:59:38 CST 2020

2020-06-11

可以看出, Date 是先轉換為 Instant ,再轉換為 LocalDateTime ,然后通過 LocalDateTime 獲取 LocalDate 。

6.5 Date轉LocalTime

Date date = new Date();Instant instant = date.toInstant();LocalDateTime localDateTimeOfInstant = LocalDateTime.ofInstant(instant, ZoneId.systemDefault());LocalTime toLocalTime = localDateTimeOfInstant.toLocalTime();System.out.println(date);System.out.println(toLocalTime);

輸出結果:

Thu Jun 11 15:06:14 CST 2020

15:06:14.531

可以看出, Date 是先轉換為 Instant ,再轉換為 LocalDateTime ,然后通過 LocalDateTime 獲取 LocalTime 。

6.6 LocalDateTime轉Date

LocalDateTime localDateTime = LocalDateTime.now();Instant toInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();Date dateFromInstant = Date.from(toInstant);System.out.println(localDateTime);System.out.println(dateFromInstant);

輸出結果:

2020-06-11T15:12:11.600

Thu Jun 11 15:12:11 CST 2020

6.7 LocalDate轉Date

LocalDate today = LocalDate.now();LocalDateTime localDateTime = localDate.atStartOfDay();Instant toInstant = localDateTime.atZone(ZoneId.systemDefault()).toInstant();Date dateFromLocalDate = Date.from(toInstant);System.out.println(dateFromLocalDate);

輸出結果:

Thu Jun 11 00:00:00 CST 2020

6.8 LocalTime轉Date

LocalDate localDate = LocalDate.now();LocalTime localTime = LocalTime.now();LocalDateTime localDateTime = LocalDateTime.of(localDate, localTime);Instant instantFromLocalTime = localDateTime.atZone(ZoneId.systemDefault()).toInstant();Date dateFromLocalTime = Date.from(instantFromLocalTime);System.out.println(dateFromLocalTime);

輸出結果:

Thu Jun 11 15:24:18 CST 2020

7. 總結

JDK8推出了全新的日期時間類,如 Instant 、 LocaleDate 、 LocalTime 、 LocalDateTime 、 DateTimeFormatter ,設計比之前更合理,也是線程安全的。

《阿里巴巴Java開發規范》中也推薦使用 Instant 代替 Date , LocalDateTime 代替 Calendar , DateTimeFormatter 代替 SimpleDateFormat 。

因此,如果條件允許,建議在項目中使用,沒有使用的,可以考慮升級下。

到此這篇關于JDK8中日期類型該如何使用詳解的文章就介紹到這了,更多相關JDK8 日期類型內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: JDK8
主站蜘蛛池模板: 螺旋叶片_螺旋叶片成型机_绞龙叶片_莱州源泽机械制造有限公司 | 注塑机-压铸机-塑料注塑机-卧式注塑机-高速注塑机-单缸注塑机厂家-广东联升精密智能装备科技有限公司 | 广州办公室设计,办公室装修,写字楼设计,办公室装修公司_德科 | 不锈钢水管-不锈钢燃气管-卫生级不锈钢管件-不锈钢食品级水管-广东双兴新材料集团有限公司 | 长沙一级消防工程公司_智能化弱电_机电安装_亮化工程专业施工承包_湖南公共安全工程有限公司 | 振动筛-交叉筛-螺旋筛-滚轴筛-正弦筛-方形摇摆筛「新乡振动筛厂家」 | 陶瓷砂磨机,盘式砂磨机,棒销式砂磨机-无锡市少宏粉体科技有限公司 | 河北中仪伟创试验仪器有限公司是专业生产沥青,土工,水泥,混凝土等试验仪器的厂家,咨询电话:13373070969 | 济南冷库安装-山东冷库设计|建造|冷库维修-山东齐雪制冷设备有限公司 | 滚筒烘干机_转筒烘干机_滚筒干燥机_转筒干燥机_回转烘干机_回转干燥机-设备生产厂家 | 氢氧化钾厂家直销批发-济南金昊化工有限公司 | 最新电影-好看的电视剧大全-朝夕电影网 | sus630/303cu不锈钢棒,440C/430F/17-4ph不锈钢研磨棒-江苏德镍金属科技有限公司 | 工业硝酸钠,硝酸钠厂家-淄博「文海工贸」 | 薄壁轴承-等截面薄壁轴承生产厂家-洛阳薄壁精密轴承有限公司 | MES系统工业智能终端_生产管理看板/安灯/ESOP/静电监控_讯鹏科技 | 圆窗水平仪|伊莉莎冈特elesa+ganter | 质检报告_CE认证_FCC认证_SRRC认证_PSE认证_第三方检测机构-深圳市环测威检测技术有限公司 | 100国际学校招生 - 专业国际学校择校升学规划 | 雷冲击高压发生器-水内冷直流高压发生器-串联谐振分压器-武汉特高压电力科技有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 广州各区危化证办理_危险化学品经营许可证代办 | 热闷罐-高温罐-钢渣热闷罐-山东鑫泰鑫智能热闷罐厂家 | 番茄畅听邀请码怎么输入 - Dianw8.com | 钢衬玻璃厂家,钢衬玻璃管道 -山东东兴扬防腐设备有限公司 | 电主轴,车床电磨头,变频制动电机-博山鸿达特种电机 | 棉柔巾代加工_洗脸巾oem_一次性毛巾_浴巾生产厂家-杭州禾壹卫品科技有限公司 | 青岛球场围网,青岛车间隔离网,青岛机器人围栏,青岛水源地围网,青岛围网,青岛隔离栅-青岛晟腾金属制品有限公司 | H型钢切割机,相贯线切割机,数控钻床,数控平面钻,钢结构设备,槽钢切割机,角钢切割机,翻转机,拼焊矫一体机 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 卫生纸复卷机|抽纸机|卫生纸加工设备|做卫生纸机器|小型卫生纸加工需要什么设备|卫生纸机器设备多少钱一台|许昌恒源纸品机械有限公司 | 技德应用| 400电话_400电话申请_888元包年_400电话办理服务中心_400VIP网 | BOE画框屏-触摸一体机-触控查询一体机-触摸屏一体机价格-厂家直销-触发电子 | 网架支座@球铰支座@钢结构支座@成品支座厂家@万向滑动支座_桥兴工程橡胶有限公司 | 河南空气能热水器-洛阳空气能采暖-洛阳太阳能热水工程-洛阳润达高科空气能商行 | 南京展台搭建-南京展会设计-南京展览设计公司-南京展厅展示设计-南京汇雅展览工程有限公司 | IPO咨询公司-IPO上市服务-细分市场研究-龙马咨询 | 小型气象站_车载气象站_便携气象站-山东风途物联网 | 广东泵阀展|阀门展-广东国际泵管阀展览会 | 电机修理_二手电机专家-河北豫通机电设备有限公司(原石家庄冀华高压电机维修中心) |