為什么設置了時區以后,已經運行的程序在使用localtime函數調用時沒有使用新時區呢?這個可以通過glibc的源碼來回 答。localtime等涉及到本地所在時區的函數在調用的時候會先調用tzset這個函數,這一點可以通過tzset函數的manpage看出來。 tzset完成的工作是把當前時區信息(通過TZ環境變量或者/etc/localtime)讀入並緩沖。事實上tzset在實現的時候是通過內部的 tzset_internal函數來完成的,顯式的調用tzset會以顯式的方式告知tzset_internal,而單獨調用localtime的時候 是以隱式的方式告知tzset_internal,前者將強制tzset不管何種情況一律重新加載TZ信息或者/etc/localtime,而后者則是 只有在TZ發生變化,或者加載文件名發生變化的時候才會再次加載時區信息。因此,如果只是/etc/localtime的內容發生了變化,而文件名" /etc/localtime"沒有變化,則不會再次加載時區信息,導致localtime函數調用仍然以老時區轉換UTC時間到本地時間。
解決方法:在調用localtime之前調用tzset,則可強制刷新時區信息