擅长:python、mysql、java
<p>这花了我一些时间才弄明白,我希望它对其他人有用。在</p>
<p>像<code>localtime</code>这样的POSIX函数将使用环境变量<code>TZ</code>来确定要使用哪个时区。如果未设置<code>TZ</code>,则将使用系统的默认时区。在</p>
<p>如果我在Linux或osx下运行,<code>TZ</code>设置正确,一切正常。如果我在Windows上的shell中运行这个程序,<code>TZ</code>没有设置,因此函数返回操作系统的默认时区,这将再次产生正确的结果。在</p>
<p>如果我在一个Cygwin shell中运行,<code>TZ</code>被设置了-但是由于我使用MSVC,使用MSVC自己的stdc库来构建程序,它不能解释Cygwin的<code>TZ</code>变量。所以它默认为GMT</p>
<p>如果这个程序是在Cygwin下用GCC构建的,我敢打赌它在Cygwin shell中会正常工作。在</p>
<p>因此,答案是确保在调用POSIX时间函数(如<code>localtime()</code>)的程序中,如果希望时间函数在Cygwin shell下工作,则必须取消设置<code>TZ</code>。在</p>
<p>我是这样做的:</p>
<pre><code>void getLocalTime()
{
#ifdef WIN32
static bool unsetTZ = false;
if ( !unsetTZ )
{
putenv( "TZ=" );
unsetTZ = true;
}
#endif // !WIN32
time_t t;
t = time( NULL );
elog << "timezone: " << getenv( "TZ" )
<< ", current local time: " << asctime( localtime( &t ));
}
</code></pre>