为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

时间格式转换

2017-10-08 5页 doc 18KB 40阅读

用户头像

is_686908

暂无简介

举报
时间格式转换时间格式转换 两者的差别: time_t是整型,存储着至1970-1-1 00:00:00的时差(秒数)(UTC时间) DATA是浮点型,整数部分存储着至1899-12-30 00:00:00的时差(天数)(本地时间),小数部分存储着时分秒。(BTW:DATA可以表示基点之前的时间,time_t不可以) 本算法只是想说明两者之间转化是很easy的,不需要MFC的支持,不需要“晕倒”,因此以下两点不考虑: a. 不考虑Local Time和UTC之间的时差(这玩意儿看起来就不爽,还是time_t好啊,一个time_t就够...
时间格式转换
时间格式转换 两者的差别: time_t是整型,存储着至1970-1-1 00:00:00的时差(秒数)(UTC时间) DATA是浮点型,整数部分存储着至1899-12-30 00:00:00的时差(天数)(本地时间),小数部分存储着时分秒。(BTW:DATA可以表示基点之前的时间,time_t不可以) 本算法只是想说明两者之间转化是很easy的,不需要MFC的支持,不需要“晕倒”,因此以下两点不考虑: a. 不考虑Local Time和UTC之间的时差(这玩意儿看起来就不爽,还是time_t好啊,一个time_t就够了,DATE还得知道它用的时区,否则有了数值也没屁用) ------- 既然有人问我怎么做,那我把这一点也考虑进去吧 b. 不考虑错误数值(比如 time_t(-1) 就是个错误数值 ),不考虑转化失败的情况(因为两者的表示范围不一样)。 #include inline double timet_to_lotus( time_t t ) { //return t/(24*60*60) + 25569 // t/(24*60*60)就只留下天数。time_t以1970/1/1为起点,lotus以1899/12/30为基点,差25569天 // + t%(24*60*60)/(60*60) / (24.0) // t%(24*60*60)就只留下时分秒,再/(60*60)就留下时,除24就转化为lotus时 // + t%(60*60)/(60) / (24.0*60.0) // t%(60*60)就只留下分秒,再/(60)就留下分,除24*60就转化为lotus分 // + t%60 / (24.0*60.0*60.0); // t%(60)就只留下秒,除24*60*60就转化为lotus秒 return (t+timezone)/(24.0*60.0*60.0) + 25569; // timezone是时区差 } inline time_t lotus_to_timet( double dt ) { return (time_t)( (dt-25569)*(24*60*60)-timezone + 0.5 ); // +0.5是什么原因大家肯定都知道。俺就奇怪了,这格式是哪个SN制定的,如果当时没有long long,那也宁可用struct,而不是double } // 以下为测试代码 #include #include #include int main() { time_t a = time(0); COleDateTime b( timet_to_lotus(a) ); printf( "current UTC time is %04d-%02d-%02d %02d:%02d:%02d\n", b.GetYear(), b.GetMonth(), b.GetDay(), b.GetHour(), b.GetMinute(), b.GetSecond() ); time_t c = lotus_to_timet( b.m_dt ); assert( c == a ); return 0; } ////////////////////////////////////////////////////////////////// time_t 和 SYSTEMTIME 之间的相互转化(答[feveny]所问) #include #include inline SYSTEMTIME timet_to_systime( time_t t ) { tm gm = *localtime( &t ); SYSTEMTIME st = { 1900+gm.tm_year, 1+gm.tm_mon, gm.tm_wday, gm.tm_mday, gm.tm_hour, gm.tm_min, gm.tm_sec, 0 }; return st; } inline time_t systime_to_timet( const SYSTEMTIME& st ) { struct tm gm = { st.wSecond, st.wMinute, st.wHour, st.wDay, st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0, 0 }; return mktime( &gm ); } // 以下为测试代码 #include #include int main() { time_t a = time(0); SYSTEMTIME b = timet_to_systime( a ); time_t c = systime_to_timet( b ); assert( a == c ); COleDateTime d( a ); COleDateTime e( b ); assert( d == e ); return 0; } posted on 2008-08-12 13:48 周星星 阅读(6757) 评论(3) 编辑 收藏 评论 # re: time_t 和 DATE 之间的相互转化 2008-08-20 15:29 yqever 嘿嘿,多谢。 收藏了。 # re: time_t 和 DATE 之间的相互转化 2008-08-20 15:33 yqever 看到你的文章晚了点。我前几天看了看MFC的源码,这样写了一个。 SystemTimeToVariantTime好像是MS内部使用的一个未公开。 DATE AppNodesStatus::ConvertToDate(time_t t) { tm* ptm = localtime(&t); SYSTEMTIME timeDest; timeDest.wYear = (WORD) (1900 + ptm->tm_year); timeDest.wMonth = (WORD) (1 + ptm->tm_mon); timeDest.wDayOfWeek = (WORD) ptm->tm_wday; timeDest.wDay = (WORD) ptm->tm_mday; timeDest.wHour = (WORD) ptm->tm_hour; timeDest.wMinute = (WORD) ptm->tm_min; timeDest.wSecond = (WORD) ptm->tm_sec; timeDest.wMilliseconds = 0; DATE vtime; ::SystemTimeToVariantTime(&timeDest, &vtime); return vtime; }
/
本文档为【时间格式转换】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索