问题内容
我正在尝试使用 Go 将时间戳从本地 Chrome sqlite 数据库转换为本地时间。我知道这些时间戳是从 1601/01/01 开始的微秒。
检查我在此 Chrome 时间戳转换网站上的以下程序中获取的 lastVisitTime
的值,我似乎正在从数据库中正确检索它们。
package main
import (
"database/sql"
"fmt"
"time"
_ "github.com/mattn/go-sqlite3"
"github.com/local_library/comp"
)
var (
dbPath = comp.Expanduser("~/Library/Application Support/Google/Chrome/Default/History")
chromeEpochStart = time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC)
)
const (
driverName = "sqlite3"
tmpPath = "/tmp/History"
query = `
SELECT
last_visit_time
FROM
urls
ORDER BY
last_visit_time DESC
LIMIT 5
`
)
func main() {
// Copy to tmp to unlock
err := comp.Copy(dbPath, tmpPath)
comp.MustBeNil(err)
db, err := sql.Open(driverName, tmpPath)
comp.MustBeNil(err)
rows, err := db.Query(query)
comp.MustBeNil(err)
for rows.Next() {
var lastVisitTime int64
rows.Scan(&lastVisitTime)
d := time.Duration(time.Microsecond * time.Duration(lastVisitTime))
t := chromeEpochStart.Add(d)
fmt.Println(t, lastVisitTime)
}
err = rows.Close()
comp.MustBeNil(err)
err = rows.Err()
comp.MustBeNil(err)
}
但由于某种原因,我的 .Add(d)
将时间设置为 1601 之前,这是我以前从未见过的。
1439-07-05 20:00:21.462742384 +0000 UTC 13350512095172294
1439-07-05 19:58:20.377916384 +0000 UTC 13350511974087468
1439-07-05 19:57:58.539932384 +0000 UTC 13350511952249484
1439-07-05 19:57:48.539540384 +0000 UTC 13350511942249092
1439-07-05 19:52:09.587445384 +0000 UTC 13350511603296997
这里发生了什么,更重要的是,我该如何正确执行此操作?
正确答案
感谢 Peter 的评论指出了我原始代码中的溢出,我找到了一种不同的方法。
如果将 Chrome 开始日期转换为 UnixMicro()
,则会得到与常规纪元时间的负偏移量:
chromeMicroOffset := time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC).UnixMicro()
fmt.Println(chromeMicroOffset)
-11644473600000000
将这些添加到数据库值中,并在 time.Unix()
中将它们转换为纳秒,即可获得正确的 UTC 时间:
microFromEpoch := chromeMicroOffset + lastVisitTime
t := time.Unix(0, microFromEpoch*1000)
转换为太平洋时间的完整示例:
package main
import (
"fmt"
"time"
)
var (
chromeMicroOffset = time.Date(1601, 1, 1, 0, 0, 0, 0, time.UTC).UnixMicro()
)
func main() {
chromeTimestamp := int64(13350516239099543)
microFromEpoch := chromeMicroOffset + chromeTimestamp
t := time.Unix(0, microFromEpoch*1000)
loc, err := time.LoadLocation("America/Los_Angeles")
if err != nil {
panic(err)
}
fmt.Println(t.In(loc))
}
2024-01-23 12:43:59.099543 -0800 PST
以上就是在 Go 中转换 Chrome 时间戳的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
软考中级精品资料免费领
- 历年真题答案解析
- 备考技巧名师总结
- 高频考点精准押题
- 资料下载
- 历年真题
193.9 KB下载数265
191.63 KB下载数245
143.91 KB下载数1148
183.71 KB下载数642
644.84 KB下载数2756
相关文章
发现更多好内容- Java 探针技术原理究竟是什么?(java探针技术原理是什么)
- 如何在 Java 中高效且准确地使用 resolve 方法?(如何在java中正确使用resolve方法)
- Java 编码中 GBK 的不可映射问题该如何解决?(java编码GBK的不可映射怎么解决)
- Java 中的求余运算符在处理大数时需要注意哪些方面?(Java的求余运算符在处理大数时应注意哪些问题)
- Java 中访问者模式的实现方法有哪些?(访问者模式在Java中的实现方法有哪些)
- 如何有效管理 java 多线程任务的生命周期?(如何管理java多线程任务的生命周期)
- Java 构造函数的作用究竟是什么?(java构造函数的作用是什么)
- 如何确定 Java 临时变量的类型和值?(Java临时变量的类型和值如何确定)
- Java 线程池常见问题及应对措施有哪些?(java线程池会出现的问题有哪些)
- 如何使用 redis 可视化工具的数据分析功能?(redis可视化工具的数据分析功能如何)
猜你喜欢
AI推送时光机在 Go 中转换 Chrome 时间戳
后端开发2024-02-06
Java中时间戳转换为时间
后端开发2023-08-24
MySQL 中时间戳及时间戳的格式转换
后端开发2023-08-16
MySql中时间戳的转换
后端开发2023-09-26
golang 转换时间戳
后端开发2023-05-15
怎么在PHP中将时间戳转换为公元时间
后端开发2023-07-05
如何在PHP中将时间戳转换为公元时间
后端开发2023-05-14
如何在python中将datetime转换为时间戳
后端开发2023-06-14
mysql时间如何转换时间戳
后端开发2024-04-02
如何将php时间戳转换为js时间戳
后端开发2023-07-05
怎么将php时间戳转换为js时间戳
后端开发2023-05-14
php中怎么将时间转换为时间戳
后端开发2023-06-20
PHP中怎么将时间转换成时间戳
后端开发2023-07-05
MySQL数据库中时间戳及时间戳的格式转换
后端开发2023-09-20
怎么将JS时间戳转换为PHP时间戳
后端开发2023-07-05
php中的时间戳如何转换成时间
后端开发2023-07-04
php中的时间戳怎么转换成时间
后端开发2023-05-14
Java中实现时间与时间戳的转换
后端开发2023-09-30
Python时间戳转换为字符串与字符串转换为时间戳
后端开发2023-02-15
如何在 PHP 中将日期转换为时间戳
后端开发2024-02-27
咦!没有更多了?去看看其它编程学习网 内容吧