平时写代码会经常遇到时间类型转换的问题,如时间戳转为格式化时间,或者反过来等,时间类型有的为time_t,还有FILETIME一堆,在这里记录下他们之间是如何转换的。

时间类型及其意义

FILETIME:结构持有的64位无符号的文件的日期和时间值。此值表示自UTC(Coordinated Universal Time)时间1601年1月1日开始的100纳秒为单位的时间。
SYSTEMTIME:这个和tm有点类似,代表系统时间。其中,SYSTEMTIME.year的值为多少就表示公元哪一年。
tm:Systemtime-1900得到tm.year,其他的还有些差别 tm.year的值加上1900才表示公元哪一年。
time_t:是日历时间;其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间) 到当前时刻的秒数。

各种转换

  • MFC时间控件转为CTime类型
  • CTime类型转为时间戳(__int64)
  • CTime转为SYSTEMTIME类型
  • SYSTEMTIME类型转为FILETIME类型
  • FILETIME转为时间戳(__int64)
  • 时间戳转为FILETIME类型

MFC时间控件转为CTime类型

static CTime DataTimeCtrl2CTime(CDateTimeCtrl const& data,CDateTimeCtrl const& time)
{
CTime tData,tTime;
data.GetTime(tData);
time.GetTime(tTime);
return CTime(tData.GetYear(),tData.GetMonth(),tData.GetDay(),tTime.GetHour(),tTime.GetMinute(),tTime.GetSecond());
}

CTime类型转为时间戳(__int64)

static __int64 CTime2TimeStamp(CTime const& ctime)
{
return ctime.GetTime();
}

CTime转为SYSTEMTIME类型

static SYSTEMTIME CTime2Systemtime(CTime const& ctime)
{
SYSTEMTIME st;
ctime.GetAsSystemTime(st);
return st;
}

SYSTEMTIME类型转为FILETIME类型

static FILETIME SystemTime2FileTime(SYSTEMTIME const& sysTime)
{
FILETIME filetime;
::SystemTimeToFileTime(&sysTime,&filetime);
return filetime;
}

FILETIME转为时间戳(__int64)

第一种方法:

#define EPOCH_DIFF 116444736000000000
#define RATE_DIFF 10000000
#define TIME_DIFF 8*60*60
static TIME64_MS FileTime2TimeStamp(FILETIME const& filetime)
{
return ((static_cast<__int64>(filetime.dwHighDateTime)<<| filetime.dwLowDateTime)-EPOCH_DIFF)/RATE_DIFF - TIME_DIFF;
}

第二种方法:

static TIME64_MS FileTime2TimeStamp2(FILETIME const& filetime)
{
ULARGE_INTEGER ularge;
ularge.LowPart = filetime.dwLowDateTime;
ularge.HighPart = filetime.dwHighDateTime;
return (ularge.QuadPart - EPOCH_DIFF)/RATE_DIFF - TIME_DIFF;
}

时间戳转为FILETIME类型

#define EPOCH_DIFF 116444736000000000
#define RATE_DIFF 10000000
#define TIME_DIFF 8*60*60 //8小时时差 static FILETIME TimeStamp2FileTime(TIME64_MS const& ts)
{
TIME64_MS tmpTs = (ts+ TIME_DIFF) * RATE_DIFF + EPOCH_DIFF;
FILETIME ft;
ft.dwLowDateTime = (DWORD)tmpTs;
ft.dwHighDateTime = tmpTs >> ;
return ft;
}

小结

暂时用到这么多。

参考

https://blog.csdn.net/haiross/article/details/45718743

https://blog.csdn.net/leechiyang/article/details/39529041

https://blog.csdn.net/baggiowangyu/article/details/6267456

