Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala Int96Value to Date字符串_Scala_Datetime_Parquet - Fatal编程技术网

Scala Int96Value to Date字符串

Scala Int96Value to Date字符串,scala,datetime,parquet,Scala,Datetime,Parquet,读取拼花地板文件(使用Scala)时,我将时间戳字段读回如下: Int96Value{Binary{12 constant bytes, [0, 44, 84, 119, 54, 49, 0, 0, -62, -127, 37, 0]}} 如何将其转换为日期字符串?我为您做了一些研究。Int96格式非常具体,似乎已被弃用 下面是一个关于将Int96转换为Date的示例 基于此,我创建了以下代码: def main(args: Array[String]): Unit = { imp

读取拼花地板文件(使用Scala)时,我将时间戳字段读回如下:

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

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

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

下面是一个关于将
Int96
转换为
Date
的示例

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

  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
。我不确定,如果这是一个日期,你期望的

编辑:按照建议使用
实例

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

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

下面是一个关于将
Int96
转换为
Date
的示例

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

  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
。我不确定,如果这是一个日期,你期望的

编辑:按照建议使用
实例

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

time支持朱利安日

感谢ygor进行了研究,并找到了如何解释数组的12个字节

    byte[] int96Bytes = { 0, 44, 84, 119, 54, 49, 0, 0, -62, -127, 37, 0 };

    // Find Julian day
    int julianDay = 0;
    int index = int96Bytes.length;
    while (index > 8) {
        index--;
        julianDay <<= 8;
        julianDay += int96Bytes[index] & 0xFF;
    }

    // Find nanos since midday (since Julian days start at midday)
    long nanos = 0;
    // Continue from the index we got to
    while (index > 0) {
        index--;
        nanos <<= 8;
        nanos += int96Bytes[index] & 0xFF;
    }

    LocalDateTime timestamp = LocalDate.MIN
            .with(JulianFields.JULIAN_DAY, julianDay)
            .atTime(LocalTime.NOON)
            .plusNanos(nanos);
    System.out.println("Timestamp: " + timestamp);
byte[]int96Bytes={0,44,84,119,54,49,0,0,-62,-127,37,0};
//寻找朱利安日
int-julianDay=0;
int index=int96Bytes.length;
而(指数>8){
索引--;

julianDayjava.time支持朱利安日

感谢ygor进行了研究,并找到了如何解释数组的12个字节

    byte[] int96Bytes = { 0, 44, 84, 119, 54, 49, 0, 0, -62, -127, 37, 0 };

    // Find Julian day
    int julianDay = 0;
    int index = int96Bytes.length;
    while (index > 8) {
        index--;
        julianDay <<= 8;
        julianDay += int96Bytes[index] & 0xFF;
    }

    // Find nanos since midday (since Julian days start at midday)
    long nanos = 0;
    // Continue from the index we got to
    while (index > 0) {
        index--;
        nanos <<= 8;
        nanos += int96Bytes[index] & 0xFF;
    }

    LocalDateTime timestamp = LocalDate.MIN
            .with(JulianFields.JULIAN_DAY, julianDay)
            .atTime(LocalTime.NOON)
            .plusNanos(nanos);
    System.out.println("Timestamp: " + timestamp);
byte[]int96Bytes={0,44,84,119,54,49,0,0,-62,-127,37,0};
//寻找朱利安日
int-julianDay=0;
int index=int96Bytes.length;
而(指数>8){
索引--;

朱丽安黛,请注意你在问题上的标记。你吸引专家来回答一个关于拼花地板的问题没有意义。你用来阅读拼花地板文件的库是什么?@JoeC我将它标记为Java,因为我对Java解决方案也很满意。尽管你的观点非常有效,我应该在问题中对此进行澄清。@MahmoudHanafy我正在使用parquet avro版本1.9.0来阅读该文件。对于Go来说,类似的问题是:请注意您在问题上的标记。没有必要吸引专家来回答一个问题。您用来阅读parquet文件的库是什么?@JoeC我将其标记为Java,因为我对Java解决方案也很满意。尽管如此你的观点非常正确,我应该在问题中澄清这一点。@MahmoudHanafy我使用的是parquet avro 1.9.0版来阅读该文件。类似于Go的问题:你应该更喜欢创建一个现代版,而不是过时的
Date
。后一个类有设计问题,使用起来更好。并且具有纳秒精度,BTW.你应该更喜欢创建一个过时的超现代
日期
。后一个类有设计问题,使用起来更好。顺便说一句,还有纳秒精度。这就是我最终使用的。这就是我最终使用的。