2017-11-10 10 views
0

Ubuntu 16の現在のタイムゾーンでftimeとgettimeofdayの両方が0を返しています。タイムゾーンは、Ubuntuの日付と時刻の設定で正しく設定されています。 TZ env変数セットはありません。gettimeofdayタイムゾーンが間違っているのはなぜですか?

これは多くの異なる状況で使用されているプロダクションソフトウェアであるため、私は単に「修正」したくありません。だから私は、プログラムでタイムゾーン(そして現在のDSTオフセットも同様に)を得る信頼できる方法がほしいだけです。

私の試みは、これまで:

#if 0 
timeb tbTime; 
ftime(&tbTime); 
int CurTz = -tbTime.timezone; 
#else 
struct timeval tv; 
struct timezone tz; 
int r = gettimeofday(&tv, &tz); 
if (r) 
    return NO_ZONE; 

int CurTz = tz.tz_minuteswest; 
#endif 

「日付」コマンドが動作している:

[email protected]:~$ date +%Z 
AEDT 
[email protected]:~$ date +%z 
+1100 

私はちょうど「日付」をコールするプロセスを生成でき、それはとき利き非常に重いようですいくつかのAPIコールが利用可能です。 GNU/Linuxの

+0

これは私のために正しく動作します(TZ envも定義されていません)。 OSXでテスト済み。 –

+0

おそらく、異なるシステムには異なる設定があるからです。そのコードは、Windows上でうまく動作します。そしておそらく私のUbuntuは何とか壊れていますか?しかし、私はそれを現場に似ている「破った」システムで動作させる必要があります。 – fret

答えて

1

gettimeofdayの第2引数はかなり無駄ですし、常にNULLでなければなりません。 manual page for gettimeofdayには次のように書かれています。

タイムゾーン構造の使用は時代遅れです。 tz引数は通常はNULLとして指定する必要があります。でも、Linux以外のシステムで

は、tz_dsttimeは役に立たない意味を持っている(例えば、それが前に70年程度の短い期間のためにそうしたので、インドはDSTを使用していることを報告します)。

あなたは、現在の時刻の時間帯を取得する必要がある場合は、それが(例えばdaylightなどのグローバル変数をしていない)を生成localtimeまたはlocaltime_rを使用して、壊れたダウンタイムの構造を検討する必要があります。あなたはおそらく興味を持っているstruct tmメンバーはtm_isdsttm_gmtoff、そしておそらくtm_zoneです。後者の2つはglibc拡張です。

+0

だから私はまだ私がlocaltimeから欲しいものを得ることができません。 "date"コマンドが返す情報を取得するAPIはありますか? – fret

+0

'localtime'または' localtime_r'を使うことができます。私は私の答えを明確にしました。 –

関連する問題