求助: localtime和时区问题

求助: localtime和时区问题

大家有没有碰到这种情况

程序A.pl运行中定时用localtime获取本地时间
比如此时取到的时间串是
2008-03-07-11-20-53

然后重新设置系统时区
[root@xx34 ~]# date
五  3月  7 11:20:58 CST 2008
[root@xx34 ~]# cp /usr/share/zoneinfo/America/New_York  /etc/localtime
cp:是否覆盖‘/etc/localtime’? y
[root@xx34 ~]# date
四  3月  6 22:21:20 EST 2008

但还在运行的A.pl用localtime获取的时间却是
2008-03-07-11-21-53
而不是
2008-03-06-22-21-53

但重新启动A.pl再取到的时间却是正确的

有没什么办法解决, 不想去重启程序

先谢过了^_^
既然是定时获取,你应该用的是crond吧,把crond 的时间调的短一点,譬如一分钟
还有就是用如下方法去取时间
`date '+%m/%d/%y'`
谢谢!

QUOTE:
原帖由 weiming_ni 于 2008-3-7 12:57 发表
既然是定时获取,你应该用的是crond吧,把crond 的时间调的短一点,譬如一分钟

不是用crontab调用, 是程序本身定时获取

QUOTE:
原帖由 weiming_ni 于 2008-3-7 12:58 发表
还有就是用如下方法去取时间
`date '+%m/%d/%y'`

这个是可以, 但觉得不是很好
隔了这么久,今天才找到解决方法, 呵呵

由于程序是作为daemon运行的
在运行过程中会调用到localtime函数
如果在程序运行中时区发生变化
但localtime得到的本地时间还是以最初得到的时区为标准转换的
所以得到的本地时间是错误的

这个是因为perl的localtime是基于C的,
简单地说,
如果TZ环境变量没有变化或者时区配置文件/etc/localtime没有改变文件名
则不会重新加载时区信息

在调用localtime之前调用tzset,则可强制刷新时区信息
例:
use POSIX qw/tzset/;
  tzset();
  my ($sec,$min,$hour,$mday,$mon,$year,@temp) = localtime();
这样得到的本地时间就是正确的

参考:http://blog.donews.com/quickmouse/archive/2008/05/08/1287733.aspx
你直接把$^T内置变量改了就好了


QUOTE:
原帖由 churchmice 于 2008-5-20 14:27 发表
你直接把$^T内置变量改了就好了

$^T  跟时区有什么关系?
不明白如何改这个变量,使得localtime在时区改变时取得的本地时间是正确的?


QUOTE:
原帖由 iceberg77 于 2008-5-20 15:48 发表


$^T  跟时区有什么关系?
不明白如何改这个变量,使得localtime在时区改变时取得的本地时间是正确的?

我错了
看成如何改变perl脚本运行的起始时间信息了

QUOTE:
$^T     The time at which the program began running, in seconds since
               the epoch (beginning of 1970).

明白了,刚才我很纳闷来着
不过,还是很感谢,多学了东西