首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >FILETIME的DateTime内部表示

FILETIME的DateTime内部表示
EN

Code Review用户
提问于 2014-08-30 15:39:46
回答 2查看 878关注 0票数 5

下面是我为将Server的内部DateTime表示(BINARY(8))转换为FILETIME而设置的例程。我知道SQL DateTime (在GetDate()中)是不精确的,并且将与SystemTimeAsFileTime不同。但是它应该是毫秒的,但是是秒的,对吗?

无论如何,这是我的例行公事,我想知道是否有人看到了它的缺陷:

代码语言:javascript
复制
int SQLDateTimeToFileTime(PULARGE_INTEGER t_sql, PULARGE_INTEGER t_ft)
{
    ULONGLONG days = t_sql->LowPart;
    ULONGLONG ticks = t_sql->HighPart;
    days += (ULONGLONG) 109207;         // 01/01/1900 - 01/01/1601
    days *= (ULONGLONG) 864000000000;   // (FT_SECONDS_PER_DAY * FT_SECOND);
    ticks *= (ULONGLONG) 33333333333;   // MS per tick (3.33...) * 10000);
    ticks /= (ULONGLONG) 1000000;       // to avoid floating point operation
    days += ticks;
    t_ft->QuadPart = days;
    return(0);
}
EN

回答 2

Code Review用户

发布于 2014-08-30 17:44:31

  • 这个函数总是返回0,但是您还没有说明为什么这对这种使用很重要(如果它是有意的)。由于它也不返回1或另一个失败的非0值,所以我假设它没有返回错误代码。否则,它应该返回void,然后删除return 0
  • 由于这也是用c++标记的,所以我还将提供@chux回答中给出的常数的C++等效值: constexpr无符号长FT_SECONDS_PER_DAY = 24ULL * 60 * 60;constexpr无符号长FT_SECOND =100000ULL;(constexpr在编译时对它们进行了评估。)或者为了简洁起见,他们可以使用auto:FT_SECONDS_PER_DAY = 24ULL * 60 * 60;constexpr自动FT_SECOND = 10000000ULL;
票数 2
EN

Code Review用户

发布于 2014-09-02 22:09:41

  1. 不要让编译器执行乘法操作,而是让编译器执行// days *= (ULONGLONG) 864000000000;// (FT_SECONDS_PER_DAY * FT_SECOND);#define FT_SECONDS_PER_DAY (24 let *60*60)#定义FT_SECOND 100000ULL days *= FT_SECONDS_PER_DAY * FT_SECOND;
  2. FT_SECOND是什么?这个名字也许应该是FT_ten_millionths_per_second或者更好的文档。根据原始代码行及其注释,它的值似乎为10,000,000。为什么?这似乎是武断的。需要更清楚地说明这一价值的原因。
  3. 注释中写着(3.33...) * 10000,但是代码在*= 33,333.333333中使用圆角值。最好用简单的数学来做*= 33,333.333333333333333333....。解释为什么10,000的比例是有用的。很可能是FT_SECOND/1000。// MS (3.33.)* 10000 = 10/3*10000蜱*= (超长龙)10*10000,蜱/= 3;
  4. 虽然还没有使用,但是如果某个字段或参数超出了范围,请考虑使用非-0的返回值来表示错误。
票数 2
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/61560

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档