免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4490 | 回复: 6
打印 上一主题 下一主题

[C++] 有没有能避开time_t日期限制的日期类代码? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-14 09:04 |只看该作者 |倒序浏览
RT。本来自己写了一个,用time_t实现。但后来发现这东西能表示的日期、时间很有限,最早1970年,最晚20??年,实际中很不够用。有别的办法实现吗?

论坛徽章:
14
巨蟹座
日期:2013-11-19 14:09:4615-16赛季CBA联赛之青岛
日期:2016-07-05 12:36:0515-16赛季CBA联赛之广东
日期:2016-06-29 11:45:542015亚冠之全北现代
日期:2015-07-22 08:09:472015年辞旧岁徽章
日期:2015-03-03 16:54:15巨蟹座
日期:2014-12-29 08:22:29射手座
日期:2014-12-05 08:20:39狮子座
日期:2014-11-05 12:33:52寅虎
日期:2014-08-13 09:01:31巳蛇
日期:2014-06-16 16:29:52技术图书徽章
日期:2014-04-15 08:44:01天蝎座
日期:2014-03-11 13:06:45
2 [报告]
发表于 2011-11-14 09:13 |只看该作者
The range and precision of times representable in clock_t and time_t are implementation-defined.

你看看有没有范围更大的,比如VC++中,有 __time32_t 和  __time64_t,通过宏使得 time_t 为其中了一个
#ifdef _USE_32BIT_TIME_T
typedef __time32_t time_t;
#else
typedef __time64_t time_t;
#endif

论坛徽章:
0
3 [报告]
发表于 2011-11-14 09:23 |只看该作者
我是在aix/unix上用的……

论坛徽章:
0
4 [报告]
发表于 2011-11-14 10:40 |只看该作者
看到了mktime64等函数,但不知怎么与time()结合使用。能给个例子吗?

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
5 [报告]
发表于 2011-11-14 11:21 |只看该作者
本帖最后由 yulihua49 于 2011-11-14 11:32 编辑
RT。本来自己写了一个,用time_t实现。但后来发现这东西能表示的日期、时间很有限,最早1970年,最晚20?? ...
jchc 发表于 2011-11-14 09:04


SDBC里有一套准儒略历时间系统,提供了1899-12-31 00:00:00.000000到3532年的时标及各种格式的转换。
以日期、分、秒、微秒的粒度处理。
SDBC QQ群:100807652,在群共享下载文档和源码。

