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

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

如何在 Java 8(Scala)中將日期時間字符串轉換為長(UNIX 紀元時間)毫秒

如何在 Java 8(Scala)中將日期時間字符串轉換為長(UNIX 紀元時間)毫秒

HUH函數 2022-08-03 16:04:24
這個問題解決了秒的情況:如何在Java 8(Scala)中將日期時間字符串轉換為長(UNIX Epoch Time)但是,如果我想要毫秒,似乎我必須使用def dateTimeStringToEpoch(s: String, pattern: String): Long =      LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))       .atZone(ZoneId.ofOffset("UTC", ZoneOffset.ofHours(0)))       .toInstant().toEpochMilli對于我在另一個問題中詳細介紹的4個問題來說,這是丑陋的(我不喜歡的主要東西是魔術字面和魔術數字)。"UTC"0不幸的是,以下內容無法編譯def dateTimeStringToEpoch(s: String, pattern: String): Long =       LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))                   .toEpochMilliSecond(ZoneOffset.UTC)因為不存在toEpochMilliSecond
查看完整描述

3 回答

?
小怪獸愛吃肉

TA貢獻1852條經驗 獲得超1個贊

你能不能使用 LocalDateTime#atOffset 和 ZoneOffset#UTC?

LocalDateTime.parse(s, dateTimeFormatter).atOffset(ZoneOffset.UTC).toInstant().toEpochMilli()

正如@Andreas在注釋中指出的那樣,is-a ,因此您可以使用ZoneOffsetZoneId

def dateTimeStringToEpoch(s: String, pattern: String): Long = 
    LocalDateTime.parse(s, DateTimeFormatter.ofPattern(pattern))
      .atZone(ZoneOffset.UTC)
      .toInstant()
      .toEpochMilli()


查看完整回答
反對 回復 2022-08-03
?
三國紛爭

TA貢獻1804條經驗 獲得超7個贊

您可以更改此答案以返回 epoch millis,例如


static long dateTimeStringToEpoch(String s, String pattern) {

    return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)

        .parse(s, Instant::from).toEpochMilli();

}

或者,如果您甚至想避免臨時施工:Instant


static long dateTimeStringToEpoch(String s, String pattern) {

    return DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)

        .parse(s, ta -> ta.getLong(ChronoField.INSTANT_SECONDS)*1000

                       +ta.get(ChronoField.MILLI_OF_SECOND));

}

請注意,兩者在這里都是可重用的組件,例如,您可以DateTimeFormatter.ofPattern(pattern).withZone(ZoneOffset.UTC)ta -> ta.getLong(ChronoField.INSTANT_SECONDS)*1000+ta.get(ChronoField.MILLI_OF_SECOND)


static final DateTimeFormatter MY_PATTERN

    = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm").withZone(ZoneOffset.UTC);

static final TemporalQuery<Long> EPOCH_MILLIS

    = ta -> ta.getLong(ChronoField.INSTANT_SECONDS)*1000+ta.get(ChronoField.MILLI_OF_SECOND);


long millis = MY_PATTERN.parse("2018-07-21 18:30", EPOCH_MILLIS);

問題是,您希望在應用程序中出現多少個不同的格式字符串。通常,它不會像您必須解析的格式化日期那樣頻繁地更改。創建從格式字符串到預準備的緩存映射可能會有所幫助。無論如何,lambda 表達式是單例。DateTimeFormatter


查看完整回答
反對 回復 2022-08-03
?
墨色風雨

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

在使用 UNIX Epoch 時,我建議使用它為紀元表示而設計的,并且默認會考慮,因為它是標準的一部分。java.time.InstantUTC


import java.time.Instant


object InstantFormat extends App {


  //Instant.parse uses DateTimeFormatter.ISO_INSTANT

  println(Instant.parse("2019-03-12T15:15:13.147Z"))

  println(Instant.parse("2019-03-12T15:15:13Z"))

  println(Instant.parse("2019-03-12T15:15:13Z").toEpochMilli)

  println(Instant.parse("2019-03-12T15:15:13Z").getEpochSecond)

  println(Instant.ofEpochMilli(1552403713147L))

  println(Instant.ofEpochSecond(1552403713L))

}

輸出


2019-03-12T15:15:13.147Z

2019-03-12T15:15:13Z

1552403713000

1552403713

2019-03-12T15:15:13.147Z

2019-03-12T15:15:13Z


查看完整回答
反對 回復 2022-08-03
  • 3 回答
  • 0 關注
  • 192 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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