首頁 > 後端開發 > Golang > 如何將 int96 Parquet 時間戳記轉換為 Go 的 time.Time?

如何將 int96 Parquet 時間戳記轉換為 Go 的 time.Time?

Patricia Arquette
發布: 2024-12-31 21:57:10
原創
831 人瀏覽過

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

將int96 時間戳從Parquet 轉換為Go

簡介

使用儲存在parquet 檔案中的時間戳時,通常會遇到表示為int96 的資料資料型態。此 12 位元組格式由時間戳記和日期部分組成。了解如何將這個 int96 時間戳轉換為 Go 中的時間戳對於資料操作和分析至關重要。

解碼 int96 時間戳記

解碼 int96 時間戳記的關鍵在於辨識其結構。前八個位元組表示以奈秒為單位的時間戳,但以相反的位元組順序儲存。

time_nano = ReverseBytes((timestamp[0:8]))
登入後複製

其餘四個位元組表示以儒略日數表示的日期。

julian_day = ReverseBytes((timestamp[8:12]))
登入後複製

範例計算

考慮以下 int96 時間戳記:[128, 76, 69, 116, 64, 7, 0, 0, 48, 131, 37, 0].

  • 時間(奈秒):反轉前八個位元組給出0x60FD4B3229000059682500,對應45296 秒(IE, 12 小時 34 分鐘,56 秒) 。
  • 日期(儒略日數):反轉最後四個位元組得到0x00256859,對應於儒略日數2451545,等於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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板