看看 datejul.h的功能,可用吗?

  1. #include <time.h>
  2. #include <strproc.h>


  3. #ifdef WIN32
  4. #define timezone _timezone
  5. #endif

  6. #ifdef __cplusplus
  7. extern "C" {
  8. #endif

  9. /*  准儒略历日期函数 */
  10. /************************************************************************/
  11. /*function:rymdjul 将年月日数组转换为准儒略历数,1899.12.31至指定日的天数*/
  12. /************************************************************************/
  13. INT4    rymdjul(short ymd[3]);

  14. /************************************************************************/
  15. /*function:rjulymd 将准儒略历数(距离1899.12.31的天数)转换为年月日数组   */
  16. /************************************************************************/
  17. INT4    rjulymd(INT4  date,short ymd[3]);

  18. /************************************************************************/
  19. /*function:rjulstr 将准儒略历数按最后设置默认的格式转换为年月日字符串   */
  20. /*description:缺省默认格式为YYYY.MM.DD  准儒略历数(以天为单位)          */
  21. /************************************************************************/
  22. char    *rjulstr(char *str,INT4 jul);

  23. /************************************************************************/
  24. /*function:rstrjul 将最后设置默认格式的年月日字符串转换为准儒略历数     */
  25. /*description:缺省默认格式为YYYY.MM.DD  准儒略历数(以天为单位)          */
  26. /************************************************************************/
  27. INT4    rstrjul(char *str);

  28. /************************************************************************/
  29. /*function:SetDefaultDateFormat 设置默认日期格式                        */
  30. /*description:如果没有设置,则默认格式为YYYY.MM.DD                      */
  31. /*返回原来的格式 if format is (char *)0,recover DefaultDateFormat       */
  32. /************************************************************************/
  33. char    *SetDefaultDateFormat(char *format);

  34. /************************************************************************/
  35. /*function:rjultostrfmt 将准儒略历数按指定格式转换为年月日字符串        */
  36. /*description:fmt(YYYY-MM-DD等格式)     准儒略历数(以天为单位)          */
  37. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  38. /************************************************************************/
  39. char    *rjultostrfmt(char *buffer,INT4  dat,const char *fmt);

  40. /************************************************************************/
  41. /*function:rstrfmttojul 将年月日字符串按指定格式转换为准儒略历数        */
  42. /*description:fmt(YYYY-MM-DD等格式)      准儒略历数(以天为单位)         */
  43. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  44. /************************************************************************/
  45. INT4    rstrfmttojul(char *str,const char *fmt);

  46. /* 准儒略历时间函数 */
  47. /************************************************************************/
  48. /*function:rminstr 将GREENWITH(以分钟为单位)按格式转换成本地的年月日时分*/
  49. /*description:fmt(默认为YYYY.MM.DD HH24:MI格式)                         */
  50. /*rminstr() convert GREENWITH minuts to  local time                     */
  51. /************************************************************************/
  52. char    *rminstr(char *year_to_min,INT4  minuts);

  53. /************************************************************************/
  54. /*function:rstrmin 将本地的年月日时分按格式转换成GREENWITH(以分钟为单位)*/
  55. /*description:fmt(默认为YYYY.MM.DD HH24:MI格式)                         */
  56. /*rstrmin() convert local time to GREENWITH minuts                      */
  57. /************************************************************************/
  58. INT4    rstrmin(char *year_to_min);

  59. /************************************************************************/
  60. /*function:rminstrfmt 将准儒略历数(以分钟为单位)按格式转换成年月日时分  */
  61. /*description:fmt(YYYY-MM-DD HH24:MI或YYYY-MM-DD HH:NN等格式)           */
  62. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  63. /************************************************************************/
  64. char    *rminstrfmt(char *year_to_min,INT4  minuts,const char *fmt);

  65. /************************************************************************/
  66. /*function:rstrminfmt 将年月日时分按格式转换成准儒略历数(以分钟为单位)  */
  67. /*description:fmt(YYYY-MM-DD HH24:MI或YYYY-MM-DD HH:NN等格式)           */
  68. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  69. /************************************************************************/
  70. INT4    rstrminfmt(char *year_to_min,const char *fmt);

  71. /************************************************************************/
  72. /* function:rtimetostrfmt将日期型转换成字符串的年月日时分秒             */
  73. /*description:fmt(YYYY-MM-DD HH24:MI:SS或YYYY-MM-DD HH:NN:SS等格式)     */
  74. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  75. /************************************************************************/
  76. char    *rtimetostrfmt(char *buffer,const char *fmt,short ymd[3],short hms[3],int usec);

  77. /************************************************************************/
  78. /* function:rstrfmttotime 将字符串的年月日时分秒转换成准儒略历数        */
  79. /*description:fmt(YYYY-MM-DD HH24:MI:SS或YYYY-MM-DD HH:NN:SS等格式)     */
  80. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  81. /*返回:准儒略历数(以天为单位),hms:时分秒,usec:微秒                  */
  82. /************************************************************************/
  83. INT4    rstrfmttotime(char *str,const char *fmt,short hms[3],int *usec);

  84. /************************************************************************/
  85. /* function:rsecstrfmt 将准儒略历数转换成字符串的年月日时分秒           */
  86. /*description:fmt(YYYY-MM-DD HH24:MI:SS或YYYY-MM-DD HH:NN:SS等格式)     */
  87. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  88. /*准儒略历数(以秒为单位)                                                */
  89. /************************************************************************/
  90. char    *rsecstrfmt(char *buf,INT64 sec,const char *fmt);

  91. /************************************************************************/
  92. /* function:rstrsecfmt 将字符串的年月日时分秒转换成准儒略历数           */
  93. /*description:fmt(YYYY-MM-DD HH24:MI:SS或YYYY-MM-DD HH:NN:SS等格式)     */
  94. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  95. /*准儒略历数(以秒为单位)                                                */
  96. /************************************************************************/
  97. INT64   rstrsecfmt(char *str,const char *fmt);
  98. /************************************************************************/
  99. /* function:rusecstrfmt 将准儒略历微秒数转换成字符串的年月日时分秒.微秒                 */
  100. /*description:fmt(YYYY-MM-DD HH24:MI:SS.FF6或YYYY-MM-DD HH:NN:SS.FF6等格式)             */
  101. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  102. /*准儒略历数(以微秒为单位)                                                                            */
  103. /************************************************************************/
  104. char *rusecstrfmt(char *buf,INT64 usec,const char *fmt);
  105. /************************************************************************/
  106. /* function:rstrusecfmt 将字符串的年月日时分秒转换成准儒略历微秒数      */
  107. /*description:fmt(YYYY-MM-DD HH24:MI:SS或YYYY-MM-DD HH:NN:SS等格式)     */
  108. /*可以任意颠倒次序,可以大写或小写,可以没有分隔符。分隔符可以是汉字    */
  109. /*返回:准儒略历数(以微秒为单位)                                                */
  110. /************************************************************************/
  111. INT64 rstrusecfmt(char *str,const char *fmt);

  112. /************************************************************************/
  113. /*function:cvtdate 相对日期转换函数,返回准儒略历数(以天为单位)          */
  114. /*description:                                                          */
  115. /*基本形式:str(YYYY.MM.DD), refday:参考日期                             */
  116. /*如果哪一段缺省,以参考日期的相应数字代替                               */
  117. /*DD = 31,将被参考日期月底日取代                                        */
  118. /*哪一段以+ -开头,相对参考日期的相应数字运算                           */
  119. /*L代表月底(包括2月的28或29日,以及其它月的30日、31日)                   */
  120. /*例:                                                                  */
  121. /*  .代表当日,..代表本月当日。                                         */
  122. /*  +1代表明天,-1代表昨天, .31或31或.L代表本月月底。                   */
  123. /*  .-1.或-1. 代表上月同日,-1.31代表上月月底。                         */
  124. /*  -1.1.1代表去年1月1日。 -1..代表去年本月当日。-1.2.31代表去年2月底   */
  125. /*  2009.1.1代表2009年1月1日。.1.1或1.1代表今年1月1日。.1或1代表本月1日 */
  126. /************************************************************************/
  127. INT4    cvtdate(char *str,INT4 refday);

  128. /************************************************************************/
  129. /*function:yday 年时间戳函数                                            */
  130. /*description:                                                          */
  131. /*计算指定的准儒略历数对应的年月日距离该年1月1日(包含该天)的天数        */
  132. /*例:                                                                  */
  133. /* day = 367 对应的年月日为1901.1.2,则距离1901.1.1的天数为2             */
  134. /************************************************************************/
  135. INT4    yday(INT4 day);

  136. /************************************************************************/
  137. /*function:jday 季度时间戳函数                                          */
  138. /*description:                                                          */
  139. /*计算指定的准儒略历数对应的年月日距离每一季度(1、4、7、10月1日(包含    */
  140. /*该天))的天数                                                          */
  141. /*例:                                                                  */
  142. /* day = 457 对应的年月日为1901.4.2,则距离1901.4.1的天数为2             */
  143. /************************************************************************/
  144. INT4    jday(INT4 day);

  145. /************************************************************************/
  146. /*function:mon_end 月底时间戳函数                                       */
  147. /*description:                                                          */
  148. /*计算指定的准儒略历数对应月的月底距离1899.12.31的天数                  */
  149. /*例:                                                                  */
  150. /* day = 366 对应的年月日为1901.1.1,即月底为1901.1.31,则距离1899.12.31 */
  151. /*的天数为396                                                           */
  152. /************************************************************************/
  153. INT4    mon_end(INT4 day);

  154. /************************************************************************/
  155. /*function:mday 每月天数函数                                            */
  156. /*description:计算指定的准儒略历数对应月的总天数                        */
  157. /*例:                                                                  */
  158. /* day = 397 对应的年月日为1901.2.1,即2月有28天                         */
  159. /************************************************************************/
  160. INT4    mday(INT4 day);

  161. /************************************************************************/
  162. /*function:dday 月时间戳函数                                            */
  163. /*description:计算指定的准儒略历数对应月距离该月1日(包含该天)的天数     */
  164. /*例:                                                                  */
  165. /* day = 397 对应的年月日为1901.2.1,则距离2.1的天数为1                  */
  166. /************************************************************************/
  167. INT4    dday(INT4 day);

  168. /************************************************************************/
  169. /*functions:系统时间的准儒略历格式函数                  */
  170. /*这部分内容与操作系统有关,适于unix类系统。            */
  171. /*有效的时间范围是1970.1.1 00:00:00 -- 2038.1.19        */
  172. /*应根据不同的操作系统修改                              */
  173. /************************************************************************/
  174. /************************************************************************/
  175. /*function:rtoday 取出当日的准儒略历(距离1899.12.31)的天数              */
  176. /************************************************************************/
  177. INT4    rtoday(void); /* 返回本地时间的日期 */

  178. /************************************************************************/
  179. /*function:now_minuts 取出当日的准儒略历(距离1899.12.31 0:0)的分钟数    */
  180. /************************************************************************/
  181. INT4    now_minuts(void);       /* 返回GREEMWITH时间 */

  182. /************************************************************************/
  183. /*function:now_sec 取出当日的准儒略历(距离1899.12.31 0:0:0)的秒数       */
  184. /************************************************************************/
  185. INT64   now_sec(void);          /* 返回GREEMWITH时间 */
  186. /*function:now_usec 取出当日的准儒略历(距离1899.12.31 0:0:0.000000)的微秒数 */
  187. INT64 now_usec(void);           /* 返回GREEMWITH时间 */

  188. /************************************************************************/
  189. /*function:DateTimeConvert 日期时间数值与字符串指定格式转换     */
  190. /*description:fmt(YYYYMMDDHHmmSS格式)   */
  191. /*如果指定字符串'date'时,则将字符串转换成距离(1970.01.01 00:00:00 GMT  */
  192. /*换算成本地时间)的时间戳秒数;如果指定时间戳秒数,则date设置为空,即将距 */
  193. /*离(1970.01.01 00:00:00 GMT换算成本地时间)的时间戳秒数转换成字符串     */
  194. /*有效的时间范围是1970.1.1 00:00:00 -- 2038.1.19(GREEMWITH时间) */
  195. /*例:                                                                  */
  196. /* 1、date = 19700101080001; (localtime),即对应GMT为19700101000001 */
  197. /*        secs = 0; fmt = YYYYMMDDHHmmSS ; 则可计算出时间戳秒数 secs = 1 */
  198. /* 2、*date = NULL(必须); secs = 1; fmt = YYYYMMDDHHmmSS ; 则可根据时间 */
  199. /*    戳秒数按YYYYMMDDHHmmSS格式转换成对应的字符串值                    */
  200. /************************************************************************/
  201. void    DateTimeConvert(char *date,time_t *secs,char *fmt);

  202. /************************************************************************/
  203. /*function:DateFormatCovert 日期时间格式转换                            */
  204. /*description:fmt(YYYYMMDDHHmmSS或YYYY-MM-DD HH:mm:SS等格式)            */
  205. /*将'src'转换成fmt格式存放到'dest'中                                    */
  206. /*包括:YYYYMMDD <----> YYYY-MM-DD (相互间转换)                         */
  207. /*      YYYYMMDDHHmm  <----> YYYY-MM-DD HH:mm                           */
  208. /*              YYYYMMDDHHmmSS  <---->  YYYY-MM-DD HH:mm:SS             */
  209. /************************************************************************/
  210. int             DateFormatCovert(char *dest,char *src,char *fmt);


  211. #ifdef __cplusplus
  212. }
  213. #endif
