winapi - Windows SYSTEMTIME 结构与系统时钟不同吗?

标签 winapi time rust

以下代码的目标是调用 Win32 函数 FileTimeToSystemTime:

pub fn convert_times(s: SystemTime) -> Option<SYSTEMTIME> {
    let mut st = SYSTEMTIME::default();
    let x: u64 = unsafe { transmute(s) };
    let low = (x & 0x00000000FFFFFFFF) as u32;
    let high = ((x & 0xFFFFFFFF00000000) >> 32) as u32;
    let fs = FILETIME {
        dwLowDateTime: low,
        dwHighDateTime: high,
    };
    if unsafe { FileTimeToSystemTime(transmute(&fs), transmute(&mut st)) } > 0 {
        Some(st)
    } else {
        None
    }
}

当我使用已知文件时间 131147233180069965 时,它是根据我计算机的时钟在 2016-08-03T14:41 US-EST(GMT+5) 生成的。我从中得到的返回结构返回 2016-0803T18:41:58.006

这是 +4 小时。

美国东部标准时间是 GMT+5?

是因为夏令时是-1小时吗?

最佳答案

FileTimeToLocalFileTime() 返回 UTC 时间。在美国,通常在 EST 的位置在夏令时期间转换为 EDT,因此它将是 GMT+5 DST-1 或 UTC-4。

要获取本地时区的时间并考虑夏令时,需要调用 SystemTimeToTzSpecificLocalTime()

通常这是不可取的,因为在 UTC 中工作对计算机来说更可取,因为 2 台相互通信的计算机不一定在同一时区。

关于winapi - Windows SYSTEMTIME 结构与系统时钟不同吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38751677/

相关文章:

c++ - 如何获取 GDI 句柄列表

c++ - 如何使用 OpenGL 在 Windows 上的同一个应用程序中绘制两个单独的 3D 窗口?

c++ - linux上g++9.3.0 -O2的一个奇怪bug

rust - 可变地借用一个结构字段,同时在闭包中借用另一个

rust - 我可以在循环中使用 itertools::PutBack::put_back 吗?

c# - 如何以 CLR "friendly"方式获取_real_ 线程 ID?

c++ - 转换内存位置以获取字符串

PHP/MySQL : Preventing duplicate actions quickly in succession

mysql - 在服务器上转换时间戳在 PHP 和 MySQL 中给出不同的结果

rust - 如何为 Cargo 设置默认构建目标?