我沒有找到一個簡單的方法來獲取本地時間和UTC時間之間的分鐘數。以相對於UTC的分鐘爲單位獲取本地時間偏移量的C代碼?
起初我打算使用tzset()
但它不提供夏令時。根據手冊頁,如果日光節約生效,它只是一個不同的整數。雖然通常是一個小時,但在某些國家可能是半小時。
我寧願避免計算當前UTC返回gmtime()
和localtime()
之間的時差。
更通用的解決方案會爲我提供指定位置和正值time_t值的信息,或者至少是本地的。
編輯1:使用情況是爲https://github.com/chmike/timez獲取正確的本地時間偏移量。 順便說一句,如果你認爲libc函數操作時間正確,請閱讀https://rachelbythebay.com/w/2013/03/17/time/。
編輯2:最好的和最簡單的解決方案,我至今計算時間以分鐘爲單位偏移UTC是
// Bogus: assumes DST is always one hour
tzset();
int offset = (int)(-timezone/60 + (daylight ? 60 : 0));
的問題是要確定真正的日光節約時間。
編輯3:受@trenki的回答啓發,我想出了以下解決方案。這是一個詭計,因爲它會哄騙mktime()
將gmtime()
的輸出視爲本地時間。當DST更改處於UTC時間和本地時間之間的時間範圍內時,結果不準確。
#include <stdio.h>
#include <time.h>
int main()
{
time_t rawtime = time(NULL);
struct tm *ptm = gmtime(&rawtime);
// Request that mktime() looksup dst in timezone database
ptm->tm_isdst = -1;
time_t gmt = mktime(ptm);
double offset = difftime(rawtime, gmt)/60;
printf("%f\n", offset);
return 0;
}
爲什麼需要這個?解釋更多關於背景;爲什麼你不能簡單地使用'gmtime'和'localtime'並且改變他們的'struct tm'?爲什麼你的用戶會關心本地時間偏移?並且有很多奇怪的情況(例如除夕,...) –
此外,您的問題很可能是特定於操作系統... AFAIK,[locale(7)](http://man7.org/linux/ man-pages/man7/locale.7.html)不在標準C99中,但在POSIX –
@BasileStarynkevitch語言環境在C99中,即使C89具有'strftime',唉只有'%Z'但不是'%z'。 – Jens