【发布时间】:2019-09-12 06:58:28
【问题描述】:
我正在尝试解析 .ndx 文件。其中包含一个 64 位值,表示自 1601 年 1 月 1 日 (UTC) 以来的 100 纳秒间隔数。 这是python中的实现:https://github.com/mekh/jtv2xmltv/blob/master/jtv2xml.py#L31
package main
import (
"fmt"
"time"
)
func main() {
var timestamp int64
timestamp = 132118740000000000
delta := time.Duration(timestamp)*time.Microsecond
fmt.Println(delta)
seconds, _ := divmod(timestamp, 1000000)
hours, seconds := divmod(seconds, 3600)
delta = time.Duration(hours)*time.Hour
fmt.Println(delta)
layout := "2006-01-02"
start, _ := time.Parse(layout, "1601-01-01")
fmt.Println(start.Add(delta))
}
func divmod(numerator, denominator int64) (quotient, remainder int64) {
quotient = numerator / denominator // integer division, decimals are truncated
remainder = numerator % denominator
return
}
https://play.golang.org/p/--zQUtJN5Lh
看起来像 delta 变量溢出,即使按小时设置也是如此。有什么方法可以计算吗?
编辑:见文档https://golang.org/pkg/time/#Duration
Duration 表示两个瞬间之间经过的时间,以 int64 纳秒计数。该表示将最大可表示持续时间限制为大约 290 年。
是否有任何持续时间超过 290 年的第三方包?
EDIT2:最后我需要时间。给定时间戳的时间
【问题讨论】:
-
对第三方包的请求在这里是题外话。
-
但一个简单的解决方案可能是存储一个
time.Duration,以及一个乘数。例如,如果您需要 3,000 年的期限,则可以存储 30 年的time.Duration和 10 倍的乘数。在其他情况下,如果您只关心年数,那么简单的int就可以工作。是否适合您取决于您对持续时间变量执行的操作。 -
正如您所引用的,
time.Duration不能代表大于 290 年的持续时间。那你想要什么?自给定时间戳的1601-01-01以来的小时、分钟、秒的值;或代表该时间戳的time.Time值还是什么?请澄清您的问题。 -
顺便说一句,您的示例时间戳看起来“很短”,它指定了 1642 年。如果您在其中添加 0:
132118740000000000,那么它将是2019-09-02。