递归火山软件开发平台

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 火山 源码 类库
查看: 197|回复: 1
打印 上一主题 下一主题

[视窗] 来个屌大的解释一下,我还是搞不懂,那种方式更快。。

[复制链接]

126

主题

677

帖子

2399

积分

金牌会员

Rank: 6Rank: 6

积分
2399
QQ
跳转到指定楼层
楼主
发表于 昨天 23:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 server 于 2025-5-19 00:15 编辑

有问题吗??

  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 方法 取现行时间2 <类型 = 小数 折叠 @禁止流程检查 = 真>
  3. {
  4.     @     FILETIME ftUtc, ftLocal;
  5.     @     ::GetSystemTimeAsFileTime(&ftUtc);
  6.     @     if (!::FileTimeToLocalFileTime(&ftUtc, &ftLocal)) {return 0; }
  7.     @     ULARGE_INTEGER uli;
  8.     @     uli.LowPart = ftLocal.dwLowDateTime;
  9.     @     uli.HighPart = ftLocal.dwHighDateTime;
  10.     @     return static_cast<DOUBLE>(uli.QuadPart - 109205ULL * 864000000000ULL) / 864000000000.0;

  11. }
复制代码
  1. <火山程序 类型 = "通常" 版本 = 1 />

  2. 方法 _取本地时间NT <公开 静态 类型 = 小数 折叠2 @视窗.外部头文件 = "winternl.h" @视窗.外部库 = "ntdll.lib" @禁止流程检查 = 真>
  3. {

  4.     @ LARGE_INTEGER SystemTime = {0};
  5.     @ if(NtQuerySystemTime(&SystemTime) == 0){
  6.     @     FILETIME ft_utc, ft_local;
  7.     @     ft_utc.dwLowDateTime = SystemTime.LowPart;
  8.     @     ft_utc.dwHighDateTime = SystemTime.HighPart;
  9.     @     if(FileTimeToLocalFileTime(&ft_utc, &ft_local)) {
  10.     @         return static_cast<double>(((((ULONGLONG)ft_local.dwHighDateTime << 32) | ft_local.dwLowDateTime)-109205ULL * 864000000000ULL)) / 864000000000.0;
  11.     @     }
  12.     @ }
  13.     @ return 0;

  14. }
复制代码



下面是火山官方的写法:

  1. DOUBLE GetCurrentDateTime ()
  2. {
  3.     SYSTEMTIME st;
  4.     ::GetLocalTime (&st);

  5.     return ToDate ((INT_P)(UINT_P)st.wYear, (INT_P)(UINT_P)st.wMonth, (INT_P)(UINT_P)st.wDay, (INT_P)(UINT_P)st.wHour, (INT_P)(UINT_P)st.wMinute, (INT_P)(UINT_P)st.wSecond, (INT_P)(UINT_P)st.wMilliseconds, _VOL_MIN_DATE);
  6. }


  7. DOUBLE ToDate (INT_P npYear, INT_P npMonth, INT_P npDay, INT_P npHour, INT_P npMinute, INT_P npSecond, INT_P npMillSecond, const DOUBLE dbDateFailed)
  8. {
  9.     npYear = CLIP (npYear, 100, 9999);
  10.     npMonth = CLIP (npMonth, 1, 12);
  11.     npDay = CLIP (npDay, 1, 31);
  12.     npHour = CLIP (npHour, 0, 23);
  13.     npMinute = CLIP (npMinute, 0, 59);
  14.     npSecond = CLIP (npSecond, 0, 59);
  15.     npMillSecond = CLIP (npMillSecond, 0, 999);

  16.     const INT_P npDaysOfMonth = GetDaysOfMonth (npYear, npMonth);
  17.     npDay = MIN (npDaysOfMonth, npDay);

  18.     //---------------------------------------------------------------------------------

  19.     SYSTEMTIME st;
  20.     ZERO_MEM (&st, sizeof (SYSTEMTIME));
  21.     st.wYear = (WORD)npYear;
  22.     st.wMonth = (WORD)npMonth;
  23.     st.wDay = (WORD)npDay;
  24.     st.wHour = (WORD)npHour;
  25.     st.wMinute = (WORD)npMinute;
  26.     st.wSecond = (WORD)npSecond;
  27.     st.wMilliseconds = 0;  // SystemTimeToVariantTime没有处理毫秒字段

  28.     DOUBLE dbDate;
  29.     if (::SystemTimeToVariantTime (&st, &dbDate) == FALSE)
  30.         return dbDateFailed;

  31.     return dbDate + (DOUBLE)npMillSecond / (1000.0 * 60.0 * 60.0 * 24.0);  // 手动将毫秒字段添加进去

  32.     /*if (::SystemTimeToVariantTime (&st, &dbDate) == FALSE)
  33.         return dbDateFailed;

  34.     ZERO_MEM (&st, sizeof (SYSTEMTIME));
  35.     if (::VariantTimeToSystemTime (dbDate, &st) == FALSE)
  36.         return dbDateFailed;

  37.     return (((INT_P)st.wYear == npYear &&
  38.             (INT_P)st.wMonth == npMonth &&
  39.             (INT_P)st.wDay == npDay &&
  40.             (INT_P)st.wHour == npHour &&
  41.             (INT_P)st.wMinute == npMinute &&
  42.             (INT_P)st.wSecond == npSecond) ? dbDate : dbDateFailed); */
  43. }
复制代码


专业承接18-98岁xx的心理及生理教育辅导。
回复

使用道具 举报

29

主题

2269

帖子

8153

积分

核心用户

Rank: 9Rank: 9Rank: 9

积分
8153
沙发
发表于 16 小时前 | 只看该作者
你跑一下性能测试不就知道了,前面的当然更快,官方那个写得太复杂。
GetSystemTimeAsFileTime 也比 NtQuerySystemTime 快,这两个的作用是一样的。
FILETIME的精度也更高,可以到100纳秒,官方那个只能到毫秒。
如果是输出时间戳的话,FILETIME可以更快,保留精度也更多。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|递归火山软件开发平台 ( 鄂ICP备18029190号 )

GMT+8, 2025-5-19 17:18 , Processed in 0.079910 second(s), 18 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表