time.cpp
上传用户:dangjiwu
上传日期:2013-07-19
资源大小:42019k
文件大小:10k
源码类别:

Symbian

开发平台:

Visual C++

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