聯系我們 - 廣告服務 - 聯系電話:
您的當前位置: > 關注 > > 正文

環球觀速訊丨代碼執行的意思是什么?代碼執行詳情介紹

來源:CSDN 時間:2023-03-10 15:13:13

如上例所示,

代碼段


(資料圖片)

setenv( "TZ", "CST-08", 1 );//設置東八區 北京時間    tzset();//  這條代碼執行的意思是什么?待解決。

轉載:TZ環境變量,時區,夏令時_pirate_sir的博客-CSDN博客_tz環境變量

#include#include#include#include/** *  * TZ環境變量,時區,夏令時 * 當前demon測試環境: 1.32為系統; 2.系統時區是UTC。 *  */ int main(){time_t now = 0; char * TZ = NULL;  struct tm *tm_ = NULL; struct timeval tval = {0,0}; struct timezone tzone = {0,0};TZ = getenv("TZ");printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ );now = time(NULL); //1970到現在的UTC時間的秒數;printf("time_t = %ld, ctime: = %s", now, ctime(&now) ); //char* ctime(const time_t *timer)返回一個表示當地時間的字符串(包含一個換行符),當地時間是基于參數 timer。gettimeofday(&tval, &tzone);printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime); tm_ = gmtime(&now);                  //轉換成UTC世界時間printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);    tm_ = localtime(&now);               //轉換成本地時間printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec); printf("\n");   setenv("TZ", "CST-8", 1);//設置時區(中國東八區) TZ = getenv("TZ");printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ ); now = time(NULL);printf("time_t = %ld, ctime: = %s", now, ctime(&now) ); gettimeofday(&tval, & tzone);printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);tm_ = gmtime(&now);            printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);    tm_ = localtime(&now);        printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec); printf("\n");  setenv("TZ", "NZST-12:00:00", 1);//設置時區(新西蘭標準時間) TZ = getenv("TZ");printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ ); now = time(NULL);printf("time_t = %ld, ctime: = %s", now, ctime(&now) ); gettimeofday(&tval, & tzone);printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);tm_ = gmtime(&now);            printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);    tm_ = localtime(&now);          printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec); printf("\n");  /** *  * NZDT-13:00:00,M10.1.0,M3.3.0 *  * NZST,表示新西蘭標準時間; *  * -12:00:00表示比UTC早12小時; *  * NZDT,表示新西蘭夏時制時間; *  * -13:00:00,表示夏時制時間比UTC早13小時(即比標準時間快1小時); *  * M10.1.0,M3.3.0表示夏令時從10月第一個星期日02:00:00開始到3月第三個星期日02:00:00結束。 * ==>m:指一年中的第幾月(1 < = m <=>w:指一個月中的第幾周(1 <= w <=>d:指一周中的第幾天(0 <= d < =>time:該字段表示本地時間對夏時制生效或結束的時間,如果省略默認為02:00:00。 * */setenv("TZ", "NZST-12:00:00NZDT-13:00:00,M10.1.0,M3.3.0", 1);//設置時區(新西蘭夏令時時間) TZ = getenv("TZ");printf("====================================> TZ = %s\n", TZ == NULL?"env TZ not seted" : TZ ); //while(1){now = time(NULL);printf("time_t = %ld, ctime: = %s", now, ctime(&now) ); gettimeofday(&tval, & tzone);printf("gettimeofday tval.tv_sec = %d, tval.tv_usec = %d; tzone.tz_minuteswest = %d, tzone.tz_dsttime = %d.\n", \tval.tv_sec, tval.tv_usec, tzone.tz_minuteswest, tzone.tz_dsttime);tm_ = gmtime(&now);            printf("gmtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec);    tm_ = localtime(&now);         printf("localtime: dstflag = %d, %d-%d-%d %d:%d:%d\n",tm_->tm_isdst, tm_->tm_year + 1900, tm_->tm_mon+1, tm_->tm_mday, tm_->tm_hour, tm_->tm_min, tm_->tm_sec); printf("\n");sleep(5);} return 0;}

#bash中export TZ CST-8 #設置為東八區時間 #c程序中setenv("TZ", "CST-8", 1);

轉載:linux的時區設置函數tzset()_eric_zl_zhang的博客-CSDN博客_linux設置時區函數

本文轉載于:  http://hi.baidu.com/peruke/blog/item/b8de06ec6a04583b27979132.html

tzset#includevoid tzset(void);

設置時間環境變量。 說明 tzset()函數使用環境變量TZ的當前設置把值賦給三個全局變量:daylight,timezone和tzname。 這些變量由ftime和localtime函數使用校正格林威治(UTC)時間為本地時間,通過time函數從系統時間計算UTC,使用如下語法設置TZ環境變量:

set TZ=tzn[+|-]hh[:mm[:ss]][dzn]

