c++ - 使用 SYSTEMTIME、FILETIME 和 ULARGE_INTEGER 修改日期和时间值

标签 c++ windows systemtime filetime

我正在使用 Visual Studio 2005 在 C++ 中制作一个程序,它需要在一组图像上创建一个带有时间的水印。

这些图像取自以特定时间间隔处理的视频。我想做的是通过 SYSTEMTIME 修改每个图像上的时间。我查看了 MSDN,它说不要修改 SYSTEMTIME 本身的值,而是将其转换为 FILETIME,然后再转换为 ULARGE_INTEGER。我的问题是 ULARGE_INTEGER 是如何拆分的? HighPart 是日期,Low Part 是时间吗?如果是这样,我该如何考虑翻转?就像一张图片在 2/25/2011 晚上 11:58 出现并持续到 2/26/2011 12:11?当我将其转换回 SYSTEMTIME 变量时,是否会自动考虑并显示仅添加指定值?

预先感谢您的帮助。

最佳答案

他们建议将 SYSTEMTIME 转换为 FILETIME,这是一个纪元以来的滴答数。然后,您可以添加所需数量的“滴答”(即 100ns 间隔)以指示您的时间,并转换回SYSTEMTIME

ULARGE_INTEGER 结构是一个包含 QuadPart 成员的 union ,它是一个 64 位数字,可以直接添加到(在最近的硬件上)。

SYSTEMTIME add( SYSTEMTIME s, double seconds ) {

    FILETIME f;
    SystemTimeToFileTime( &s, &f );

    ULARGE_INTEGER u  ; 
    memcpy( &u  , &f , sizeof( u ) );

    const double c_dSecondsPer100nsInterval = 100.*1.e-9;
    const double c_dNumberOf100nsIntervals = 
                    seconds / c_dSecondsPer100nsInterval;

    // note: you may want to round the number of intervals.
    u.QuadPart += c_dNumberOf100nsIntervals;

    memcpy( &f, &u, sizeof( f ) );

    FileTimeToSystemTime( &f, &s );
    return s;
 }

关于c++ - 使用 SYSTEMTIME、FILETIME 和 ULARGE_INTEGER 修改日期和时间值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5118411/

相关文章:

java - 通过SimpleDateFormat解析系统时间报错

c++ - 在 MFC 对话框应用程序中检查系统时间 24/7

c# - 通过注册表卸载软件

android - 更改 Android 系统时钟会停止计时器。我怎样才能重新启动它们?

c++ - LMAX 的干扰模式 : is there a port to C++?

c++ - 通用项目的 Qt Creator c++11 语法突出显示

windows - 关于使用 subst 创建虚拟驱动器

c++ - 跨平台UTF-8 char文件数据编码/解码

c++ - 使用标准 C++ fstream 在串行设备 (/dev/ttyGS0) 上读写?

c++ - 广度优先搜索找不到正确的路径