📄 piece.pm
字号:
# $Id: Piece.pm 72 2007-11-19 01:26:10Z matt $package Time::Piece;use strict;require Exporter;require DynaLoader;use Time::Seconds;use Carp;use Time::Local;use UNIVERSAL qw(isa);our @ISA = qw(Exporter DynaLoader);our @EXPORT = qw( localtime gmtime);our %EXPORT_TAGS = ( ':override' => 'internal', );our $VERSION = '1.12';bootstrap Time::Piece $VERSION;my $DATE_SEP = '-';my $TIME_SEP = ':';my @MON_LIST = qw(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec);my @FULLMON_LIST = qw(January February March April May June July August September October November December);my @DAY_LIST = qw(Sun Mon Tue Wed Thu Fri Sat);my @FULLDAY_LIST = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);use constant 'c_sec' => 0;use constant 'c_min' => 1;use constant 'c_hour' => 2;use constant 'c_mday' => 3;use constant 'c_mon' => 4;use constant 'c_year' => 5;use constant 'c_wday' => 6;use constant 'c_yday' => 7;use constant 'c_isdst' => 8;use constant 'c_epoch' => 9;use constant 'c_islocal' => 10;sub localtime { unshift @_, __PACKAGE__ unless eval { $_[0]->isa('Time::Piece') }; my $class = shift; my $time = shift; $time = time if (!defined $time); $class->_mktime($time, 1);}sub gmtime { unshift @_, __PACKAGE__ unless eval { $_[0]->isa('Time::Piece') }; my $class = shift; my $time = shift; $time = time if (!defined $time); $class->_mktime($time, 0);}sub new { my $class = shift; my ($time) = @_; my $self; if (defined($time)) { $self = $class->localtime($time); } elsif (ref($class) && $class->isa(__PACKAGE__)) { $self = $class->_mktime($class->epoch, $class->[c_islocal]); } else { $self = $class->localtime(); } return bless $self, $class;}sub parse { my $proto = shift; my $class = ref($proto) || $proto; my @components; if (@_ > 1) { @components = @_; } else { @components = shift =~ /(\d+)$DATE_SEP(\d+)$DATE_SEP(\d+)(?:(?:T|\s+)(\d+)$TIME_SEP(\d+)(?:$TIME_SEP(\d+)))/; @components = reverse(@components[0..5]); } return $class->new(_strftime("%s", @components));}sub _mktime { my ($class, $time, $islocal) = @_; $class = eval { (ref $class) && (ref $class)->isa('Time::Piece') } ? ref $class : $class; if (ref($time)) { $time->[c_epoch] = undef; return wantarray ? @$time : bless [@$time, $islocal], $class; } _tzset(); my @time = $islocal ? CORE::localtime($time) : CORE::gmtime($time); wantarray ? @time : bless [@time, $time, $islocal], $class;}my %_special_exports = ( localtime => sub { my $c = $_[0]; sub { $c->localtime(@_) } }, gmtime => sub { my $c = $_[0]; sub { $c->gmtime(@_) } },);sub export { my ($class, $to, @methods) = @_; for my $method (@methods) { if (exists $_special_exports{$method}) { no strict 'refs'; no warnings 'redefine'; *{$to . "::$method"} = $_special_exports{$method}->($class); } else { $class->SUPER::export($to, $method); } }}sub import { # replace CORE::GLOBAL localtime and gmtime if required my $class = shift; my %params; map($params{$_}++,@_,@EXPORT); if (delete $params{':override'}) { $class->export('CORE::GLOBAL', keys %params); } else { $class->export((caller)[0], keys %params); }}## Methods ##sub sec { my $time = shift; $time->[c_sec];}*second = \&sec;sub min { my $time = shift; $time->[c_min];}*minute = \&min;sub hour { my $time = shift; $time->[c_hour];}sub mday { my $time = shift; $time->[c_mday];}*day_of_month = \&mday;sub mon { my $time = shift; $time->[c_mon] + 1;}sub _mon { my $time = shift; $time->[c_mon];}sub month { my $time = shift; if (@_) { return $_[$time->[c_mon]]; } elsif (@MON_LIST) { return $MON_LIST[$time->[c_mon]]; } else { return $time->strftime('%b'); }}*monname = \&month;sub fullmonth { my $time = shift; if (@_) { return $_[$time->[c_mon]]; } elsif (@FULLMON_LIST) { return $FULLMON_LIST[$time->[c_mon]]; } else { return $time->strftime('%B'); }}sub year { my $time = shift; $time->[c_year] + 1900;}sub _year { my $time = shift; $time->[c_year];}sub yy { my $time = shift; my $res = $time->[c_year] % 100; return $res > 9 ? $res : "0$res";}sub wday { my $time = shift; $time->[c_wday] + 1;}sub _wday { my $time = shift; $time->[c_wday];}*day_of_week = \&_wday;sub wdayname { my $time = shift; if (@_) { return $_[$time->[c_wday]]; } elsif (@DAY_LIST) { return $DAY_LIST[$time->[c_wday]]; } else { return $time->strftime('%a'); }}*day = \&wdayname;sub fullday { my $time = shift; if (@_) { return $_[$time->[c_wday]]; } elsif (@FULLDAY_LIST) { return $FULLDAY_LIST[$time->[c_wday]]; } else { return $time->strftime('%A'); }}sub yday { my $time = shift; $time->[c_yday];}*day_of_year = \&yday;sub isdst { my $time = shift; $time->[c_isdst];}*daylight_savings = \&isdst;# Thanks to Tony Olekshy <olekshy@cs.ualberta.ca> for this algorithmsub tzoffset { my $time = shift; return Time::Seconds->new(0) unless $time->[c_islocal]; my $epoch = $time->epoch; my $j = sub { my ($s,$n,$h,$d,$m,$y) = @_; $m += 1; $y += 1900; $time->_jd($y, $m, $d, $h, $n, $s); }; # Compute floating offset in hours. # my $delta = 24 * (&$j(CORE::localtime $epoch) - &$j(CORE::gmtime $epoch)); # Return value in seconds rounded to nearest minute. return Time::Seconds->new( int($delta * 60 + ($delta >= 0 ? 0.5 : -0.5)) * 60 );}sub epoch { my $time = shift; if (defined($time->[c_epoch])) { return $time->[c_epoch]; } else { my $epoch = $time->[c_islocal] ? timelocal(@{$time}[c_sec .. c_mon], $time->[c_year]+1900) : timegm(@{$time}[c_sec .. c_mon], $time->[c_year]+1900); $time->[c_epoch] = $epoch; return $epoch; }}sub hms { my $time = shift; my $sep = @_ ? shift(@_) : $TIME_SEP; sprintf("%02d$sep%02d$sep%02d", $time->[c_hour], $time->[c_min], $time->[c_sec]);}*time = \&hms;sub ymd { my $time = shift; my $sep = @_ ? shift(@_) : $DATE_SEP; sprintf("%d$sep%02d$sep%02d", $time->year, $time->mon, $time->[c_mday]);}*date = \&ymd;sub mdy { my $time = shift; my $sep = @_ ? shift(@_) : $DATE_SEP; sprintf("%02d$sep%02d$sep%d", $time->mon, $time->[c_mday], $time->year);}sub dmy { my $time = shift; my $sep = @_ ? shift(@_) : $DATE_SEP; sprintf("%02d$sep%02d$sep%d", $time->[c_mday], $time->mon, $time->year);}sub datetime { my $time = shift; my %seps = (date => $DATE_SEP, T => 'T', time => $TIME_SEP, @_); return join($seps{T}, $time->date($seps{date}), $time->time($seps{time}));}# Julian Day is always calculated for UT regardless# of local timesub julian_day { my $time = shift; # Correct for localtime $time = $time->gmtime( $time->epoch ) if $time->[c_islocal]; # Calculate the Julian day itself my $jd = $time->_jd( $time->year, $time->mon, $time->mday, $time->hour, $time->min, $time->sec); return $jd;}# MJD is defined as JD - 2400000.5 dayssub mjd { return shift->julian_day - 2_400_000.5;}# Internal calculation of Julian date. Needed here so that# both tzoffset and mjd/jd methods can share the code# Algorithm from Hatcher 1984 (QJRAS 25, 53-55), and# Hughes et al, 1989, MNRAS, 238, 15# See: http://adsabs.harvard.edu/cgi-bin/nph-bib_query?bibcode=1989MNRAS.238.1529H&db_key=AST# for more detailssub _jd { my $self = shift; my ($y, $m, $d, $h, $n, $s) = @_; # Adjust input parameters according to the month $y = ( $m > 2 ? $y : $y - 1); $m = ( $m > 2 ? $m - 3 : $m + 9); # Calculate the Julian Date (assuming Julian calendar) my $J = int( 365.25 *( $y + 4712) ) + int( (30.6 * $m) + 0.5) + 59 + $d - 0.5; # Calculate the Gregorian Correction (since we have Gregorian dates) my $G = 38 - int( 0.75 * int(49+($y/100))); # Calculate the actual Julian Date
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -