时间的几个实用函数 FILETIME UnixTime的转换

2023-10-29

filetimeToUnixTime

windos filetime 起于 1601-01-01T00:00:00Z  ,  单位 100 纳秒

UnixTime         起于  1970-01-01T00:00:00Z  ,   单位  秒

它们的起始时间差了 11644473600 秒

 

下面这个函数把 filetime 转换成 UnixTime的秒偏差, 返回值 相当于 time(0),    ms 返回毫秒偏差

#define WINDOWS_TICK 10000000
#define SEC_TO_UNIX_EPOCH 11644473600LL
int64_t filetimeToUnixTime(int64_t windowsTicks, int* ms=NULL)
{
    if (ms) {
        *ms = (windowsTicks % WINDOWS_TICK) / (WINDOWS_TICK / 1000);
    }
     return (unsigned)(windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH);
}

 

 

再记录几个实用函数

1. 毫秒休眠    

// msleep(200);   休眠 200ms
void msleep(int ms)
{
#ifdef WIN32
    Sleep(ms);
#else
    usleep(ms*1000);
#endif
}

 

2.  获取修改文件时间

// 获取文件时间
// windows 是 创建时间(create time)    而 linux 是 改变时间 (change time)
// 调用的时候注意程序运行的 平台
bool filetime(const string& path, time_t* mtime, time_t* atime=NULL, time_t* createtime=NULL, time_t* changetime=NULL);
bool change_filetime(const string& path, time_t mtime, time_t atime);

#ifdef WIN32
SYSTEMTIME TimeToSystemTime(time_t time)
{
    tm temptm = *localtime(&time);
    SYSTEMTIME st = { 1900 + temptm.tm_year, 1 + temptm.tm_mon,
        temptm.tm_wday, temptm.tm_mday, temptm.tm_hour,
        temptm.tm_min, temptm.tm_sec, 0 };
    return st;
}
#endif

bool change_filetime(const string& path, time_t mtime, time_t atime)
{
#ifdef WIN32
    HANDLE f = CreateFileA(path.c_str(),      // LPCTSTR lpFileName,
        GENERIC_READ | GENERIC_WRITE,         // DWORD dwDesiredAccess,
        FILE_SHARE_READ | FILE_SHARE_DELETE,
        NULL,                               // LPSECURITY_ATTRIBUTES lpSecurityAttributes,
        OPEN_EXISTING,
        FILE_FLAG_BACKUP_SEMANTICS,         // DWORD dwFlagsAndAttributes,
        NULL);
    
    FILETIME fmtime, fatime;
    SYSTEMTIME local_mtime = TimeToSystemTime(mtime);
    SYSTEMTIME local_atime = TimeToSystemTime(atime);
    SYSTEMTIME sys_mtime, sys_atime;
    TzSpecificLocalTimeToSystemTime(NULL, &local_mtime, &sys_mtime);
    TzSpecificLocalTimeToSystemTime(NULL, &local_atime, &sys_atime);
    SystemTimeToFileTime(&sys_mtime, &fmtime);
    SystemTimeToFileTime(&sys_atime, &fatime);
    SetFileTime(f, NULL, &fatime, &fmtime);
    CloseHandle(f);
#else
    struct utimbuf buf;
    buf.modtime = mtime;
    buf.actime = atime;
    utime(path.c_str(), &buf);
#endif
    return true;
}

bool filetime(const string& path, time_t* mtime, time_t* atime/*=NULL*/, time_t* createtime/*=NULL*/, time_t* changetime/*=NULL*/) {
    struct stat st;
    int ret = stat(path.c_str(), &st);
    if (-1 == ret)
        return false;
    if (mtime) *mtime = st.st_mtime;
    if (atime) *atime = st.st_atime;
    
#ifdef WIN32
    if (createtime) *createtime = st.st_ctime;
    if (changetime) // windows 下没有这个时间    参数错误
        return false;
#else
    if (changetime) *changetime = st.st_ctime;
    if (createtime) // linux 下没有这个时间   参数错误
        return false;
#endif

    return true;
}

 

3. 时间字符串的几个转换

// time_t 转换成时间字符串
string time2date(time_t tm, const char* fmt = "%Y-%m-%d");

// yyyy-mm-dd hh:mm:ss --> time_t
// 假设你传入的时间一定是对的
time_t s2time(const string& s);

// 返回 20190528
string current_date(const char* fmt = "%d%02d%02d");
// 返回 [09:18:24.234]
string current_time();


string current_date(const char* fmt /*= "%d%02d%02d"*/)
{
	char date[40] = { 0 };

#ifdef WIN32 
	//获得当前日期
	SYSTEMTIME st;
	GetLocalTime(&st);
	sprintf_s(date, sizeof date, fmt, st.wYear, st.wMonth, st.wDay);
#else
	struct timespec now;
	clock_gettime(CLOCK_REALTIME, &now);
	struct tm *x = localtime(&(now.tv_sec));

	snprintf(date, sizeof date, fmt, 1900 + x->tm_year, x->tm_mon + 1, x->tm_mday);
#endif

	return date;
}

time_t s2time(const string& s) {
    struct tm t;
    int n = sscanf(s.c_str(), "%d-%d-%d %d:%d:%d",
                   &t.tm_year, &t.tm_mon, &t.tm_mday,
                   &t.tm_hour, &t.tm_min, &t.tm_sec);
    if (n != 6)
        return 0;

    t.tm_year -= 1900;
    t.tm_mon -= 1;
    return mktime(&t);
}

string time2date(time_t tm, const char* fmt /*= "%Y-%m-%d"*/)
{
    char ch[64] = {0};
    strftime(ch, sizeof(ch) - 1, fmt, localtime(&tm));
    return ch;
}

/* 这个函数好是好 就是不能精确到 毫秒
static string  getCurrentTimeStr()
{
	time_t t = time(NULL);
	char ch[64] = {0};
	strftime(ch, sizeof(ch) - 1, "%Y-%m-%d %H:%M:%S", localtime(&t));     //年-月-日 时-分-秒
	return ch;
}
*/

string current_time()
{
	char now[30] = { 0 };

#ifdef WIN32 
	//获得当前日期
	SYSTEMTIME st;
	GetLocalTime(&st);
	sprintf_s(now, 30, "[%02d:%02d:%02d.%03li]", st.wHour, st.wMinute, st.wSecond, st.wMilliseconds);
#else
	struct timespec ts;
	clock_gettime(CLOCK_REALTIME, &ts);
	struct tm *x = localtime(&(ts.tv_sec));

	snprintf(now, 30, "[%02d:%02d:%02d.%03li]", x->tm_hour, x->tm_min, x->tm_sec, ts.tv_nsec / (int)1E6);
#endif

	return now;
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

时间的几个实用函数 FILETIME UnixTime的转换 的相关文章

  • WebBrowser Control 导致整个应用程序变得无响应

    我有一个带有嵌入式 Web 浏览器的 C NET 3 5 应用程序 浏览器被设计为指向远程站点 而不是本地站点 一切工作正常 但是当页面响应缓慢时 这会导致我的整个应用程序变得无响应 直到加载页面 我不介意浏览器在执行任务时没有响应 但应用
  • 获取枚举实例的名称[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 help closed questions 目前不接受答案 假设我有这个枚举 public enum MyEnum ValueOne 1 ValueTwo 2 ValueThree 3 然后
  • 为什么在此单元测试中,BackgroundWorker 没有在正确的线程上调用 RunWorkerCompleted?

    backgroundWorker 的全部目的是在执行耗时的任务后更新 UI 组件正如广告所宣传的那样在我的 WPF 应用程序中 但是在我的测试中 回调不会在调用线程上调用 Test public void TestCallbackIsInv
  • pybind11 返回 numpy 对象数组

    使用 pybind11 C API 和 python3 我们如何在 C 实现中正确创建一个 numpy 对象数组 即 unicode 字符串 并将其返回给 python 传递到 pybind11 array 的底层数据数组的确切内存布局是什
  • 如何在提升日期时间中忽略周末和节假日?

    第一个问题 我有一个提升日期对象 如下所示 boost gregorian date 今天 2012 02 13 我从今天减去日期部分 如下所示 今天 月 240 或今天 天 X 等 我想在进行上述减法时是否有办法排除周末和特殊假期 我的意
  • 使用迭代器遍历 boost::ublas 矩阵

    我只是想从头到尾遍历一个矩阵 触及每个元素 然而 我发现升压矩阵没有一个迭代器 而是有两个迭代器 而且我无法弄清楚如何使它们工作以便您可以遍历整个矩阵 typedef boost numeric ublas matrix
  • Web API 2 中的方法名称约定 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 是否有 Web API 2 中使用的约定的列表 以这两种方法为例 两者都可以工作 但都没有用属性来装饰 IHttpActionResu
  • c++ 最大 std::string 长度由堆栈大小或堆大小决定?

    正如问题中所问 std string myVar 它可以容纳的最大字符是由堆栈还是堆决定的 谢谢 默认情况下 分配的内存为std string是动态分配的 注意std string has a max size 函数返回实现支持的最大字符数
  • 如何防止打印屏幕

    我有一个要求 我正在开发的应用程序阻止用户轻松捕获屏幕内容 我已经表示 没有可行的方法可以完全防止这种情况发生 但我正在寻找方法来为这一过程引入一些障碍 我正在使用 C NET 2 0 和 WinForms 你不能 您能做的最好的事情就是在
  • QFileDialog::getOpenFileName 调试时崩溃,显然是由项目名称引起的?

    我遇到了一个让我非常困惑的问题 我在 Windows 7 上使用 Qt Creator 3 1 2 和 Qt 5 3 使用 MSVC 10 0 编译器和 Windows 8 1 调试工具中的 CDB 不确定我是否应该寻找特定于 Window
  • 使用 C 通过引用传递数组

    是的 我已经阅读了这个问题和答案 在 C 中通过引用传递数组 https stackoverflow com questions 1106957 pass array by reference in c 我有一个类似的问题 并从该问题中实现
  • 以编程方式打开网页并以字符串形式检索其 html 包含内容

    我有一个 Facebook 帐户 我想提取我朋友的照片及其个人详细信息 例如 出生日期 就读学校 等 我能够提取我每个朋友帐户的 Facebook 首页的地址 但我不知道如何以编程方式打开我每个朋友首页的网页并将 html 包含保存为字符串
  • 如何将日期格式从 DD/MM/YYYY 或 MM/DD/YYYY 更改为 YYYY-MM-DD?

    我需要使用 C 更改日期字符串的格式 来自 06 16 2010 或 16 06 2010 至 2010 06 16 你能帮我实现这个目标吗 thanks 如果您已经将其作为DateTime use string x dt ToString
  • 黑屏只是闪烁一会儿

    在我的 Windows Phone 8 应用程序中 我有一个搜索页面 其中有一个文本框供用户输入搜索关键字 输入默认SIP键盘的 Enter 键时将调用搜索 搜索结果显示在另一个页面中 为了在导航到结果页面之前隐藏键盘 我使用 this F
  • C# 从字符串变量中获取类型并在泛型方法中使用它

    我希望能够通过某种方式 即从数据库 获取我收到的字符串值的实际类型 这样我就可以在通用方法中使用该类型 例如DoSomething
  • 为什么在 C++ 内存管理中术语“自动”和“动态”优于术语“堆栈”和“堆”?

    与 SO 上的许多问题和答案相关 我了解到最好将其生命周期管理为驻留在自动存储中而不是堆栈中的对象 此外 动态分配的对象不应该被称为驻留在堆上 而应该被称为驻留在动态存储中 我知道有自动 动态和静态存储 但从未真正理解自动堆栈和动态堆之间的
  • timeval_subtract 解释

    使用 timeval subtract 函数来查找两个 struct timeval 类型之间经过的时间 有人可以解释一下用于 通过更新 y 执行后续减法的进位 和其他部分的目的和逐步数学吗 我了解该函数的目的以及如何在程序中实现它 但我想
  • 如何在 C# 中使用 Selenium WebDriver 获取当前窗口的 URL?

    在我的应用程序中 登录时 它会导航到另一个页面 现在我需要在 selenium C 中使用 WebDriver 获取新的 URL 我找不到任何函数来执行此操作 我努力了driver Url driver getLocation and dr
  • 复杂对象上的 GroupBy(例如 List

    Using GroupBy and Count gt 1我试图在列表中查找我的类的重复实例 该类看起来像这样 public class SampleObject public string Id public IEnumerable
  • 同时使用多个控制台

    是否有捷径可寻 我现在仅使用控制台测试我的网络应用程序 最好的办法是从一个项目中拥有多个控制台 然后按一下 立即调试 菜单项 我可以像过去一样使用多个项目 但这似乎很笨拙 理想情况下 我可以启动多个控制台实例 从同一线程运行很好 并且让它们

随机推荐

  • 解决Tomcat后台修改前端无变化问题

    在用tomcat8 9 eclipse ssm开发java web项目的时候 有时会发现后台代码修改了 而前端显示却没有变化 两种情况及解决方案如下 状况一 修改了JSP页面代码 但是浏览器显示出来的还是之前的页面 原因 服务器为提高响应速
  • 统计单词出现的最多次数(Trie树)

    A Time Limit 60ms Memory limit 65536K 有疑问 点这里 题目描述 给出n 1 lt n n lt 2 10 6 个字符串 每个字符串只包含小写英文字母 且最多有五个 问这n个字符串中出现次数最多的有多少个
  • 1.c++环境配置及第一个环境运行

    开发IDE与环境 最好是使用ubuntu系统进行开发 如果没有的话 基于windows使用vs code 进行ssh连接到远程的ubuntu主机进行开发也可以 开发的过程跟本地差不多 vs code IDE 插件的安装 1 变成中文菜单与提
  • ByteBridge数据标注平台:自动驾驶相关数据标注

    ByteBridge Dashboard是一个Saas型数据采集标注平台 利 强大的标注工具 运 智能算法技术 依靠交叉审核质检机制 借助标注运营及管理 动 体化系统 为客户按时提供安全 稳定 质量的数据标注服务 满 在模式识别领域进 科研
  • BP算法

    只限于自己看 预先说明 首先 这里面什么看成变量 什么看成常量 变量 网络的权值W 偏置b默认在W内 以及输入X 常量 就是target 你可能会说呃呃呃 不是输入都是有值吗 不都是数吗 怎么会是变量啊 一般来说网络的反向传播就是两种类型
  • VS2015--win32工程配置

    一个工程很大 需要很多的文件 如果都是我们自己写的文件 我们一般不会把实现不同功能的两个文件命以相同的名称 但是 如果我们引入了第三方库的源码 这样就很有可能有相同名字的文件存在 比如很多库都喜欢定义一个base h文件用于放置一些最基本的
  • Modbus RTU协议认识

    Modbus RTU协议认识 一 通信模式 Modbus RTU协议是一个主从协议 主机发出请求 从机返回响应 从机不能主动发送数据 同一时刻总线上只能有一个主机 但可以有多个从机 从机之间不能相互通信 二 通信角色 主机 主机没有编号 因
  • MYSQL修改时区

    按照公司要求 java程序和数据库时区保持在UTC时区 本文将针对自建数据库 提供修改时区方法 含盖windows和ubuntu环境 一 Windows环境 1 找到mysql配置文件 my ini mysql由于按照方式不同 存在位置可能
  • Python基础知识: for . in range()循环

    Python for x in range 循环打印四个数字能生成多少个互不相同且无重复数字的三位数 记录打印三位数的个数 count 0 用i控制第一位输出的位数 for i in range 1 5 用j控制第二位输出的位数 for j
  • (转)大厂的产品经理是怎样进行产品迭代的?

    先说一下背景 大厂和小厂都呆过 呆过野蛮生长的传统集团的互联网部门 呆过上市的中型二线互联网公司 呆过APPLE STORE行业APP排名第一的产品公司 现在呆在全球一万多员工的超级独角兽公司 其实各个产品公司的迭代流程都大同小异 因为规范
  • Flink 1.11.2 在K8s里基于NFS搭建高可用集群

    使用官方的docker镜像搭建job ha集群一直失败 最后参考了flink1 11 2 的start cluster sh 脚本 对docker 的启动脚本进行了调整 终于成功了 希望能够帮助到大家 需要注意的是 我的k8s环境是基于k8
  • GIS开发一:OpenLayers在线瓦片数据源汇总

    文章目录 1 概述 2 地图数据源 2 1 Google 2 2 OpenStreetMap 2 3 Thunderforest 2 4 Mapbox 2 5 ArcGIS 2 6 Bing地图 2 7 高德地图 2 8 百度地图 2 9
  • 自用入门人工智能笔记

    定义 百度百科的定义 机器学习的主要研究对象是人工智能 特别是如何在经验学习中改善具体算法的性能 能通过经验自动改进的计算机算法的研究 用数据和以往的经验来优化计算基础性的性能标准 Machine Learning书中的定义 如果一个程序可
  • Unity AssetBundle(2):工具UnityStudio

    一 UnityStudio 作用有两个 查看AssetBundle内资源 File gt LoadFile 提取AssetBundle内资源 Export 下载地址 UnityStudio releases地址 Perfare UnityS
  • Linux下Mysql 5.6.21 tar包安装实践

    好久没玩linux 由于项目需要部署新的linux开发环境 包括安装jdk tomcat redis mysql 趁着有时间 赶紧部署好 jdk tomcat redis很快就部署好了 唯独mysql让我折腾了一阵 先安装了我之前就安装过的
  • 数据库性能优化必读,AntDB-M数据库的哈希索引设计

    数据库加快访问速度的关键技术之一就是索引 索引的设计及使用方式极大程度上影响了数据库的性能 AntDB M支持Hash BTree两种索引类型 本文主要讲解Hash索引的相关设计 并给出一些使用建议 1 相关概念 桶 用于定位索引记录的容器
  • 如何在本地操作Redis

    1 下载redis到本地 下载Redis x64 xxx zip压缩包并解压 我这里解压到了D Redis Redis下载地址 2 开启并连接Redis 1 进入解压的文件夹中 按住shift 右击鼠标 点击在此处打开命令窗口 运行命令 r
  • MySQL安装时常见问题和解决方案【详解】

    目录 1 更改不了后缀名 2 配置文件设置错误 3 使用 mysqld install命令安装MySQL服务失败 4 使用 mysqld initialize console命令初始化MySQL 失败 5 使用net start mysql
  • java 中 BigDecimal 详解

    首先 学习一个东西 我们都必须要带着问题去学 这边我分为 为什么 是什么 怎么用 为什么要用BigDecimal 首先 我们先看一下 下面这个现象 那为什么会出现这种情况呢 因为不论是float 还是double都是浮点数 而计算机是二进制
  • 时间的几个实用函数 FILETIME UnixTime的转换

    filetimeToUnixTime windos filetime 起于 1601 01 01T00 00 00Z 单位 100 纳秒 UnixTime 起于 1970 01 01T00 00 00Z 单位 秒 它们的起始时间差了 116