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
- Linux 32位系统中的一些时间转换
- linux 系统中的时间
- linux系统中的时间
- Linux系统中的时间设定
- linux系统中的时间函数
- Linux系统中的一些重要文件
- string 转换为 32位时间time_t
- 时间转换位时间戳
- 32位linux系统调用
- linux系统中的时间及操作函数
- linux系统中的时间API和函数库
- php实现时间戳转换在32位系统下超过2038年的自定义处理函
- linux中的一些系统参数介绍
- linux系统原理中的一些理解D
- linux系统中CST与EDT时间转换以及系统时间与网络时间同步
- 查询linux是32位系统还是64位系统
- c#时间字符串转换位时间格式
- c#时间字符串转换位时间格式 .
- ping localhost 没反应解决方案
- Angular JS开发秘籍——互动出版网
- 232用两个栈实现队列
- 设计模式---策略模式(Strategy Pattern)
- 论HashMap、Hashtable、TreeMap、LinkedHashMap的内部排序
- Linux 32位系统中的一些时间转换
- pascal使用细节
- 算法基础(1)-枚举
- js瀑布流滚动加载
- iOS开发系列--地图与定位
- GitHub上史上最全的Android开源项目分类汇总
- 查看端口命名
- 十五道海量数据处理面试题
- Android 集成支付宝遇到 Unable to execute dex: Multiple dex files define