深入理解java long 存儲時間戳
存儲時間打算用時間戳來存儲,打算用long類型來代表時間戳,但是在用long類型存儲時間戳的時候出了點問提。
在寫單元測試的時候,用一個long類型來存儲時間戳,發(fā)現(xiàn)編譯器報錯了
剛開始猜想可能是因為long不夠大,存儲不了。然后用double類型來存:
發(fā)現(xiàn)還是報錯了,仔細想想不對,double存儲的數(shù)量應該時很大的,不會連時間戳都存儲不了。
在后面加上小數(shù)點之后,居然可以存了:
加了小數(shù)點之后就能存了,仔細一想,之前沒加小數(shù)點的時候他是整數(shù),加了小數(shù)點之后變成了浮點數(shù),猜測之前沒加上小數(shù)點的時間戳是一個整形的字面值,加上小數(shù)點后是一個浮點數(shù)的字面值,之前的報錯應該不是存儲類型的問題,而是字面值范圍超出了。
用字符串來測試:
把時間戳變成字符串的字面值,在將他解析成long類型的和int類型的,然后在把他們輸出:
發(fā)現(xiàn)第一個long類型的成功輸出了,而int類型的卻報了一個number的錯誤.
這說明long是可以存儲時間戳的,而int存儲不了時間戳,所以判斷之前不能存儲時因為字面值為整形超出了范圍。
Java 各種日期/時間 對象轉(zhuǎn)Long時間戳
package cn.xbz; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; import java.util.Calendar; import java.util.Date; /** * @title 各種日期/時間對象轉(zhuǎn)時間戳 * @author Xingbz * @createDate 2018-5-18 */ public class DateTime2MillisDemo { private static final String FORMAT_STR = "yyyy-MM-dd HH:mm:ss"; public static void main(String[] args) { System.out.println("====== JDK7及之前 ======"); Long l1 = getMillis1(); Long l2 = date2Millis(new Date()); Long l3 = calendar2Millis(Calendar.getInstance()); Long l4 = string2Millis(new SimpleDateFormat(FORMAT_STR).format(new Date()) , FORMAT_STR);//為了與以上幾個保持一致 System.out.println(l1 + "\n" + l2 + "\n" + l3 + "\n" + l4);//會有幾毫秒的差別 System.out.println("====== JDK8 ======"); Long l5 = getMillis2(); Long l6 = localDateTime2Millis(LocalDateTime.now()); Long l7 = localDate2Millis(LocalDate.now()); Long l8 = clock2Millis(Clock.systemUTC()); Long l9 = zoneDateTime2Millis(ZonedDateTime.now()); Long l10 = string2MillisWithJDK8(LocalDateTime.now().format(DateTimeFormatter.ofPattern(FORMAT_STR)) , FORMAT_STR);//為了與以上幾個保持一致 System.out.println(l5 + "\n" + l6 + "\n" + l7 + "\n" + l8 + "\n" + l9 + "\n" + l10);//會有幾毫秒的差別 } /* JDK7及之前 */ /** 獲取時間戳 */ public static Long getMillis1() { return System.currentTimeMillis(); } /** Date轉(zhuǎn)時間戳 */ public static Long date2Millis(Date date) { return date.getTime(); } /** Calendar轉(zhuǎn)時間戳 */ public static Long calendar2Millis(Calendar calendar) { return calendar.getTime().getTime(); } /** 日期字符串轉(zhuǎn)時間戳 */ public static Long string2Millis(String dateStr, String formatStr) { try { SimpleDateFormat simpleDateFormat = new SimpleDateFormat(formatStr); return simpleDateFormat.parse(dateStr).getTime(); } catch (Exception e) { return 0L; } } /* JDK8 */ /** 獲取時間戳 */ public static Long getMillis2() { return Instant.now().toEpochMilli(); } /** LocalDateTime轉(zhuǎn)時間戳 */ public static Long localDateTime2Millis(LocalDateTime localDateTime) { return localDateTime.toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); } /** LocalDate轉(zhuǎn)時間戳 */ public static Long localDate2Millis(LocalDate localDate) { return LocalDateTime.of(localDate, LocalTime.MIN).toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); } /** Clock轉(zhuǎn)時間戳 */ public static Long clock2Millis(Clock clock) { return clock.millis(); } /** ZoneDateTIme轉(zhuǎn)時間戳(這個不常用吧~) */ public static Long zoneDateTime2Millis(ZonedDateTime zonedDateTime) { return zonedDateTime.toLocalDateTime().toInstant(ZoneOffset.ofHours(8)).toEpochMilli();//!!!好費勁 } /** String轉(zhuǎn)時間戳(JDK8) */ public static Long string2MillisWithJDK8(String dateStr , String formatStr) { return LocalDateTime.parse(dateStr , DateTimeFormatter.ofPattern(formatStr)).toInstant(ZoneOffset.ofHours(8)).toEpochMilli(); } }
輸出如下 :
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關文章
java 快速實現(xiàn)異步調(diào)用的操作方法
這篇文章主要介紹了java 如何快速實現(xiàn)異步調(diào)用方法,今天我們就來了解下 CompletableFuture,它Java 8引入的一種功能強大的異步編程工具,可以用于實現(xiàn)復雜的異步操作和處理鏈式的異步任務,需要的朋友可以參考下2023-07-07MyBatis動態(tài)SQL如何實現(xiàn)前端指定返回字段
這篇文章主要介紹了MyBatis動態(tài)SQL如何實現(xiàn)前端指定返回字段,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-01-01Spring?IOC容器基于XML外部屬性文件的Bean管理
這篇文章主要為大家介紹了Spring?IOC容器Bean管理XML外部屬性文件,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-05-05