亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么日期轉換會返回不同的時間戳?

為什么日期轉換會返回不同的時間戳?

慕的地8271018 2023-03-31 14:43:25
我正在將 GregorianCalendar 實例轉換為 Date 以獲得 unix 時間戳。但我想知道為什么相同的日期每次都返回不同的 Unix 時間戳。SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");Calendar calendar = new GregorianCalendar();calendar.set(2018, 0, 1, 0,0,0);System.out.println(sdf.format(calendar.getTime()));Date date = calendar.getTime();System.out.println(sdf.format(date));System.out.println(date.getTime());日期本身是正確的,并且始終相同,"2018/01/01 00:00:00"。但是為什么每次的unix時間戳都不一樣呢?例如,這些是 5 次執行后的值。15147612006241514761200618151476120079715147612002091514761200132
查看完整描述

4 回答

?
紅糖糍粑

TA貢獻1815條經驗 獲得超6個贊

當您創建新日歷時,它包含當前日期和時間。之后,您更新除毫秒之外的所有字段。如您所見,所有輸出中只有最后 3 個數字不同,這是執行時間的毫秒數。



查看完整回答
反對 回復 2023-03-31
?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

java.time

    ZoneId zone = ZoneId.of("Europe/Brussels");

    ZonedDateTime start2018 = LocalDate.of(2018, Month.JANUARY, 1).atStartOfDay(zone);

    Instant asInstant = start2018.toInstant();

    System.out.println(asInstant.toEpochMilli());

這始終提供以下輸出:


1514761200000


如果不是歐洲/布魯塞爾,請替換您想要的時區。


格式化輸出:


    DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");

    System.out.println(start2018.format(formatter));

2018/01/01 00:00:00


您使用的日期和時間類 — SimpleDateFormat、Calendar和GregorianCalendar—Date都設計不佳且早已過時。SimpleDateFormat特別是出了名的麻煩,但在這種情況下,正是糟糕的設計Calendar給了你意想不到的結果。其他答案已經解釋了如何,我就不用重復了。我建議您使用現代 Java 日期和時間 API java.time,而不是舊類。與它一起工作要好得多。


查看完整回答
反對 回復 2023-03-31
?
MYYA

TA貢獻1868條經驗 獲得超4個贊

在時間戳中,最后 3 位數字代表毫秒。在這里,您明確設置了日期和時間,但沒有設置毫秒。這就是你面對這個的原因。為避免這種情況,您可以將其添加到您的代碼中:

calendar.set(Calendar.MILLISECOND, 0);


查看完整回答
反對 回復 2023-03-31
?
Helenr

TA貢獻1780條經驗 獲得超4個贊

我假設您正在示例中的循環中實例化所有內容?


如果是這樣,則您沒有設置毫秒差異,因此它們在循環的每次迭代中都會發生變化(但略有變化)。


為避免這種情況,您可以設置毫秒數,或在循環外進行實例化:


SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

Calendar calendar = new GregorianCalendar();

calendar.set(2018, 0, 1, 0, 0, 0);

for (int i = 0; i < 5; i++) {

     System.out.println(sdf.format(calendar.getTime()));

     Date date = calendar.getTime();

     System.out.println(sdf.format(date));

     System.out.println(date.getTime());

}

這將產生:

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128

2018/01/01 00:00:00

2018/01/01 00:00:00

1514764800128


查看完整回答
反對 回復 2023-03-31
  • 4 回答
  • 0 關注
  • 236 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號