C语言程序对夏令时的处理
                                                            生活随笔
收集整理的這篇文章主要介紹了
                                C语言程序对夏令时的处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.                        
                                背景
在設備應用中,用戶需要根據自己的時區設置設備時區。在可交互的系統中或者完整的linux系統中可以通過設置/etc/TZ等時區文件鏈接的文件來修改設備時區。但是在一些rtos或者不能使用上面設置TZ文件方式的系統中,可以通過設置應用進程的TZ環境變量的方式來設置時區,此時在通過localtime等函數轉換的時間就是本地時間了。
效果展示
$ make test ./timezone Europe/London ts 1647169200, date 2022-03-13 11:00:00 America/Anchorage ts 1647169199, date 2022-03-13 01:59:59 America/Anchorage ts 1647169200, date 2022-03-13 03:00:00 Australia/Adelaide ts 1647169200, date 2022-03-13 21:30:00Europe/London ts 1648917000, date 2022-04-02 17:30:00 America/Anchorage ts 1648917000, date 2022-04-02 08:30:00 Australia/Adelaide ts 1648916999, date 2022-04-03 02:59:59 Australia/Adelaide ts 1648917000, date 2022-04-03 02:00:00代碼展示
citylist.h
#ifndef __CITYLIST_H_ #define __CITYLIST_H_static const char cityList[][2][128]={{ "Pacific/Midway", "SST11" },{ "Pacific/Honolulu", "HST10" },{ "America/Anchorage", "AKST9AKDT,M3.2.0,M11.1.0" },{ "America/Los_Angeles", "PST8PDT,M3.2.0,M11.1.0" },{ "America/Tijuana", "PST8PDT,M3.2.0,M11.1.0" },{ "America/Phoenix", "MST7" },{ "America/Chihuahua", "MST7MDT,M4.1.0,M10.5.0" },{ "America/Denver", "MST7MDT,M3.2.0,M11.1.0" },{ "America/Costa_Rica", "CST6" },{ "America/Chicago", "CST6CDT,M3.2.0,M11.1.0" },{ "America/Mexico_City", "CST6CDT,M4.1.0,M10.5.0" },{ "America/Regina", "CST6" },{ "America/Bogota", "<-05>5" },{ "America/New_York", "EST5EDT,M3.2.0,M11.1.0" },{ "America/Caracas", "<-04>4" },{ "America/Barbados", "AST4" },{ "America/Halifax", "AST4ADT,M3.2.0,M11.1.0" },{ "America/Manaus", "<-04>4" },{ "America/Santiago", "" },{ "America/St_Johns", "NST3:30NDT,M3.2.0,M11.1.0" },{ "America/Sao_Paulo", "<-03>3" },{ "America/Argentina/Buenos_Aires", "<-03>3" },{ "America/Godthab", "" },{ "America/Montevideo", "<-03>3" },{ "Atlantic/South_Georgia", "<-02>2" },{ "Atlantic/Azores", "<-01>1<+00>,M3.5.0/0,M10.5.0/1" },{ "Atlantic/Cape_Verde", "<-01>1" },{ "Africa/Casablanca", "<+01>-1" },{ "Europe/London", "GMT0BST,M3.5.0/1,M10.5.0" },{ "Europe/Amsterdam", "CET-1CEST,M3.5.0,M10.5.0/3" },{ "Europe/Belgrade", "CET-1CEST,M3.5.0,M10.5.0/3" },{ "Europe/Brussels", "CET-1CEST,M3.5.0,M10.5.0/3" },{ "Europe/Sarajevo", "CET-1CEST,M3.5.0,M10.5.0/3" },{ "Africa/Windhoek", "CAT-2" },{ "Africa/Brazzaville", "WAT-1" },{ "Asia/Amman", "EET-2EEST,M3.5.4/24,M10.5.5/1" },{ "Europe/Athens", "EET-2EEST,M3.5.0/3,M10.5.0/4" },{ "Europe/Istanbul", "<+03>-3" },{ "Asia/Beirut", "EET-2EEST,M3.5.0/0,M10.5.0/0" },{ "Africa/Cairo", "EET-2" },{ "Europe/Helsinki", "EET-2EEST,M3.5.0/3,M10.5.0/4" },{ "Asia/Jerusalem", "" },{ "Europe/Minsk", "<+03>-3" },{ "Africa/Harare", "CAT-2" },{ "Asia/Baghdad", "<+03>-3" },{ "Europe/Moscow", "MSK-3" },{ "Asia/Kuwait", "<+03>-3" },{ "Africa/Nairobi", "EAT-3" },{ "Asia/Tehran", "<+0330>-3:30<+0430>,J79/24,J263/24" },{ "Asia/Baku", "<+04>-4" },{ "Asia/Tbilisi", "<+04>-4" },{ "Asia/Yerevan", "<+04>-4" },{ "Asia/Dubai", "<+04>-4" },{ "Asia/Kabul", "<+0430>-4:30" },{ "Asia/Karachi", "PKT-5" },{ "Asia/Oral", "<+05>-5" },{ "Asia/Yekaterinburg", "<+05>-5" },{ "Asia/Calcutta", "IST-5:30" },{ "Asia/Colombo", "<+0530>-5:30" },{ "Asia/Katmandu", "<+0545>-5:45" },{ "Asia/Almaty", "<+06>-6" },{ "Asia/Rangoon", "<+0630>-6:30" },{ "Asia/Krasnoyarsk", "<+07>-7" },{ "Asia/Bangkok", "<+07>-7" },{ "Asia/Jakarta", "WIB-7" },{ "Asia/Shanghai", "CST-8" },{ "Asia/Hong_Kong", "HKT-8" },{ "Asia/Irkutsk", "<+08>-8" },{ "Asia/Kuala_Lumpur", "<+08>-8" },{ "Australia/Perth", "AWST-8" },{ "Asia/Taipei", "CST-8" },{ "Asia/Seoul", "KST-9" },{ "Asia/Tokyo", "JST-9" },{ "Asia/Yakutsk", "<+09>-9" },{ "Australia/Adelaide", "ACST-9:30ACDT,M10.1.0,M4.1.0/3" },{ "Australia/Darwin", "ACST-9:30" },{ "Australia/Brisbane", "AEST-10" },{ "Australia/Hobart", "AEST-10AEDT,M10.1.0,M4.1.0/3" },{ "Australia/Sydney", "AEST-10AEDT,M10.1.0,M4.1.0/3" },{ "Asia/Vladivostok", "<+10>-10" },{ "Pacific/Guam", "ChST-10" },{ "Asia/Magadan", "<+11>-11" },{ "Pacific/Majuro", "<+12>-12" },{ "Pacific/Auckland", "NZST-12NZDT,M9.5.0,M4.1.0/3" },{ "Pacific/Fiji", "" },{ "Pacific/Tongatapu", "<+13>-13" } };#endifmain.c
#include <stdio.h> #include <string.h> #include <time.h> #include <stdlib.h>#include "citylist.h"/*** @brief 根據設置的地區設置時區* */ int setTimeZone( const char *pRegion ) {int ret = 0;for( int i=0; i<sizeof(cityList)/2/128; i++ ){/* printf("--->%s,%d,%s\n", pRegion, i, cityList[i][0]); */if( strcmp( pRegion, cityList[i][0] ) == 0 ){setenv( "TZ", cityList[i][1], 1 );break;}}tzset();return ret; }void printTime( const char *pRegion, time_t ts ) {setTimeZone(pRegion);struct tm *date = localtime( &ts );printf("%-20s ts %lu, date %4d-%02d-%02d %02d:%02d:%02d\n", pRegion, ts, date->tm_year+1900, date->tm_mon+1, date->tm_mday, date->tm_hour, date->tm_min, date->tm_sec); }int main() {time_t ts;ts = 1647169200;printTime( "Europe/London", ts );printTime( "America/Anchorage", ts-1 );printTime( "America/Anchorage", ts );printTime( "Australia/Adelaide", ts );printf("\n\n");ts = 1648917000;printTime( "Europe/London", ts );printTime( "America/Anchorage", ts );printTime( "Australia/Adelaide", ts-1 );printTime( "Australia/Adelaide", ts );return 0; }Makefile
taget=timezoneall: $(taget)$(taget): main.cgcc -o $@ $^test: $(taget)./$(taget)clean:rm $(taget)拓展
其中citylist.h中的城市列表中的環境變量是從linux的時區文件中提取的。
 提取環境變量的代碼為:
 tzif-display.c
編譯執行:
$ gcc tzif-display.c $ ./a.out Cuba tz = CST5CDT,M3.2.0/0,M11.1.0/1如上就可以提取Cuba的環境變量為CST5CDT,M3.2.0/0,M11.1.0/1,根據需要提取對應的城市地區的環境變量
總結
以上是生活随笔為你收集整理的C语言程序对夏令时的处理的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 2020-Android-大厂面试(五)
- 下一篇: AHU校赛网赛解题报告
