比较在两台不同机器上调用 System.nanoTime() 产生的两个值是否正确?我会说不,因为 System.nanoTime() 通过使用依赖于处理器的时间戳计数器 (TSC)返回相对于某个任意点时间的纳秒级精确时间。
如果我是对的,有没有办法(在 Java 中)在两台不同的机器上捕获瞬间并(安全地)以至少微秒精度甚至纳秒精度比较这些值?
System.currentTimeMillis() 不是解决方案,因为它没有返回线性增加的时间戳数。用户或NTP等服务可以随时更改系统时钟,时间会前后跳跃。
我需要测量 Android 上的长时间运行时间,并且可能会在两者之间重新启动设备。
据我所知,System.nanoTime()每次设备重新启动时都会重置,并且System.currentTimeMillis()不可靠,因为用户可以更改它。
我想出的唯一解决方案是听ACTION_SHUTDOWNand BOOT_COMPLETED,用于System.currentTimeMillisec()计算经过的时间(用户无法在设备关闭时更改时钟时间,希望 :) )并将其添加到System.nanoTime()我关闭之前的最后一次。
老实说,我不喜欢这个解决方案,因为它非常昂贵(我需要收听 2 个广播事件)并且不准确,但我想不出任何其他方法来做到这一点。
有任何想法吗?本地解决方案对我也有好处。
Linux 内核提供了两个套接字选项来检索传入网络数据包的软件时间戳:SO_TIMESTAMP和SO_TIMESTAMPING带SOF_TIMESTAMPING_RX_SOFTWARE | SOF_TIMESTAMPING_SOFTWARE标志。文档对它们的描述如下:
SO_TIMESTAMP以(不一定是单调的)系统时间为每个传入数据包生成时间戳。
SO_TIMESTAMPING数据进入内核时请求 rx 时间戳。这些时间戳是在设备驱动程序将数据包传递给内核接收堆栈后生成的。
据我了解,它们并不相同,因为文档说:
请注意,如果使用 SOF_TIMESTAMPING_SOFTWARE 与 SO_TIMESTAMPING 一起启用 SO_TIMESTAMP 或 SO_TIMESTAMPNS 选项,则当真实软件时间戳丢失时,将在 recvmsg() 调用中生成错误的软件时间戳并在 ts[0] 中传递。
我的问题是,这两种时间戳类型真的不同吗?如果是这样,有什么区别?
我也想知道系统时间在这里意味着什么?clock_gettime这与提供的时间源相同吗CLOCK_REALTIME?
在Vala中使用此库:
http://valadoc.org/#!api=glib-2.0/GLib.DateTime
GLib.DateTime now = new GLib.DateTime.now_local();
var sec = now.to_unix()
var msec = (sec * 1000) + now.get_microsecond();
Run Code Online (Sandbox Code Playgroud)
这是以毫秒为单位获取当前时间的正确方法吗?
有没有更好的办法 ?
我只是通过跟随有关Udemy的教程视频开始学习Go的,我尝试按如下方式打印当前时间
import (
"fmt"
"time"
)
func main(){
t := time.Now()
fmt.Println(t)
}
Run Code Online (Sandbox Code Playgroud)
我得到一个很长的文本作为输出如下
2018-07-04 12:03:07.2911671 +0800 +08 m=+0.002000201
Run Code Online (Sandbox Code Playgroud)
我原本只希望在+0800后面加上a timeZone,那应该是结尾。预期的输出如下所示,也如本教程视频中所示。但是对我来说,结果的形式要长得多。
2018-07-04 12:03:07.2911671 +0530 IST
Run Code Online (Sandbox Code Playgroud)
问题是,为什么同一个命令date.Now()在教师的程序和我的程序之间返回不同的格式?为什么没有设置特定格式,不应该standardize/base返回格式?
android ×1
elapsedtime ×1
go ×1
java ×1
linux ×1
linux-kernel ×1
nanotime ×1
networking ×1
reboot ×1
sockets ×1
time ×1
vala ×1