复制代码

论坛徽章:
0
6 [报告]
发表于 2011-11-14 11:53 |只看该作者
搞定了。就是有点奇怪:
time_t now32;
time64_t now64;
time(&now32);
now64=now32; ///非得这么干不可,不然time()只认time_t,而后面的又需要time64_t。万恶的IBM,干嘛没有time64()
struct tm * tt;
tt = localtime64(&now64);
.....

论坛徽章:
15
射手座
日期:2014-11-29 19:22:4915-16赛季CBA联赛之青岛
日期:2017-11-17 13:20:09黑曼巴
日期:2017-07-13 19:13:4715-16赛季CBA联赛之四川
日期:2017-02-07 21:08:572015年亚冠纪念徽章
日期:2015-11-06 12:31:58每日论坛发贴之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-08-04 06:20:00程序设计版块每日发帖之星
日期:2015-07-12 22:20:002015亚冠之浦和红钻
日期:2015-07-08 10:10:132015亚冠之大阪钢巴
日期:2015-06-29 11:21:122015亚冠之广州恒大
日期:2015-05-22 21:55:412015年亚洲杯之伊朗
日期:2015-04-10 16:28:25
7 [报告]
发表于 2011-11-14 12:19 |只看该作者
搞定了。就是有点奇怪:
time_t now32;
time64_t now64;
time(&now32);
now64=now32; ///非得这么干不可 ...
jchc 发表于 2011-11-14 11:53



    time()不支持time64_t,怎么能突破限制?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP