time.cpp
上传用户:zhongxx05
上传日期:2007-06-06
资源大小:33641k
文件大小:9k
源码类别:

Symbian

开发平台:

C/C++

  1. /* ***** BEGIN LICENSE BLOCK ***** 
  2.  * Version: RCSL 1.0/RPSL 1.0 
  3.  *  
  4.  * Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved. 
  5.  *      
  6.  * The contents of this file, and the files included with this file, are 
  7.  * subject to the current version of the RealNetworks Public Source License 
  8.  * Version 1.0 (the "RPSL") available at 
  9.  * http://www.helixcommunity.org/content/rpsl unless you have licensed 
  10.  * the file under the RealNetworks Community Source License Version 1.0 
  11.  * (the "RCSL") available at http://www.helixcommunity.org/content/rcsl, 
  12.  * in which case the RCSL will apply. You may also obtain the license terms 
  13.  * directly from RealNetworks.  You may not use this file except in 
  14.  * compliance with the RPSL or, if you have a valid RCSL with RealNetworks 
  15.  * applicable to this file, the RCSL.  Please see the applicable RPSL or 
  16.  * RCSL for the rights, obligations and limitations governing use of the 
  17.  * contents of the file.  
  18.  *  
  19.  * This file is part of the Helix DNA Technology. RealNetworks is the 
  20.  * developer of the Original Code and owns the copyrights in the portions 
  21.  * it created. 
  22.  *  
  23.  * This file, and the files included with this file, is distributed and made 
  24.  * available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 
  25.  * EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES, 
  26.  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS 
  27.  * FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 
  28.  * 
  29.  * Technology Compatibility Kit Test Suite(s) Location: 
  30.  *    http://www.helixcommunity.org/content/tck 
  31.  * 
  32.  * Contributor(s): 
  33.  *  
  34.  * ***** END LICENSE BLOCK ***** */ 
  35. #include "hlxclib/time.h"
  36. #include "hlxclib/assert.h"
  37. #include "hlxclib/limits.h"
  38. #include "hlxclib/stdio.h"
  39. #ifndef _WINCE
  40. struct tm* __helix_localtime(time_t* timep)
  41. {
  42.     assert(!"__helix_localtime(): Not implementedn");
  43.     return 0;
  44. }
  45. #endif /* _WINCE */
  46. #ifdef _WINCE
  47. struct tm* __helix_localtime(long* pTime);
  48. char * __helix_asctime(struct tm *pTm);
  49. long __helix_mktime(struct tm* pTm);
  50. void __helix_tzset()
  51. {
  52.     // not needed for this wince time implementation
  53.     return;
  54. }
  55. char * __helix_ctime(long *pTime)
  56. {
  57.     struct tm *pTm;
  58.     pTm = __helix_localtime(pTime);
  59.     if (!pTm)
  60. return NULL;
  61.     return __helix_asctime(pTm);
  62. }
  63. char *DAY_NAMES[] = {
  64.     "Sun"
  65.     , "Mon"
  66.     , "Tue"
  67.     , "Wed"
  68.     , "Thu"
  69.     , "Fri"
  70.     , "Sat"
  71. };
  72. char *MONTH_NAMES[] = {
  73.     "Jan"
  74.     ,"Feb"
  75.     ,"Mar"
  76.     ,"Apr"
  77.     ,"May"
  78.     ,"Jun"
  79.     ,"Jul"
  80.     ,"Aug"
  81.     ,"Sep"
  82.     ,"Oct"
  83.     ,"Nov"
  84.     ,"Dec"
  85. };
  86. //--------------------------------------------------------
  87. // build date string in the form ddd mmm dd hh:mm:ss yyyy
  88. char * __helix_asctime(struct tm *pTm)
  89. {
  90.     static char buf[80];
  91.     if (!pTm)
  92. return NULL;
  93.     strcpy(buf,DAY_NAMES[pTm->tm_wday]);
  94.     buf[3] = ' ';
  95.     strcpy(&buf[4],MONTH_NAMES[pTm->tm_mon]);
  96.     buf[7] = ' ';
  97.     sprintf(&buf[8],"%02d %02d:%02d:%02d %04dn",pTm->tm_mday,
  98. pTm->tm_hour,
  99. pTm->tm_min,
  100. pTm->tm_sec,
  101. pTm->tm_year+1970);
  102.     return buf;
  103. }
  104. int SECONDS_IN_MONTH[12] = {
  105.     31*24*60*60 // jan
  106.     ,28*24*60*60  // feb
  107.     ,31*24*60*60 // mar
  108.     ,30*24*60*60 // apr
  109.     ,31*24*60*60 // may
  110.     ,30*24*60*60 // jun
  111.     ,31*24*60*60 // jul
  112.     ,31*24*60*60 // aug
  113.     ,30*24*60*60 // sep
  114.     ,31*24*60*60 // oct
  115.     ,30*24*60*60 // nov
  116.     ,31*24*60*60 // dec
  117. };
  118. //--------------------------------------------------------
  119. struct tm *__helix_gmtime(long *pTime)
  120. {
  121.     static tm tm;
  122.     
  123.     memset(&tm,0,sizeof(tm));
  124.     if ( !pTime || *pTime < 0)
  125. return &tm;
  126.     long t = *pTime;
  127.     tm.tm_wday = (t/(24*60*60) + 4) % 7; // day of the week
  128.     tm.tm_year = 1970;
  129.     while (t > 0)
  130.     {
  131. t -= 365L * 24L * 60L * 60L; // seconds/non leap year
  132. if (t < 0)
  133. {
  134.     t += 365L * 24L * 60L * 60L;
  135.     break;
  136. }
  137. if ((tm.tm_year & 3) == 0) // leap year
  138.     t -= 24L * 60L * 60L; // leap year day
  139. if (t < 0)
  140. {
  141.     t += 24L * 60L * 60L;
  142.     t += 365L * 24L * 60L * 60L;
  143.     break;
  144. }
  145. ++tm.tm_year;
  146.     }
  147.     tm.tm_yday = t/(24L * 60L * 60L); //day of the year
  148.     while (t > 0 && tm.tm_mon < 11)
  149.     {
  150. t -= SECONDS_IN_MONTH[tm.tm_mon];
  151. if (t < 0)
  152. {
  153.     t += SECONDS_IN_MONTH[tm.tm_mon];
  154.     break;
  155. }
  156. if ((tm.tm_year & 3) == 0 && tm.tm_mon == 1) // leap year and feb
  157.     t -= 24*60*60;
  158. if (t < 0)
  159. {
  160.     t += 24*60*60;
  161.     t += SECONDS_IN_MONTH[tm.tm_mon];
  162.     break;
  163. }
  164. ++tm.tm_mon;
  165.     }
  166.     tm.tm_mday = t/(24*60*60);
  167.     t -= tm.tm_mday * 24*60*60;
  168.     ++tm.tm_mday; // day is 1..31
  169.     tm.tm_hour = t/(60*60); //0..23
  170.     t -= tm.tm_hour * 60*60; 
  171.     tm.tm_min = t/60; // 0..60
  172.     t -= tm.tm_min * 60;
  173.     tm.tm_sec = t;
  174.     tm.tm_year -= 1900;
  175.     return &tm;
  176. }
  177. //--------------------------------------------------------
  178. struct tm* __helix_localtime(long* pTime)
  179. {
  180.     tm *pTm = NULL;
  181.     long t;
  182.     TIME_ZONE_INFORMATION tz;
  183.     tm s,e; // start and end date of dst
  184.     long sabs,eabs; // absolute time of start/end dst
  185.     if (!pTime || *pTime < 0)
  186. return NULL;
  187.     ::GetTimeZoneInformation(&tz);
  188.     t = *pTime - tz.Bias * 60; // backup to gmt
  189.     pTm = __helix_gmtime(&t); // get local time
  190.     if (!pTm)
  191. return NULL;
  192.     pTm->tm_isdst = 0; 
  193.     if (tz.StandardDate.wMonth == 0)
  194. return pTm;
  195.     memset(&s,0,sizeof(tm));
  196.     s.tm_year = pTm->tm_year;
  197.     s.tm_mon = tz.DaylightDate.wMonth-1;
  198.     s.tm_mday = 1;
  199.     s.tm_hour = tz.DaylightDate.wHour;
  200.     sabs = __helix_mktime(&s);
  201.     sabs += (7-s.tm_wday)*24*60*60; // days to 1st sunday
  202.     memset(&e,0,sizeof(tm));
  203.     e.tm_year = pTm->tm_year;
  204.     e.tm_mon = tz.StandardDate.wMonth-1;
  205.     e.tm_mday = 31;
  206.     e.tm_hour = tz.StandardDate.wHour;
  207.     eabs = __helix_mktime(&e);
  208.     eabs -= e.tm_wday*24*60*60; // days to last sunday
  209.     if (((t > sabs) && (t < eabs) && (eabs > sabs)) ||
  210. (((t > sabs) || (t < eabs)) && (eabs < sabs)))
  211.     { // in dst
  212. t -= tz.DaylightBias * 60; // take out daylight savings time
  213. pTm = __helix_gmtime(&t);
  214. pTm->tm_isdst = 1;
  215.     }
  216.     return pTm;
  217.    
  218. }
  219. //--------------------------------------------------------
  220. long __helix_convertTime(SYSTEMTIME *pS, int *pDayOfYear)
  221. {
  222.     long t = 0;
  223.     int y = pS->wYear;
  224.     for (int i = 0; i < pS->wMonth-1; i++)
  225. t += SECONDS_IN_MONTH[i];
  226.     if ((pS->wYear & 3) == 0 && pS->wMonth > 2)
  227. t += 24*60*60;
  228.     t += (pS->wDay - 1)*24*60*60; 
  229.     t += pS->wHour * 60*60;
  230.     t += pS->wMinute * 60;
  231.     t += pS->wSecond;
  232.     *pDayOfYear = t/(24L * 60L * 60L); //day of the year
  233.     while (y > 1970)
  234.     {
  235. --y;
  236. t += 365*24*60*60;
  237. if ((y & 3) == 0)
  238.     t += 24*60*60;
  239.     }
  240.     pS->wDayOfWeek = (t/(24*60*60) + 4) % 7; // day of the week
  241.     return t;
  242. }
  243. //--------------------------------------------------------
  244. long __helix_time(long *pTime)
  245. {
  246.     long t;
  247.     SYSTEMTIME s;
  248.     int idoy;
  249.     ::GetSystemTime(&s);
  250.     t = __helix_convertTime(&s,&idoy);
  251.     if (pTime)
  252. *pTime = t;
  253.     return t;
  254. }
  255. //--------------------------------------------------------
  256. long __helix_mktime(struct tm* pTm)
  257. {
  258.     long t;
  259.     SYSTEMTIME s;
  260.     if (!pTm)
  261. return 0;
  262.     s.wYear = pTm->tm_year+1900;
  263.     s.wMonth = pTm->tm_mon+1;
  264.     s.wDay = pTm->tm_mday;
  265.     s.wHour = pTm->tm_hour;
  266.     s.wMinute = pTm->tm_min;
  267.     s.wSecond = pTm->tm_sec;
  268.     t = __helix_convertTime(&s,&pTm->tm_yday);
  269.     pTm->tm_wday = s.wDayOfWeek;
  270.     return t;
  271. }
  272. #endif /* _WINCE */
  273. #ifdef _OPENWAVE
  274. #include "platform/openwave/hx_OpUtils.h"
  275. time_t __helix_time(time_t* p)
  276. {
  277.     time_t t = op_time();
  278.     if (p) *p = t;
  279.     return t;
  280. }
  281. struct tm *__helix_gmtime(const time_t *timep)
  282. {
  283.     static struct tm structTM;
  284.     op_gmtime(op_time(), &structTM);
  285.     return &structTM;
  286. }
  287. time_t __helix_mktime(struct tm* tm)
  288. {
  289.     // XXXSAB Assume that we're always dealing with UTC time?
  290.     return op_timegm(tm);
  291. }
  292. int __helix_gettimeofday(struct timeval *tv, void *tz)
  293. {
  294. int ret = 0;
  295. static U32 carry = 0;
  296.     static const U32 carryIncrement = (UINT_MAX / 1000) + 1;
  297.     static U32 lastT = 0;
  298.     U32 t = op_getMSecs();
  299.     if (t < lastT)
  300. {
  301. carry += carryIncrement;
  302. }
  303.     lastT = t;
  304. U32 ts = t / 1000;
  305.     tv->tv_sec = ts + carry;
  306.     tv->tv_usec = 1000 * (t - ts * 1000);
  307. return ret;
  308. }
  309. char * __helix_ctime(const time_t *timer)
  310. {
  311. char *st = NULL; 
  312. /*
  313.   struct op_tm {
  314. S8 tm_sec;       seconds (0 - 61)         
  315. S8 tm_min;       minutes (0 - 59)         
  316. S8 tm_hour;      hours (0 - 23)           
  317. S8 tm_mday;      day of month (1 - 31)    
  318. S8 tm_mon;       month of year (0 - 11)   
  319. S8 tm_wday;      day of week (Sunday = 0) 
  320. S16 tm_year;     year - 1900              
  321. S16 tm_yday;     day of year (0 - 365)    
  322. */
  323. op_tm optm;
  324. if (kTrue == op_gmtime(*timer, &optm))
  325. {
  326. /*
  327.  * based on iso c, return string is precisely 26 chars
  328.  * in the form of: Wed Jan 02 02:03:55 1980n
  329.  */
  330. st = new char[26];
  331. char *weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
  332. char *months[] = {"Jan", "Feb", "Mar", "Api", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
  333. snprintf(st, 26, "%s %s %2u:%2u:%2u:%2u %4un", weekdays[optm.tm_wday], 
  334. months[optm.tm_mon],optm.tm_mday, optm.tm_hour, optm.tm_min, optm.tm_sec, optm.tm_year);
  335. }
  336. return st;
  337. }
  338. #endif /* _OPENWAVE */