自己写 localtime 函数(含完整注释,代码)转载
2011-07-13 19:55
453 查看
localtime()在多线程中使用的少的时候是不会出错的
现localtime和ctime等函数在linux中的返回值均存放在一个静态区中,即TLS变量。如果在多线程程序中比较频繁的调用此函数,则可能出现内容错乱的情况。
//曾在某平台下多线程中使用localtime库函数。可恶的是,每当程序运行
//一段时间后,都要出现内存泄露。查了数个夜晚为什么,无从断定。
//只能狠狠心,自己写了个localtimes,功能与localtime库函数相同。
//有了它以后,我就不再因内存泄露而烦恼了。
//要知道“内存泄露”是程序员大的一大耻辱。
//这个localtimes在多线程下已经运行了3年,还没发生问题,放心使用。
//一年中每个月的天数,非闰年
const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/*++------------------------------------------------------------------------
Function:
localtimes
Modification History
Jurassic 2002.1 Created.
--------------------------------------------------------------------------*/
void
__stdcall
localtimes(
time_t time,
long timezone,
struct tm *tm_time
)
{
unsigned __int32 n32_Pass4year;
__int32 n32_hpery;
//计算时差
time=time-timezone;
if(time < 0)
{
time = 0;
}
//取秒时间
tm_time->tm_sec=(int)(time % 60);
time /= 60;
//取分钟时间
tm_time->tm_min=(int)(time % 60);
time /= 60;
//取过去多少个四年,每四年有 1461*24 小时
n32_Pass4year=((unsigned int)time / (1461L * 24L));
//计算年份
tm_time->tm_year=(n32_Pass4year << 2)+70;
//四年中剩下的小时数
time %= 1461L * 24L;
//校正闰年影响的年份,计算一年中剩下的小时数
for (;;)
{
//一年的小时数
n32_hpery = 365 * 24;
//判断闰年
if ((tm_time->tm_year & 3) == 0)
{
//是闰年,一年则多24小时,即一天
n32_hpery += 24;
}
if (time < n32_hpery)
{
break;
}
tm_time->tm_year++;
time -= n32_hpery;
}
//小时数
tm_time->tm_hour=(int)(time % 24);
//一年中剩下的天数
time /= 24;
//假定为闰年
time++;
//校正润年的误差,计算月份,日期
if ((tm_time->tm_year & 3) == 0)
{
if (time > 60)
{
time--;
}
else
{
if (time == 60)
{
tm_time->tm_mon = 1;
tm_time->tm_mday = 29;
return ;
}
}
}
//计算月日
for (tm_time->tm_mon = 0; Days[tm_time->tm_mon] < time;tm_time->tm_mon++)
{
time -= Days[tm_time->tm_mon];
}
tm_time->tm_mday = (int)(time);
return;
}
现localtime和ctime等函数在linux中的返回值均存放在一个静态区中,即TLS变量。如果在多线程程序中比较频繁的调用此函数,则可能出现内容错乱的情况。
//曾在某平台下多线程中使用localtime库函数。可恶的是,每当程序运行
//一段时间后,都要出现内存泄露。查了数个夜晚为什么,无从断定。
//只能狠狠心,自己写了个localtimes,功能与localtime库函数相同。
//有了它以后,我就不再因内存泄露而烦恼了。
//要知道“内存泄露”是程序员大的一大耻辱。
//这个localtimes在多线程下已经运行了3年,还没发生问题,放心使用。
//一年中每个月的天数,非闰年
const char Days[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
/*++------------------------------------------------------------------------
Function:
localtimes
Modification History
Jurassic 2002.1 Created.
--------------------------------------------------------------------------*/
void
__stdcall
localtimes(
time_t time,
long timezone,
struct tm *tm_time
)
{
unsigned __int32 n32_Pass4year;
__int32 n32_hpery;
//计算时差
time=time-timezone;
if(time < 0)
{
time = 0;
}
//取秒时间
tm_time->tm_sec=(int)(time % 60);
time /= 60;
//取分钟时间
tm_time->tm_min=(int)(time % 60);
time /= 60;
//取过去多少个四年,每四年有 1461*24 小时
n32_Pass4year=((unsigned int)time / (1461L * 24L));
//计算年份
tm_time->tm_year=(n32_Pass4year << 2)+70;
//四年中剩下的小时数
time %= 1461L * 24L;
//校正闰年影响的年份,计算一年中剩下的小时数
for (;;)
{
//一年的小时数
n32_hpery = 365 * 24;
//判断闰年
if ((tm_time->tm_year & 3) == 0)
{
//是闰年,一年则多24小时,即一天
n32_hpery += 24;
}
if (time < n32_hpery)
{
break;
}
tm_time->tm_year++;
time -= n32_hpery;
}
//小时数
tm_time->tm_hour=(int)(time % 24);
//一年中剩下的天数
time /= 24;
//假定为闰年
time++;
//校正润年的误差,计算月份,日期
if ((tm_time->tm_year & 3) == 0)
{
if (time > 60)
{
time--;
}
else
{
if (time == 60)
{
tm_time->tm_mon = 1;
tm_time->tm_mday = 29;
return ;
}
}
}
//计算月日
for (tm_time->tm_mon = 0; Days[tm_time->tm_mon] < time;tm_time->tm_mon++)
{
time -= Days[tm_time->tm_mon];
}
tm_time->tm_mday = (int)(time);
return;
}
相关文章推荐
- 自己写 localtime 函数(含完整注释,代码)
- 自己写 localtime 函数(含完整注释,代码)
- 自己模拟strlen库函数写的功能函数my_strlen实现strlen的功能,完整代码
- 自己模拟strcpy库函数写的功能函数my_strcpy实现strcpy的功能,完整代码
- 自己模拟strcmp库函数写的功能函数my_strcmp实现strcmp的功能,完整代码
- WIN32简单的窗体代码,带函数功能注释
- 避免代码注释的五大理由[转载]
- 量子编程详解之一: QP-nano代码大餐之状态机函数详细注释
- 复制文章出现文章转载来自己xxx的代码
- 整洁代码之道 [3] - 函数,注释,和格式
- uboot中C语言代码入口函数(start_armboot)的注释
- php分页函数完整实例代码
- 最基本的C++ 窗口程序代码及完整注释
- ARM SMP 系统启动linux (转载)---有加上自己的注释
- C#新手入门代码 类的函数成员的参数是类自己的实例(很有趣的例子)
- C++统计代码注释行数 & 有效代码行数 & 代码注释公共行 & 函数个数
- 完整禁止查看网页源代码的写法、onload加载两个函数
- openCV实现多人脸检测,多眼部检测,完整代码和详细注释
- 模仿JQuery.extend函数扩展自己对象的js代码
- [转载]LCC编译器的源程序分析(44)函数名称的代码生成