秒数和日期间的相互转换

一下程序实现从1970/1/1 0:0:0开始的秒数到对应日期的变化

比如秒数为1,对应日期1970/1/1 0:0:1

源文件:

#include "rtc.h"

#define SEC_PER_DAY        86400
#define SEC_PER_HOUR    3600
#define DAY_PER_4YEAR    1461

static const int __day_in_leapyear[13]        = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366};
static const int __day_in_commonyear[13]    = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365};
static const int __day_in_4year[5]            = { 0, 365, 730, 1096, 1461};

static const time __timebase = { 1970, 1, 1, 0, 0, 0, 0 };

static int __memcpy(void *dst0, const void *src0, int n)
{
    char *src, *dst;
    src = (char *) src0;
    dst = (char *) dst0;
    while(n--)
    {
        *dst++ = *src++;
    }
    return 0;
}

int    SecToTime(long n_Sec, time * p_Time)
{
    long t;
    int i;
    const int * day_in_year;
    if( n_Sec < 0 )
        return 0;
    __memcpy( p_Time, &__timebase, sizeof(time));
    t = n_Sec % SEC_PER_DAY;
    p_Time->hour = t / SEC_PER_HOUR;
    t %= SEC_PER_HOUR;
    p_Time->minute = t / 60;
    p_Time->second = t % 60;

    t = n_Sec / SEC_PER_DAY;
    p_Time->year += 4 * (t/DAY_PER_4YEAR);
    t %= DAY_PER_4YEAR;
    for(i=0;i<4;i++)
    {
        if(t >= __day_in_4year[i] && t < __day_in_4year[i+1])
            break;
    }
    p_Time->year += i;
    if(i == 2)
        day_in_year = __day_in_leapyear;
    else
        day_in_year = __day_in_commonyear;
    t -= __day_in_4year[i];
    for(i=0;i<12;i++)
    {
        if(t >= day_in_year[i] && t < day_in_year[i+1])
            break;
    }
    p_Time->month += i;
    t -= day_in_year[i];
    p_Time->day += t;
    return 1;
}

int    TimeToSec(time * p_Time)
{
    long res;
    long t;
    const int *day_in_year;
    if( p_Time->year % 4 == 0 )
        day_in_year = __day_in_leapyear;
    else
        day_in_year = __day_in_commonyear;
    res = 0;
    res += day_in_year[ p_Time->month - __timebase.month] * SEC_PER_DAY;
    res += ( p_Time->day    - __timebase.day    ) * SEC_PER_DAY;
    res += ( p_Time->hour    - __timebase.hour    ) * SEC_PER_HOUR;
    res += ( p_Time->minute - __timebase.minute ) * 60;
    res += ( p_Time->second - __timebase.second );
    t = p_Time->year - __timebase.year;
    res += t/4 * __day_in_4year[4] * SEC_PER_DAY;
    t %= 4;
    res += __day_in_4year[t] * SEC_PER_DAY;
    return res;
}

头文件:

/**
 *  this file implement the convertion of seconds and date/time
 */
#ifndef __RTC_H__
#define __RTC_H__

#include <memory.h>

typedef struct time {
    int year;
    int month;
    int day;
    int hour;
    int minute;
    int second;
    int milisecond;
} time ;


extern int    SecToTime(long n_Sec, time * p_Time);
extern int    TimeToSec(time * p_Time);#endif /*__RTC_H__*/
posted @ 2012-04-19 20:58  wulax  阅读(599)  评论(0编辑  收藏  举报