改變Ubuntu時區以及實作ISO8601標準時間格式
ISO8601是一種國際標準時間表示格式,細節請參考Wiki條目
https://zh.wikipedia.org/wiki/ISO_8601
用date可以查看電腦上的時區
$ date +%z
+0800
如果要設定時區,請將環境變數TZ設定成下面網站提供的城市時區字串
https://whatbox.ca/wiki/Changing_Your_Bash_Timezone
例如:
美國紐約(-4:00)是America/New_York
$ export TZ=America/New_York
而台北(+8:00)是Asia/Taipei
$ export TZ=Asia/Taipei
沒有用export的話不會改date的時區
如果也可以可以找/usr/share/zoneinfo/裡面有的時區資料來用
$ find /usr/share/zoneinfo/ -name Taipei
/usr/share/zoneinfo/right/Asia/Taipei
/usr/share/zoneinfo/Asia/Taipei
/usr/share/zoneinfo/posix/Asia/Taipei
下面是我用C/C++的strftime實作ISO 8601標準時間格式,不過Windows和Ubuntu上有些不同,Windows上用dev C++開發時發現localtime回傳的結構是沒有gmtoff欄位的,所以回傳的時間資料可以直接使用,而Ubuntu上會有gmtoff,表示時區位移資料,需要額外處理時區資訊。
#include <time.h>#include <stdio.h>
int main(void)
{
struct tm *local;
time_t t;
#ifndef _WIN32
struct tm s_tl, s_tgm;
time_t tl, tgm;
#endif
char buff[64] = {0};
char buff2[64] = {0};
t = time(NULL); // get current time in sec
#ifndef _WIN32
// not found below functions in dev c++
tl = timelocal(&s_tl);
tgm = timegm(&s_tgm);
#endif
//https://www.gnu.org/software/libc/manual/html_node/Time-Zone-Functions.html
local = localtime(&t);
printf("Local time and date: %s", asctime(local));
#ifndef _WIN32
printf(" gmtoff: %ld\n", local->tm_gmtoff);
#endif
strftime(buff, sizeof(buff), "%Y-%m-%dT%H:%M:%S%z", local); // +0800
printf(" ISO8601(format1) %s\n",buff);
strftime(buff, sizeof(buff), "%Y-%m-%dT%H:%M:%S", local);
//snprintf(buff2, sizeof(buff2), "%s%+03ld:%02ld", buff,-timezone/60/60,-timezone/60%60);
snprintf(buff2, sizeof(buff2), "%s%+03ld:%02ld", buff,local->tm_gmtoff/60/60,local->tm_gmtoff/60%60);
printf(" ISO8601(format2) %s\n",buff2);
// from wiki
// If the time is in UTC, add a Z directly after the time without a space. Z is the zone designator for the zero UTC offset.
local = gmtime(&t);
printf("\n\nUTC/GMT time and date: %s", asctime(local));
#ifndef _WIN32
printf(" gmtoff: %ld\n", local->tm_gmtoff);
if (local->tm_gmtoff != 0) {
fprintf(stderr,"ERROR: the gmtoff field of gmtime() is not ZERO??");
} else {
#endif
strftime(buff, sizeof(buff), "%Y-%m-%dT%H:%M:%SZ", local);
printf(" ISO8601 %s\n",buff);
#ifndef _WIN32
}
#endif
return 0;
}
留言