localdatetime 默认时间_java中的时间与时区:LocalDateTime和Date
LocalDateTime
LocalDateTime本身不包含時(shí)區(qū)信息,它存儲的是年、月、日、時(shí)分秒,納秒這樣的數(shù)字。
在不同的時(shí)區(qū)下,這樣的數(shù)字代表不同的時(shí)間。
比如一個(gè)LocalDateTime存儲2020-01-01 08:00:00,這里省略納秒。
對北京和東京的人來看這個(gè)時(shí)間,都認(rèn)為是本地時(shí)間的話,在真實(shí)時(shí)間上,因?yàn)闀r(shí)區(qū)的差異,其實(shí)是相差1個(gè)小時(shí)的時(shí)間的。
構(gòu)造函數(shù)
既然不帶時(shí)區(qū),那么考慮LocalDateTime的構(gòu)造函數(shù):
LocalDateTime dtUtc = LocalDateTime.now(ZoneOffset.UTC);
為什么這里又有時(shí)區(qū)了呢?其實(shí)這是一個(gè)方便的方法:
如果只是為了獲取當(dāng)前系統(tǒng)所在默認(rèn)時(shí)區(qū)的一個(gè)本地時(shí)間,那么用LocalDateTime.now()無參數(shù)構(gòu)造方法即可,而如果我想知道現(xiàn)在在UTC時(shí)區(qū)那里本地顯示的是什么時(shí)間,就可以用LocalDateTime.now(ZoneOffset.UTC)這個(gè)構(gòu)造方法了。
所以對于我們東八區(qū)來說:
//假如這個(gè)時(shí)間是:2020-01-01 10:00:00
LocalDateTime dtLocal = LocalDateTime.now();
//那么這個(gè)時(shí)間就會(huì)存儲:2020-01-01 02:00:00,提前8個(gè)小時(shí)
LocalDateTime dtUtc = LocalDateTime.now(ZoneOffset.UTC);
在構(gòu)造后,LocalDateTime同樣不攜帶時(shí)區(qū)信息,仍然只是表示一個(gè)顯示時(shí)間而已。
Date
Date存儲的是一個(gè)毫秒數(shù),準(zhǔn)確說是從1970-01-01 00:00:00到現(xiàn)在經(jīng)過的毫秒數(shù)。
而這個(gè)毫秒數(shù)是有時(shí)區(qū)的,它存儲的永遠(yuǎn)是現(xiàn)在針對UTC時(shí)區(qū)時(shí)的1970年零點(diǎn),經(jīng)過的毫秒數(shù)。怎么理解?
比如兩個(gè)程序員在同一時(shí)刻,一個(gè)在英國,一個(gè)在中國,同時(shí)調(diào)用new Date(),那么此時(shí)Date中存儲的毫秒數(shù)是完全相同的(當(dāng)然是理想情況的同時(shí),以及系統(tǒng)沒有誤差)。所不同的是在輸出時(shí),GMT0時(shí)區(qū),直接使用這個(gè)毫秒數(shù)計(jì)算得到顯示時(shí)間,而北京GMT+8顯示時(shí),會(huì)在這個(gè)時(shí)間上增加8小時(shí),即時(shí)區(qū)偏移。
所以如下兩個(gè)格式化類型,在當(dāng)前東八區(qū)的使用場景,輸出實(shí)際是一樣的:
SimpleDateFormat bjSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 北京
bjSdf.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai")); // 設(shè)置北京時(shí)區(qū)
SimpleDateFormat dftSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); // 不設(shè)置時(shí)區(qū)
構(gòu)造
因?yàn)镈ate有時(shí)區(qū)信息,所以構(gòu)造Date也就需要時(shí)區(qū)信息。
因此,不能直接從LocalDateTime轉(zhuǎn)換成Date,因?yàn)闊o法確定這個(gè)LodalDateTime究竟是哪個(gè)時(shí)區(qū)的這個(gè)時(shí)間。
而要借助Instant,因?yàn)镮nstant也代表從UTC開始的一個(gè)偏移時(shí)間。
LocalDateTime dt = LocalDateTime.now();
Date dt2 = Date.from(dt.toInstant(ZoneOffset.of("+8"))); //東八區(qū)
輸出
總結(jié)
以上是生活随笔為你收集整理的localdatetime 默认时间_java中的时间与时区:LocalDateTime和Date的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: FTP命令:下载,上传FTP服务器中的文
- 下一篇: win10 利用安装包 安装 ssh