C++中各种时间类型的转换(包括MFC中的时间类型)的更多相关文章

  1. 实战c++中的string系列--std::string与MFC中CString的转换

    搞过MFC的人都知道cstring,给我们提供了非常多便利的方法. CString 是一种非常实用的数据类型. 它们非常大程度上简化了MFC中的很多操作,使得MFC在做字符串操作的时候方便了非常多.无 ...

  2. java Date时间的各种转换方式和Mysql存时间类型字段的分析

    一:各种Date之间的转换方法 public class TimeTest { public static void main(String[] args) { Date date = new Dat ...

  3. java中的基本数据类型的转换

    本文参考了如下两篇文章: https://my.oschina.net/joymufeng/blog/139952 http://www.cnblogs.com/lwbqqyumidi/p/37001 ...

  4. C# 运算符和类型强制转换(6) 持续更新

    C#支持的运算符 https://msdn.microsoft.com/zh-cn/library/6a71f45d(v=vs.140).aspx checked 和 unchecked ; b++; ...

  5. tp类型自动转换和自动完成

    一.类型自动转换 在模型中对数据库字段自动完成 //模型中数据类型自动转换 添加一个$type数组即可protected $type=array( 'username'=>'serialize' ...

  6. javascript数据类型及类型的转换总结

    javascript 是浏览器客户端脚本语言,要想让网页与后台程序更好的交互效果,这里我们详细了解javascript 数据类型及类型的转换 1,数据类型 number number类型 数字类型,浮 ...

  7. MFC中使用FLASH

    一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe.com/cn/flashplayer/)上下载最新的Flash Player(大约 ...

  8. MFC中使用FLASH相关

    出自http://my.oschina.net/ypimgt/blog/62573 一.准备工作 第一步:下载并安装Adobe Flash Player. 从官方网站(http://get.adobe ...

  9. MFC中的一些视图

    本章主要介绍MFC中主要的视图类,这些继承自Cview类. 继承关系如上图所示. 滚动视图 CscrollView给Cview添加了基本的滚动功能,它包含WM_VSCROLL和WM_HSCROLL消息 ...

随机推荐

  1. 取得<asp:TextBox中的值:

     取得<asp:TextBox中的值:  var a= document.getElementById("<%= (ID名).ClientID %>").valu ...

  2. vue滚动行为控制——页面跳转返回上一个页面保留滚动位置

    需求分析: 一般这个功能在后台管理系统用的比较多,因为后台页面都是在当前页面打开,对于某些列表筛选页,如果列表数据比较多,页面就会滚动.当页面发生滚动,对列表数据进行查看或者编辑的时候,跳转到下一级页 ...

  3. YYKit @autoreleasepool 使用,优化内存

    写在前面 最近再看YY大神的YYKit工具,发现在代码中经常使用@autoreleasepool,特别是在与for循环搭配使用的时候.刚开始很不能理解. 先有个概念: 自己创建的对象:使用 alloc ...

  4. Tomcat配置远程调试端口(windows、Linux)

    当我们需要定位生产环境问题,而日志又不清晰的情况下,我们可以借助Tomcat提供的远程调试,设置如下: // Linxu系统: apach/bin/startup.sh开始处中增加如下内容: decl ...

  5. Bootstrap(10) 进度条媒体对象和 Well 组件

    一.Well 组件这个组件可以实现简单的嵌入效果. <!-- //嵌入效果 --> <div class="well">Bootstrap</div& ...

  6. HTML转义字符 Unicode和CSS伪类介绍

    CSS 伪类用于向某些选择器添加特殊的效果. a:link {color: #FF0000} /* 未访问的链接 */ a:visited {color: #00FF00} /* 已访问的链接 */ ...

  7. ORACLE数据库的关闭与重启

    一.关闭数据库 1.SHUTDOWN IMMEDIATE 这是我们常用的一种关闭数据库的方式,想很快地关闭数据库,但又想让数据库干净的关闭,常采用这种方式. 当前正在被Oracle处理的SQL语句立即 ...

  8. .net项目错误:找不到方法:“System.Net.Http.HttpClient stellar_dotnet_sdk.Server.get_HttpClient()

    1.由于在项目里面引用了一个 新的项目stellar_dotnet_sdk,在  return new StellarWallet(ConvertToWalletSetting(coin));   的 ...

  9. vue学习视频网址(各种前端视频 网址)

    基础信息详解:https://segmentfault.com/blog/vueroad 网址:http://biaoyansu.com/18.1

  10. MySQL 5.6.4 中TIMESTAMP with implicit DEFAULT value is deprecated 错误

    [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.   在免安装版mysql安装过程中出现:[Warning] TIMESTA ...