Scala Int96Value to Date字符串
读取拼花地板文件(使用Scala)时,我将时间戳字段读回如下: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
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.你应该更喜欢创建一个过时的超现代日期
。后一个类有设计问题,使用起来更好。顺便说一句,还有纳秒精度。这就是我最终使用的。这就是我最终使用的。