如何从Perl CGI脚本中的.bashrc获取和使用用户的TZ设置?

时间:2010-04-19 15:29:42

标签: bash perl timezone

我的每个用户都有一个(可能)在 .bashrc 中定义的不同TZ。我有一个显示日期/时间的Perl脚本,并希望它显示其配置文件时区。

有谁知道最好的方法吗?

3 个答案:

答案 0 :(得分:3)

一个简单的答案是使用:

    use POSIX;
    .... 
    print strftime("%H:%M %Z", localtime);

但%Z返回的区域因系统而异。我在两个不同的平台上获得了GMT Daylight TimeBST

修改 以下是一个实验,表明(至少对我而言)%Z考虑了TZ

    export TZ=''
    perl -MPOSIX -e 'print strftime("%H:%M %Z\n", localtime)'
    export TZ=America/Los_Angeles
    perl -MPOSIX -e 'print strftime("%H:%M %Z\n", localtime)'

生成输出

    16:45 UTC
    09:45 PDT

答案 1 :(得分:3)

您可以使用精彩模块DateTime

use strict; use warnings;
use DateTime;

# extract timezone name from file in env variable
(my $tz = $ENV{TZ}) =~ s#^/usr/share/zoneinfo/##;
my $now = DateTime->now(time_zone => $tz);

print "The current time is: " . $now->strftime('%F %T %Z') . "\n";

当我使用TZ =“/ usr / share / zoneinfo / Europe / Paris”运行时,我看到:

  

当前时间是:2010-04-19 20:09:03 CEST

至于从用户文件中提取时区数据:一个快速的解决方案是将用户的TZ配置存储在一个单独的文件中(.bashrc可以提供源代码),你可以在CGI中手动解析它(但这会进入一个不同的主题:我如何才能最好地存储CGI的每用户配置?)

# /home/<user>/.tz should have the content: export TZ="/usr/share/zoneinfo/timezonename"
open(my $tz_fh, "/home/${user}/.tz");
chomp(my $tz_data = <$tz_fh>);
close $tz_fh;
(my $tz_path) = $tz_data =~ m/^export TZ\s*=\s*"(.+)"$/;

# now $tz_path contains what $ENV{TZ} would contain in the earlier code snippet.

答案 2 :(得分:0)

在这种情况下,什么是“个人资料”?