>백엔드 개발 >Golang >int96 Parquet 타임스탬프를 Go의 time.Time으로 변환하는 방법?

int96 Parquet 타임스탬프를 Go의 time.Time으로 변환하는 방법?

Patricia Arquette
Patricia Arquette원래의
2024-12-31 21:57:10856검색

How to Convert an int96 Parquet Timestamp to Go's time.Time?

Parquet에서 Go로 int96 타임스탬프 캐스팅

소개

Parquet 파일에 저장된 타임스탬프를 사용하여 작업할 때 int96으로 표시되는 데이터를 접하는 것이 일반적입니다. 데이터 유형. 이 12바이트 형식은 타임스탬프와 날짜 부분으로 구성됩니다. Go에서 이 int96 타임스탬프를 타임스탬프로 변환하는 방법을 이해하는 것은 데이터 조작 및 분석에 매우 중요합니다.

int96 타임스탬프 디코딩

int96 타임스탬프를 디코딩하는 열쇠는 구조를 인식하는 데 있습니다. 처음 8바이트는 타임스탬프를 나노초로 나타내지만 역바이트 순서로 저장됩니다.

time_nano = ReverseBytes((timestamp[0:8]))

나머지 4바이트는 날짜를 율리우스력 일수로 나타냅니다.

julian_day = ReverseBytes((timestamp[8:12]))

예 계산

다음 int96 타임스탬프를 고려하세요: [128, 76, 69, 116, 64, 7, 0, 0, 48, 131, 37, 0].

  • 시간(나노초): 처음 8바이트를 반전하면 0x60FD4B3229000059682500이 되며, 이는 다음에 해당합니다. 45296초 (예: 12시간 34분 56초).
  • 날짜(율리우스력 일수): 마지막 4바이트를 반전하면 율리우스력력 2451545에 해당하는 0x00256859가 제공됩니다. 2000-01-01.

Golang 코드 구현

다음은 디코딩 프로세스를 보여주는 Go 코드 조각입니다.

package main

import (
    "fmt"
    "math"
)

func main() {
    // Sample int96 timestamp
    timestamp := []byte{128, 76, 69, 116, 64, 7, 0, 0, 48, 131, 37, 0}

    // Reverse the first 8 bytes for time (nanoseconds)
    timeNano := reverseBytes(timestamp[0:8])

    // Reverse the last 4 bytes for date (Julian day number)
    julianDay := reverseBytes(timestamp[8:12])

    // Convert timestamp nanoseconds to seconds
    seconds := float64(timeNano) / math.Pow(10, 9)

    // Calculate the timestamp
    t := time.Unix(int64(seconds), 0)

    // Create a new time object with date set from Julian day number
    t = t.AddDate(int(julianDay/365.25-2440587.5), 0, int(julianDay%365.25))

    fmt.Println(t)
}

func reverseBytes(bytes []byte) uint64 {
    var result uint64
    for _, v := range bytes {
        result = result << 8 | uint64(v)
    }
    return result
}

위 내용은 int96 Parquet 타임스탬프를 Go의 time.Time으로 변환하는 방법?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.