time_t和DATE之间的相互转化

两者的差别:
  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 <ctime>
  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 <ATLComTime.h>
  #include <ctime>
  #include <cassert>
  int main()
  {
  time_t a = time(0);
  COleDateTime b( timet_to_lotus(a) );
  printf( "current UTC time is %04d-%02d-%02d %02d:%02d:%02dn", 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 <ctime>
  #include <windows.h>
  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 <ATLComTime.h>
  #include <cassert>
  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;
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值