Linux 32位系统中的一些时间转换

来源:互联网 发布:tomcat修改端口不生效 编辑:程序博客网 时间:2024/05/21 17:47

在项目中用的一些时间转函数(修改long long型,避免int溢出):

#include <stdio.h>struct itm {    int tm_sec;       /* 秒 – 取值区间为[0,59] */    int tm_min;       /* 分 - 取值区间为[0,59] */    int tm_hour;      /* 时 - 取值区间为[0,23] */    int tm_mday;      /* 一个月中的日期 - 取值区间为[1,31] */    int tm_mon;       /* 月份(从一月开始,0代表一月) - 取值区间为[0,11] */    int tm_year;      /* 年份,其值等于实际年份减去1900 */    int tm_wday;      /* 星期 – 取值区间为[0,6],其中0代表星期天,1代表星期一,以此类推 */    int tm_yday;      /* 从每年的1月1日开始的天数 – 取值区间为[0,365],其中0代表1月1日,1代表1月2日,以此类推 *///    int tm_isdst;     /* 夏令时标识符,实行夏令时的时候,tm_isdst为正。不实行夏令时的进候,tm_isdst为0;不了解情况时,tm_isdst()为负。*/};typedef long long s64time_t;           /* 时间值 */unsigned long long_mktime(const unsigned int year0, const unsigned int mon0,       const unsigned int day, const unsigned int hour,       const unsigned int min, const unsigned int sec){unsigned int mon = mon0, year = year0;/* 1..12 -> 11,12,1..10 */if (0 >= (int) (mon -= 2)) {mon += 12;/* Puts Feb last since it has leap day */year -= 1;}return ((((unsigned long long)  (year/4 - year/100 + year/400 + 367*mon/12 + day) +  year*365 - 719499    )*24 + hour /* now have hours */  )*60 + min /* now have minutes */)*60 + sec; /* finally seconds */}/* * Nonzero if YEAR is a leap year (every 4 years, * except every 100th isn't, and every 400th is). */static long _isleap(long year){return (year) % 4 == 0 && ((year) % 100 != 0 || (year) % 400 == 0);}/* do a mathdiv for long type */static long math_div(long a, long b){return a / b - (a % b < 0);}/* How many leap years between y1 and y2, y1 must less or equal to y2 */static long leaps_between(long y1, long y2){long leaps1 = math_div(y1 - 1, 4) - math_div(y1 - 1, 100)+ math_div(y1 - 1, 400);long leaps2 = math_div(y2 - 1, 4) - math_div(y2 - 1, 100)+ math_div(y2 - 1, 400);return leaps2 - leaps1;}/* How many days come before each month (0-12). */static const unsigned short __mon_yday[2][13] = {/* Normal years. */{0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334, 365},/* Leap years. */{0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335, 366}};/** * time_to_tm - converts the calendar time to local broken-down time * * @totalsecsthe number of seconds elapsed since 00:00:00 on January 1, 1970, *Coordinated Universal Time (UTC). * @offsetoffset seconds adding to totalsecs. * @resultpointer to struct tm variable to receive broken-down time */#define SECS_PER_HOUR(60 * 60)#define SECS_PER_DAY(SECS_PER_HOUR * 24)void time_to_tm(s64time_t totalsecs, int offset, struct itm *result){long days, rem, y;const unsigned short *ip;days = totalsecs / SECS_PER_DAY;rem = totalsecs % SECS_PER_DAY;rem += offset;while (rem < 0) {rem += SECS_PER_DAY;--days;}while (rem >= SECS_PER_DAY) {rem -= SECS_PER_DAY;++days;}result->tm_hour = rem / SECS_PER_HOUR;rem %= SECS_PER_HOUR;result->tm_min = rem / 60;result->tm_sec = rem % 60;/* January 1, 1970 was a Thursday. */result->tm_wday = (4 + days) % 7;if (result->tm_wday < 0)result->tm_wday += 7;y = 1970;while (days < 0 || days >= (_isleap(y) ? 366 : 365)) {/* Guess a corrected year, assuming 365 days per year. */long yg = y + math_div(days, 365);/* Adjust DAYS and Y to match the guessed year. */days -= (yg - y) * 365 + leaps_between(y, yg);y = yg;}result->tm_year = y - 1900;result->tm_yday = days;ip = __mon_yday[_isleap(y)];for (y = 11; days < ip[y]; y--)continue;days -= ip[y];result->tm_mon = y;result->tm_mday = days + 1;}int get_week(struct itm time){    int c = time.tm_year / 100;    int y = time.tm_year - c*100;    int week = (c/4)- 2*c + (y+y/4) + (13*(time.tm_mon+1))/5 + time.tm_mday - 1;    while ( week < 0 )        week += 7;    return (week % 7);}int main(int argc, char *argv[]){    struct itm tm_time;    int year,month,day;    unsigned long long sec = 0;    sec = _mktime(2315, 7, 21, 2, 30, 30);    printf("sec: %lld\n", sec);    time_to_tm(sec, 0, &tm_time);    printf("%d-%d-%d %d:%d:%d week:%d\n", tm_time.tm_year+1900, tm_time.tm_mon+1, tm_time.tm_mday, tm_time.tm_hour, tm_time.tm_min, tm_time.tm_sec, tm_time.tm_wday);#if 0    while( scanf("%d%d%d",&year,&month,&day) != EOF ) {        int i,j,k;        int c = year/100;        int y = year-c*100;        int week = (c/4)- 2*c + (y+y/4) + (13*(month+1))/5 + day - 1;        while ( week < 0 )            week += 7;        week %=7 ;         switch(week) {            case 1: printf("Monday\n"); break;            case 2: printf("Tuesday\n"); break;            case 3: printf("Wednesday\n"); break;            case 4: printf("Thursday\n");break;            case 5: printf("Friday\n"); break;            case 6: printf("Saturday\n");break;            case 0: printf("Sunday\n"); break;        }    }#endif    return 0;}


0 0
原创粉丝点击