首页 > 解决方案 > Int96Value 到日期字符串

问题描述

读取镶木地板文件(使用 Scala)时,我将时间戳字段读取为:

Int96Value{Binary{12 constant bytes, [0, 44, 84, 119, 54, 49, 0, 0, -62, -127, 37, 0]}}

如何将其转换为日期字符串?

标签: scaladatetimeparquet

解决方案


我为你做了一些研究。Int96格式非常具体,似乎已被弃用。

这是关于转换Int96Date.

基于此,我创建了以下代码:

  def main(args: Array[String]): Unit = {
    import java.util.Date
    import org.apache.parquet.example.data.simple.{Int96Value, NanoTime}
    import org.apache.parquet.io.api.Binary

    val int96Value = new Int96Value(Binary.fromConstantByteArray(Array(0, 44, 84, 119, 54, 49, 0, 0, -62, -127, 37, 0)))
    val nanoTime = NanoTime.fromInt96(int96Value)
    val nanosecondsSinceUnixEpoch = (nanoTime.getJulianDay - 2440588) * (86400 * 1000 * 1000 * 1000) + nanoTime.getTimeOfDayNanos
    val date = new Date(nanosecondsSinceUnixEpoch / (1000 * 1000))
    println(date)
  }

但是,它打印Sun Sep 27 17:05:55 CEST 2093. 我不确定,如果这是您所期望的日期。

编辑:Instance按照建议使用:

val nanosInSecond = 1000 * 1000 * 1000;
val instant = Instant.ofEpochSecond(nanosecondsSinceUnixEpoch / nanosInSecond, nanosecondsSinceUnixEpoch % nanosInSecond)
println(instant) // prints 2093-09-27T15:05:55.933865216Z

推荐阅读