tzn:三字母時區名,例如PST,你必須指出本地時間距UTC的偏移量。 hh:UTC與本地時間的時差,任選帶符號的。 mm:分鐘,由冒號(:)與hh分隔開。 ss:秒鐘,用冒號(:)與mm分隔開。 dzn:三字母夏令時時區例如PDT。如果夏令時沒作用,設置TZ時不設置dzn的值。C運行庫假設在計算夏令時(DST)時執行美國的規則。

其實tzn和dzn可為任意3個字母,只要中間的時差設置正確,localtime()和gmtime()函數調用都會處理正確。要注意一點,比如要將時區TZ設置為中國所在的東八區(即UTC+8:00),不使用夏令時,使用如下語句:

setenv("TZ", "GMT-8", 1);

注意是GMT-8而不是GMT+8,要不就設為了西八區,要比UTC還慢8個小時,這一點比較令人費解。

例如,為了設置TZ環境為德國對應的當前時區,你可以使用如下語句之一: set TZ=GST-1GDT set TZ=GST+1GDT 這些字符串使用GST指出德國標準時間,假設德國是超前UTC一個小時,并假設夏令時起作用。 如果TZ值沒設置,tzset試圖使用操作系統指定的時區信息,在Windwos NT和Windows95之下,這個信息指定在控制面版的日期/時間應用中,如果tzset不能獲取這些信息,它缺省使用PST8PDT,它指定為太平洋標準時間。

基于TZ環境變量的值,當調用tzset時把如下值賦給全局變量daylight、timezone和tzname: 全局變量    說明                                                     缺省值 daylight      如果在TZ設置中指定夏令時時區          1則為非0值;否則為0 timezone    UTC和本地時間之間的時差,單位為秒   28800(28800秒等于8小時) tzname[0] TZ環境變量的時區名稱的字符串值        如果TZ未設置則為空 PST tzname[1]   夏令時時區的字符串值;                        如果TZ環境變量中忽略夏令時時區則為空PDT在上表中daylight和tzname數組的缺省值對應于"PST8PDT"。

如果從TZ環境變量忽略DST時區,daylight的值為0,ftime,gmtime和localtime函數對于它們的DST標志返回0。 例子

/ * TZSET.C: This program first sets up the time zone by* placing the variable named TZ=EST5 in the environment* table. It then uses tzset to set the global variables*  named daylight, timezone, and tzname.*/ #include#include#includevoid main( void )  {if( putenv( "TZ=EST5EDT" ) == -1 ) {printf( "Unable to set TZ/n" );exit( 1 ); } else {     tzset(); printf( "daylight = %d\n", daylight );     printf( "timezone = %ld\n", timezone );     printf( "tzname[0] = %s\n", tzname[0] ); } exit( 0 ); }

輸出  daylight = 1  timezone = 18000  tzname[0] = EST

參見 asctime,ftime,gmtime,localtime,time,utime

首先要說明的是我的系統是fedora,其他系統可能不完全相同。

1,時間保存在硬件實時鐘(RTC)中,RTC由主板電池供電,即使關斷電源也不會造成時間丟失。

2,系統啟動時從RTC獲取時間,這個步驟在rc.sysinit中做:

a,首先從/etc/sysconfig/clock中獲取RTC相關參數UTC/ARC/SRM。UTC為true表示RTC保存的時間是UTC時間,false表示保存的是本地時間。ARC與SRM的含義參考hwclock的manpage,一般false即可;

b,根據上面獲取的內容構造hwclock命令的參數,將時間由RTC讀取到系統時鐘。

*需要說明的一點是hwclock的輸出是本地時間,localtime/utc參數只是用來告訴hwclock命令COMS時區是哪個時區。比如Linux系統的系統時區設置為CST(中國標準時間),COMS時間采用墻上時間,即COMS時區也是CST,這時如果使用--utc參數,會讓hwclock誤以為COMS時區為UTC,所以輸出的時間會自動+8。

3,tzset():tzset在程序中用來初始化tzname等全局變量,它首先試圖從環境變量“TZ”中獲取時區,如果TZ環境變量存在,即getenv("TZ")返回值不為NULL,且包含內容有效,則使用TZ值;如果該變量存在但內容無效,比如包含錯誤的時區名字,則使用UTC;如果該變量不存在,即getenv("TZ")返回NULL,則查找系統時區設置文件,一般是/etc/localtime。localtime所指文件的內容格式可參考tzfile(5)。

4,time():返回自00:00:00 UTC, January 1, 1970到現在所經過的秒數,注意,是UTC。

5,ctime()/localtime()/mktime():這類和時區相關的函數內部會調用tzset,但只是第一次調用tzset會做實際初始化,后面的調用都是直接返回。

6,系統關閉時,如執行shutdown/reboot/poweroff/halt等操作后,系統時間會保存到RTC中,這是在halt腳本中完成的,參看/etc/init.d/halt內容。

責任編輯:

標簽:

相關推薦:

精彩放送:

新聞聚焦
Top 岛国精品在线