为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 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 关注
  • 159 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信