📄 time.cpp
字号:
/* ***** BEGIN LICENSE BLOCK *****
* Version: RCSL 1.0/RPSL 1.0
*
* Portions Copyright (c) 1995-2002 RealNetworks, Inc. All Rights Reserved.
*
* The contents of this file, and the files included with this file, are
* subject to the current version of the RealNetworks Public Source License
* Version 1.0 (the "RPSL") available at
* http://www.helixcommunity.org/content/rpsl unless you have licensed
* the file under the RealNetworks Community Source License Version 1.0
* (the "RCSL") available at http://www.helixcommunity.org/content/rcsl,
* in which case the RCSL will apply. You may also obtain the license terms
* directly from RealNetworks. You may not use this file except in
* compliance with the RPSL or, if you have a valid RCSL with RealNetworks
* applicable to this file, the RCSL. Please see the applicable RPSL or
* RCSL for the rights, obligations and limitations governing use of the
* contents of the file.
*
* This file is part of the Helix DNA Technology. RealNetworks is the
* developer of the Original Code and owns the copyrights in the portions
* it created.
*
* This file, and the files included with this file, is distributed and made
* available on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND REALNETWORKS HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
*
* Technology Compatibility Kit Test Suite(s) Location:
* http://www.helixcommunity.org/content/tck
*
* Contributor(s):
*
* ***** END LICENSE BLOCK ***** */
#include "hlxclib/time.h"
#include "hlxclib/assert.h"
#include "hlxclib/limits.h"
#include "hlxclib/stdio.h"
#ifndef _WINCE
struct tm* __helix_localtime(time_t* timep)
{
assert(!"__helix_localtime(): Not implemented\n");
return 0;
}
#endif /* _WINCE */
#ifdef _WINCE
struct tm* __helix_localtime(long* pTime);
char * __helix_asctime(struct tm *pTm);
long __helix_mktime(struct tm* pTm);
void __helix_tzset()
{
// not needed for this wince time implementation
return;
}
char * __helix_ctime(long *pTime)
{
struct tm *pTm;
pTm = __helix_localtime(pTime);
if (!pTm)
return NULL;
return __helix_asctime(pTm);
}
char *DAY_NAMES[] = {
"Sun"
, "Mon"
, "Tue"
, "Wed"
, "Thu"
, "Fri"
, "Sat"
};
char *MONTH_NAMES[] = {
"Jan"
,"Feb"
,"Mar"
,"Apr"
,"May"
,"Jun"
,"Jul"
,"Aug"
,"Sep"
,"Oct"
,"Nov"
,"Dec"
};
//--------------------------------------------------------
// build date string in the form ddd mmm dd hh:mm:ss yyyy
char * __helix_asctime(struct tm *pTm)
{
static char buf[80];
if (!pTm)
return NULL;
strcpy(buf,DAY_NAMES[pTm->tm_wday]);
buf[3] = ' ';
strcpy(&buf[4],MONTH_NAMES[pTm->tm_mon]);
buf[7] = ' ';
sprintf(&buf[8],"%02d %02d:%02d:%02d %04d\n",pTm->tm_mday,
pTm->tm_hour,
pTm->tm_min,
pTm->tm_sec,
pTm->tm_year+1970);
return buf;
}
int SECONDS_IN_MONTH[12] = {
31*24*60*60 // jan
,28*24*60*60 // feb
,31*24*60*60 // mar
,30*24*60*60 // apr
,31*24*60*60 // may
,30*24*60*60 // jun
,31*24*60*60 // jul
,31*24*60*60 // aug
,30*24*60*60 // sep
,31*24*60*60 // oct
,30*24*60*60 // nov
,31*24*60*60 // dec
};
//--------------------------------------------------------
struct tm *__helix_gmtime(long *pTime)
{
static tm tm;
memset(&tm,0,sizeof(tm));
if ( !pTime || *pTime < 0)
return &tm;
long t = *pTime;
tm.tm_wday = (t/(24*60*60) + 4) % 7; // day of the week
tm.tm_year = 1970;
while (t > 0)
{
t -= 365L * 24L * 60L * 60L; // seconds/non leap year
if (t < 0)
{
t += 365L * 24L * 60L * 60L;
break;
}
if ((tm.tm_year & 3) == 0) // leap year
t -= 24L * 60L * 60L; // leap year day
if (t < 0)
{
t += 24L * 60L * 60L;
t += 365L * 24L * 60L * 60L;
break;
}
++tm.tm_year;
}
tm.tm_yday = t/(24L * 60L * 60L); //day of the year
while (t > 0 && tm.tm_mon < 11)
{
t -= SECONDS_IN_MONTH[tm.tm_mon];
if (t < 0)
{
t += SECONDS_IN_MONTH[tm.tm_mon];
break;
}
if ((tm.tm_year & 3) == 0 && tm.tm_mon == 1) // leap year and feb
t -= 24*60*60;
if (t < 0)
{
t += 24*60*60;
t += SECONDS_IN_MONTH[tm.tm_mon];
break;
}
++tm.tm_mon;
}
tm.tm_mday = t/(24*60*60);
t -= tm.tm_mday * 24*60*60;
++tm.tm_mday; // day is 1..31
tm.tm_hour = t/(60*60); //0..23
t -= tm.tm_hour * 60*60;
tm.tm_min = t/60; // 0..60
t -= tm.tm_min * 60;
tm.tm_sec = t;
tm.tm_year -= 1900;
return &tm;
}
//--------------------------------------------------------
struct tm* __helix_localtime(long* pTime)
{
tm *pTm = NULL;
long t;
TIME_ZONE_INFORMATION tz;
tm s,e; // start and end date of dst
long sabs,eabs; // absolute time of start/end dst
if (!pTime || *pTime < 0)
return NULL;
::GetTimeZoneInformation(&tz);
t = *pTime - tz.Bias * 60; // backup to gmt
pTm = __helix_gmtime(&t); // get local time
if (!pTm)
return NULL;
pTm->tm_isdst = 0;
if (tz.StandardDate.wMonth == 0)
return pTm;
memset(&s,0,sizeof(tm));
s.tm_year = pTm->tm_year;
s.tm_mon = tz.DaylightDate.wMonth-1;
s.tm_mday = 1;
s.tm_hour = tz.DaylightDate.wHour;
sabs = __helix_mktime(&s);
sabs += (7-s.tm_wday)*24*60*60; // days to 1st sunday
memset(&e,0,sizeof(tm));
e.tm_year = pTm->tm_year;
e.tm_mon = tz.StandardDate.wMonth-1;
e.tm_mday = 31;
e.tm_hour = tz.StandardDate.wHour;
eabs = __helix_mktime(&e);
eabs -= e.tm_wday*24*60*60; // days to last sunday
if (((t > sabs) && (t < eabs) && (eabs > sabs)) ||
(((t > sabs) || (t < eabs)) && (eabs < sabs)))
{ // in dst
t -= tz.DaylightBias * 60; // take out daylight savings time
pTm = __helix_gmtime(&t);
pTm->tm_isdst = 1;
}
return pTm;
}
//--------------------------------------------------------
long __helix_convertTime(SYSTEMTIME *pS, int *pDayOfYear)
{
long t = 0;
int y = pS->wYear;
for (int i = 0; i < pS->wMonth-1; i++)
t += SECONDS_IN_MONTH[i];
if ((pS->wYear & 3) == 0 && pS->wMonth > 2)
t += 24*60*60;
t += (pS->wDay - 1)*24*60*60;
t += pS->wHour * 60*60;
t += pS->wMinute * 60;
t += pS->wSecond;
*pDayOfYear = t/(24L * 60L * 60L); //day of the year
while (y > 1970)
{
--y;
t += 365*24*60*60;
if ((y & 3) == 0)
t += 24*60*60;
}
pS->wDayOfWeek = (t/(24*60*60) + 4) % 7; // day of the week
return t;
}
//--------------------------------------------------------
long __helix_time(long *pTime)
{
long t;
SYSTEMTIME s;
int idoy;
::GetSystemTime(&s);
t = __helix_convertTime(&s,&idoy);
if (pTime)
*pTime = t;
return t;
}
//--------------------------------------------------------
long __helix_mktime(struct tm* pTm)
{
long t;
SYSTEMTIME s;
if (!pTm)
return 0;
s.wYear = pTm->tm_year+1900;
s.wMonth = pTm->tm_mon+1;
s.wDay = pTm->tm_mday;
s.wHour = pTm->tm_hour;
s.wMinute = pTm->tm_min;
s.wSecond = pTm->tm_sec;
t = __helix_convertTime(&s,&pTm->tm_yday);
pTm->tm_wday = s.wDayOfWeek;
return t;
}
#endif /* _WINCE */
#ifdef _OPENWAVE
#include "platform/openwave/hx_OpUtils.h"
time_t __helix_time(time_t* p)
{
time_t t = op_time();
if (p) *p = t;
return t;
}
struct tm *__helix_gmtime(const time_t *timep)
{
static struct tm structTM;
op_gmtime(op_time(), &structTM);
return &structTM;
}
time_t __helix_mktime(struct tm* tm)
{
// XXXSAB Assume that we're always dealing with UTC time?
return op_timegm(tm);
}
int __helix_gettimeofday(struct timeval *tv, void *tz)
{
int ret = 0;
static U32 carry = 0;
static const U32 carryIncrement = (UINT_MAX / 1000) + 1;
static U32 lastT = 0;
U32 t = op_getMSecs();
if (t < lastT)
{
carry += carryIncrement;
}
lastT = t;
U32 ts = t / 1000;
tv->tv_sec = ts + carry;
tv->tv_usec = 1000 * (t - ts * 1000);
return ret;
}
char * __helix_ctime(const time_t *timer)
{
char *st = NULL;
/*
struct op_tm {
S8 tm_sec; seconds (0 - 61)
S8 tm_min; minutes (0 - 59)
S8 tm_hour; hours (0 - 23)
S8 tm_mday; day of month (1 - 31)
S8 tm_mon; month of year (0 - 11)
S8 tm_wday; day of week (Sunday = 0)
S16 tm_year; year - 1900
S16 tm_yday; day of year (0 - 365)
*/
op_tm optm;
if (kTrue == op_gmtime(*timer, &optm))
{
/*
* based on iso c, return string is precisely 26 chars
* in the form of: Wed Jan 02 02:03:55 1980\n\0
*/
st = new char[26];
char *weekdays[] = {"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};
char *months[] = {"Jan", "Feb", "Mar", "Api", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"};
snprintf(st, 26, "%s %s %2u:%2u:%2u:%2u %4u\n\0", weekdays[optm.tm_wday],
months[optm.tm_mon],optm.tm_mday, optm.tm_hour, optm.tm_min, optm.tm_sec, optm.tm_year);
}
return st;
}
#endif /* _OPENWAVE */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -