Rumah > pembangunan bahagian belakang > Golang > Bagaimana untuk Menukar Cap Masa Parket int96 kepada time.Time Go?

Bagaimana untuk Menukar Cap Masa Parket int96 kepada time.Time Go?

Patricia Arquette
Lepaskan: 2024-12-31 21:57:10
asal
832 orang telah melayarinya

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

Mengirim cap masa int96 daripada Parket ke Pergi

Pengenalan

Apabila bekerja dengan cap masa yang disimpan dalam fail parket, adalah perkara biasa untuk menemui data yang diwakili sebagai int96 jenis data. Format 12-bait ini terdiri daripada cap masa dan bahagian tarikh. Memahami cara menghantar cap waktu int96 ini kepada cap masa dalam Go adalah penting untuk manipulasi dan analisis data.

Menyahkod cap masa int96

Kunci untuk menyahkod cap waktu int96 terletak pada mengenali strukturnya. Lapan bait pertama mewakili cap masa sebagai nanosaat, tetapi disimpan dalam susunan bait terbalik.

time_nano = ReverseBytes((timestamp[0:8]))
Salin selepas log masuk

Empat bait yang selebihnya mewakili tarikh sebagai nombor hari Julian.

julian_day = ReverseBytes((timestamp[8:12]))
Salin selepas log masuk

Contoh Pengiraan

Pertimbangkan cap masa int96 berikut: [128, 76, 69, 116, 64, 7, 0, 0, 48, 131, 37, 0].

  • Masa (nanosaat): Membalikkan lapan bait pertama menghasilkan 0x60FD4B322900050,680050 sepadan dengan 45296 saat (iaitu, 12 jam, 34 minit, 56 saat).
  • Tarikh (nombor hari Julian): Membalikkan empat bait terakhir memberikan 0x00256859, sepadan dengan nombor hari Julian 2451545, yang sama dengan 2000-01-01.

Pelaksanaan Kod Golang

Berikut ialah coretan kod Go yang menunjukkan proses penyahkodan:

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
}
Salin selepas log masuk

Atas ialah kandungan terperinci Bagaimana untuk Menukar Cap Masa Parket int96 kepada time.Time Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan