栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

C语言时间库操作-->协调时转本地时

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C语言时间库操作-->协调时转本地时

  1. 代码思路都是抄这篇文章的代码【C语言】UTC时间转换为北京时间, 在了解思路之前,首先我们得知道什么是时区简单的理解就是时间的分区,本初子午线为标准时(即+0),比如:中国时区为+8则 时区为东八区,美国加州时区为-8则,时区为西八区,世界上有26个时区,最大的东十四区(基里巴斯时间),最小的是西十二区(豪兰岛时间)。接下来了解一下时差,什么是时差呢?即不同时区的差别,例如:标准时与北京时间相差了8个小时,纽约时间与北京时间相差了12个小时,还有一个时间戳的概念,时间戳指1970-01-01 08:00:00到当前时间有多少秒即时间戳。

  2. 代码思路:
    –> 第一步: 定义一个时间变量和时间结构体指针两个(不喜欢指针也可以用变量),分别是GMT标准时结构体和本地时间结构体。
    –> 第二步: 使用time()函数获取时间戳,初始化标准时结构体和本地时结构体为空(不初始化也行),使用gmtime()获取标准时,将标准时的各种信息传递给标准时结构体。
    –> 第三步: 接下来的核心代码就有点多了,请大家认真看完


  3. 函数返回值: 一个时间结构体指针,参数(标准时时间结构体, 时区时, 时区分 (定义时区分用来处理半时区的城市) )

  4. 首先定义年、月、年天、月天、星天、时、分,在定义两个变量来记录上个月的最大的总天数。

  5. 定义一个静态标准时结构体变量(记得别定义局部变量).

  6. 初始化
    年份 = 标准时的年份;
    月份 = 标准时的月份;
    月天 = 标准时的月天;
    星天 = 标准时的星天;
    年天 = 标准时的年天;
    小时 = 标准时的小时 + 时区时;
    分钟 = 标准时的分钟 + 时区分;

  7. (月份的判断)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. (时间的判断) 有东时区(为正数)和西时区(为负数)之分,时区有分半时区和全时区
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;
}
  1. 实现的后的效果

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039758.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号