-
代码思路都是抄这篇文章的代码【C语言】UTC时间转换为北京时间, 在了解思路之前,首先我们得知道什么是时区简单的理解就是时间的分区,本初子午线为标准时(即+0),比如:中国时区为+8则 时区为东八区,美国加州时区为-8则,时区为西八区,世界上有26个时区,最大的东十四区(基里巴斯时间),最小的是西十二区(豪兰岛时间)。接下来了解一下时差,什么是时差呢?即不同时区的差别,例如:标准时与北京时间相差了8个小时,纽约时间与北京时间相差了12个小时,还有一个时间戳的概念,时间戳指1970-01-01 08:00:00到当前时间有多少秒即时间戳。
-
代码思路:
–> 第一步: 定义一个时间变量和时间结构体指针两个(不喜欢指针也可以用变量),分别是GMT标准时结构体和本地时间结构体。
–> 第二步: 使用time()函数获取时间戳,初始化标准时结构体和本地时结构体为空(不初始化也行),使用gmtime()获取标准时,将标准时的各种信息传递给标准时结构体。
–> 第三步: 接下来的核心代码就有点多了,请大家认真看完
-
函数返回值: 一个时间结构体指针,参数(标准时时间结构体, 时区时, 时区分 (定义时区分用来处理半时区的城市) )
-
首先定义年、月、年天、月天、星天、时、分,在定义两个变量来记录上个月的最大的总天数。
-
定义一个静态标准时结构体变量(记得别定义局部变量).
-
初始化
年份 = 标准时的年份;
月份 = 标准时的月份;
月天 = 标准时的月天;
星天 = 标准时的星天;
年天 = 标准时的年天;
小时 = 标准时的小时 + 时区时;
分钟 = 标准时的分钟 + 时区分; -
(月份的判断)1月大,2月小,3月大,4月小,5月大,6月小,7月大,8月大,9月小,10月大,11月小,12月大
如果 是大月,当月最大天数=31天,上个月最大天数=30天 其他如果 3月份的上个总天数,闰年=29天,平年=28天 其他如果 1月份的上个月总天数=31天,8月份上个月总天数=31天 其他如果 是小月,当月最大天数为=30天,上个月最大天数为=31天 其他 上个月最大天数=31天 如果 3月份的上个总天数,闰年=29天,平年=28天
- (时间的判断) 有东时区(为正数)和西时区(为负数)之分,时区有分半时区和全时区
1. 要判断是否为东时区 如果 时区时 >= 0 如果 标准时+时区分 >= 60 分钟 减等于 60 小时 加等于 01 如果 小时 >= 24 小时 减等于 24 月天 加等于 01 星天 加等于 01 年天 加等于 01 如果 星天 > 06 星天 减等于 06 如果 月天 > 当月最大天数 月天 减等于 当月最大天数 月加 加等于 01 如果 月份 > 12 月份 减等于 12 年份 加等于 01 如果 年天 > 当前年最大天数 年天 等于 0 如果 小时 >= 24 小时 减等于 24 月天 加等于 01 星天 加等于 01 年天 加等于 01 如果 星天 > 06 星天 减等于 06 如果 月天 > 当月最大天数 月天 减等于 当月最大天数 月加 加等于 01 如果 月份 > 12 月份 减等于 12 年份 加等于 01 如果 年天 > 当前年最大天数 年天 等于 0 其他 如果 时区分 == 0 并且 时区时 < 0 如果 小时 < 0 小时 加等于 24 月天 减等于 01 星天 减等于 01 年天 减等于 01 如果 星天 < 0 星天 等于 06 如果 月天 < 01 月天 等于 上个月最大天数 月加 减等于 01 如果 月份 < 当月最大天数 月份 等于 12 年份 减等于 01 如果 年天 < 0 年天 等于 当前年最大天数 其他 如果 分钟 < 0 分钟 加等于 60 小时 减等于 01 如果 小时 < 0 小时 加等于 24 月天 减等于 01 星天 减等于 01 年天 减等于 01 如果 星天 < 0 星天 等于 6 如果 月天 < 1 月天 等于 上个月的最大天数 月份 减等于 01 如果 月份 < 当月最大天数 月份 等于 12 年份 减等于 01 如果 年天 < 0 年天 等于 当前年最大天数 如果 小时 < 0 并且 时区分 != 0 小时 加等于 24 月天 减等于 01 星天 减等于 01 年天 减等于 01 如果 星天 < 0 星天 等于 6 如果 月天 < 1 月天 等于 上个月的最大天数 月份 减等于 01 如果 月份 < 当月最大天数 月份 等于 12 年份 减等于 01 如果 年天 < 0 年天 等于 当前年最大天数
最后使用浅复制的方法把修改后的数据复制过去.
最后返回这个块静态内存.
___________________________________________________________________________
3. 接下来是用之前的代码修改后的函数
#include#include #include #include static int is_leap(int __year) { int four = __year % 4; int hundred = __year % 100; int fourhundred = __year % 400; if (four == 0 && hundred == 0 && fourhundred == 0) { return (1); } else if (four == 0 && hundred != 0 && fourhundred != 0) { return (1); } else { return (0); } } static int max_yearday(int __year) { if (is_leap(__year)) { return (366 - 1); } else { return (365 - 1); } } struct tm* utc_to_local(struct tm* __utc, int __timezone_hour, int __timezone_min) { int year, month, mday, wday, yday, hour, minute; int lastday = 0; int lastday_of_lastmonth = 0; static struct tm __local = { 0 }; year = __utc->tm_year; month = __utc->tm_mon ; mday = __utc->tm_mday; wday = __utc->tm_wday; yday = __utc->tm_yday; hour = __utc->tm_hour + __timezone_hour; minute = __utc->tm_min + __timezone_min ; switch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: lastday = 31; lastday_of_lastmonth = 30; switch (month) { case 3: if (is_leap(year)) { lastday_of_lastmonth = 29; } else { lastday_of_lastmonth = 28; } break; } switch (month) { case 1: case 8: lastday_of_lastmonth = 31; break; } break; case 4: case 6: case 9: case 11: lastday = 30; lastday_of_lastmonth = 31; break; default: lastday_of_lastmonth = 31; if (is_leap(year)) { lastday_of_lastmonth = 29; } else { lastday_of_lastmonth = 28; } break; } } if ( __timezone_hour >= 0 ) { if (minute >= 60) { minute -= 60; hour += 1; if (hour >= 24) { hour -= 24; mday += 1; wday += 1; yday += 1; if (wday > 6) { wday -= 6; } if (mday > lastday) { mday -= lastday; month += 1; if (month >= 12) { month -= 12; year += 1; } } if (yday > max_yearday(year)) { yday = 0; } } } if (hour >= 24) { hour -= 24; mday += 1; wday += 1; yday += 1; if (wday > 6) { wday -= 6; } if (mday > lastday) { mday -= lastday; month += 1; if (month >= 12) { month -= 12; year += 1; } } if (yday > max_yearday(year)) { yday = 0; } } } else { if (__timezone_min == 0 && __timezone_hour < 0) { if (hour < 0) { hour += 24; mday -= 1; wday -= 1; yday -= 1; if (wday < 0) { wday = 6; } if (mday < 1) { mday = lastday_of_lastmonth; month -= 1; if (month < lastday) { month = 12; year -= 1; } } if (yday < 0) { yday = max_yearday(year); } } else { if (minute < 0) { minute += 60; hour -= 1; if (hour < 0) { hour += 24; mday -= 1; wday -= 1; yday -= 1; if (wday < 0) { wday = 6; } if (mday < 1) { mday = lastday_of_lastmonth; month -= 1; if (month < lastday) { month = 12; year -= 1; } } if (yday < 0) { yday = max_yearday(year); } } } if (hour < 0 && __timezone_min != 0) { hour += 24; mday -= 1; wday -= 1; yday -= 1; if (wday < 0) { wday = 6; } if (mday < 1) { mday = lastday_of_lastmonth; month -= 1; if (month < lastday) { month = 12; year -= 1; } } if (yday < 0) { yday = max_yearday(year); } } } } __local.tm_year = year; __local.tm_mon = month; __local.tm_mday = mday; __local.tm_wday = wday; __local.tm_yday = yday; __local.tm_hour = hour; __local.tm_min = minute; __local.tm_sec = __utc->tm_sec; __local.tm_isdst = __utc->tm_isdst; return &__local; } int main(int argc, char* argv[]) { time_t __time; struct tm* __local = NULL, * __gmt = NULL; system("cls"); system("mode con cols=64 lines=2"); while (!_kbhit()) { time(&__time); __gmt = gmtime(&__time); __local = utc_to_local(__gmt, -12, 00); printf("%02d-%02d-%02d %02d:%02d:%02d 星期%02d %02d的第%02d天n", __local->tm_year + 1900, __local->tm_mon + 1, __local->tm_mday, __local->tm_hour, __local->tm_min, __local->tm_sec, __local->tm_wday, __local->tm_year + 1900, __local->tm_yday + 1 ); _sleep(500); } return 0; }
- 实现的后的效果