改變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;
}


留言