【问题标题】:Modifying the date and time values using SYSTEMTIME, FILETIME, and ULARGE_INTEGER使用 SYSTEMTIME、FILETIME 和 ULARGE_INTEGER 修改日期和时间值
【发布时间】:2011-07-04 08:31:44
【问题描述】:

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

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

提前感谢您的帮助。

【问题讨论】:

    标签: c++ windows systemtime filetime


    【解决方案1】:

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

    ULARGE_INTEGER 结构是一个带有 QuadPart 成员的联合,这是一个 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;
     }
    

    【讨论】:

    • 所以如果我想用 Minutes 而不是 seconds 我必须将公式从 100*1.e-9 更改为 100*60.e-9?
    • 你可以这样做。您也可以调用SYSTEMTIME s2 = add( s1, 60*minutes ) 之类的函数,这样可以使函数更具可重用性。
    • @xtofl 我在 u.QuadPart += seconds / c_dSecondsPer100nsInterval 上收到编译器警告,可能会丢失数据
    • @Peter:这可能是由于截断; __int64 i = (double) 1.; 也会出现同样的警告。编译器正确地警告您将失去精度;实际上,我应该明确地舍入或截断 100 ns 间隔的数量。
    • 不使用 memcpy 是否可以这样做u.LowPart=f.dwLowDateTime; u.HighPart=f.dwHighDateTime;?
    猜你喜欢
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多