⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 local.pm

📁 网页留言本,比一般的留言簿管用
💻 PM
字号:
package DateTime::TimeZone::Local;use strict;use File::Spec;sub local_time_zone{    my $tz;    foreach ( qw( env                  etc_localtime                  etc_timezone                  etc_sysconfig_clock                ) )    {        my $meth = "_from_$_";	$tz = __PACKAGE__->$meth();	return $tz if $tz;    }    die "Cannot determine local time zone\n";}sub _from_env{    # names with '$' are for VMS    foreach my $k ( qw( TZ SYS$TIMEZONE_RULE SYS$TIMEZONE_NAME UCX$TZ TCPIP$TZ ) )    {	if ( _could_be_valid_time_zone( $ENV{$k} ) )	{	    return eval { DateTime::TimeZone->new( name => $ENV{$k} ) };	}    }}sub _from_etc_localtime{    return unless -r '/etc/localtime';    my $real_name;    if ( -l '/etc/localtime' )    {	# called like this so test suite can test this functionality	$real_name = _readlink( '/etc/localtime' );    }    else    {        $real_name = _find_matching_zoneinfo_file( '/etc/localtime' );    }    if ( defined $real_name )    {	my ($vol, $dirs, $file) = File::Spec->splitpath( $real_name );	my @parts =	    grep { defined && length } File::Spec->splitdir( $dirs ), $file;        foreach my $x ( reverse 0..$#parts )        {            my $name =                ( $x < $#parts ?                  join '/', @parts[$x..$#parts] :                  $parts[$x]                );            my $tz;            $tz = eval { DateTime::TimeZone->new( name => $name ) };            return $tz if $tz;        }    }    undef;}sub _readlink { readlink $_[0] }sub _from_etc_timezone{    my $tz_file;    foreach ( qw( /etc/timezone /etc/TIMEZONE ) )    {	if ( -f && -r _ )	{	    $tz_file = $_;	    last	}    }    return unless $tz_file;    local *TZ;    open TZ, "<$tz_file"        or die "Cannot read $tz_file: $!";    my $name = join '', <TZ>;    close TZ;    $name =~ s/^\s+|\s+$//g;    return eval { DateTime::TimeZone->new( name => $name ) };}# for systems where /etc/localtime is a copy of a zoneinfo filesub _find_matching_zoneinfo_file{    my $file_to_match = shift;    return unless -d '/usr/share/zoneinfo';    require File::Find;    require File::Compare;    my $size = -s $file_to_match;    my $real_name;    local $_;    eval    {        File::Find::find            ( { wanted =>                sub                {                    if ( ! defined $real_name                         && -f $_                         && $size == -s $_                         && File::Compare::compare( $_, $file_to_match ) == 0                       )                    {                        $real_name = $_;                        # File::Find has no mechanism for bailing in the                        # middle of a scan                        die { found => 1 };                    }                },                no_chdir => 1,              },              '/usr/share/zoneinfo',            );    };    if ($@)    {        return $real_name if ref $@ && $@->{found};        die $@;    }}# RedHat uses thissub _from_etc_sysconfig_clock{    return unless -r "/etc/sysconfig/clock" && -f _;    my $name = _read_etc_sysconfig_clock();    if ( _could_be_valid_time_zone($name) )    {        return eval { DateTime::TimeZone->new( name => $name ) };    }}# this is a sparate function so that it can be overridden in the test# suitesub _read_etc_sysconfig_clock{    local *CLOCK;    local $_;    open CLOCK, '</etc/sysconfig/clock'        or die "Cannot read /etc/sysconfig/clock: $!";    while (<CLOCK>)    {        return $1 if /^(?:TIME)?ZONE="([^"]+)"/;    }}sub _could_be_valid_time_zone{    return 0 unless defined $_[0];    return 0 if $_[0] eq 'local';    return $_[0] =~ m,^[\w/]+$, ? 1 : 0;}1;__END__=head1 NAMEDateTime::TimeZone::Local - Code to determine the system's local time zone=head1 SYNOPSIS  my $tz = DateTime::TimeZone->new( name => 'local' );=head1 DESCRIPTIONThis package is used to try to figure out what the local time zone is,in a variety of ways.  See theL<DateTime::TimeZone|DateTime::TimeZone> docs for more details.=cut

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -