Acme-Tools
view release on metacpan or search on metacpan
$_[0] eq 'YYYY' and return 1900+$lt[5];
$_[0] eq 'YYYYMMDD' and return sprintf("%04d%02d%02d",1900+$lt[5],1+$lt[4],$lt[3]);
$_[0] =~ $Re_isnum and @lt=localtime($_[0]) and return sprintf("%04d%02d%02d-%02d:%02d:%02d",1900+$lt[5],1+$lt[4],@lt[3,2,1,0]);
}
my($format,$time,$is_date)=@_;
$time=time_fp() if !defined$time;
($time,$format)=($format,$time) if @_>=2 and $format=~/^[\d+\:\-\.]+$/; #swap /hm/
my @lt=localtime($time);
#todo? $is_date=0 if $time=~s/^\@(\-?\d)/$1/; #@n where n is sec since epoch makes it clear that its not a formatted, as in `date`
#todo? date --date='TZ="America/Los_Angeles" 09:00 next Fri' #`info date`
# Fri Nov 13 18:00:00 CET 2015
#date --date="next Friday" #--date or -d
#date --date="last friday"
#date --date="2 days ago"
#date --date="yesterday" #or tomorrow
#date --date="-1 day" #date --date='10 week'
if( $is_date ){
my $yy2c=sub{10+$_[0]>$lt[5]%100?"20":"19"}; #hm 10+
$time=totime(&$yy2c($1)."$1$2$3")."000000" if $time=~/^(\d\d)(\d\d)(\d\d)$/;
$time=totime("$1$2${3}000000") if $time=~/^((?:18|19|20)\d\d)(\d\d)(\d\d)$/; #hm 18-20?
#V=>'UKE', #ISO week num of year 01..53, monday as first day of week
#W=>'WoYm', #week num of year 00..53, monday as first day of week, not ISO!
#x=>$ENV{locale's date representation}, #e.g. MM/DD/YY
#X=>$ENV{locale's time representation}, #e.g. HH/MI/SS
y=>'YY',
Y=>'YYYY',
#z=>'TZHHMI', #time zone hour minute e.g. -0430
#':z'=>'TZHH:MI',
#'::z'=>'TZHH:MI:SS',
#':::z'=>'TZ', #number of :'s necessary precision, e.g. -02 or +03:30
#Z=>'TZN', #e.g. CET, EDT, ...
);
my $pkeys=join"|",keys%p;
$format=~s,\%($pkeys),$p{$1},g;
$format=~s/($Tms_pattern)/$Tms_str{$1}[1+$lt[$Tms_str{$1}[0]]]/g;
$format=~s/YYYY / 1900+$lt[5] /gxe;
$format=~s/(\s?)yyyy / $lt[5]==(localtime)[5]?"":$1.(1900+$lt[5])/gxe;
$format=~s/YY / sprintf("%02d",$lt[5]%100) /gxei;
$format=~s|CC | sprintf("%02d",(1900+$lt[5])/100) |gxei;
$format=~s/MM / sprintf("%02d",$lt[4]+1) /gxe;
$format=~s/mm / sprintf("%d",$lt[4]+1) /gxe;
t/27_timestuff.t view on Meta::CPAN
# tms() and other time stuff
# make test
# perl Makefile.PL; make; perl -Iblib/lib t/27_timestuff.t
use lib '.'; BEGIN{require 't/common.pl'}
use Test::More;
use Digest::MD5 'md5_hex';
if( $^O=~/(?<!cyg)win/i ) { plan skip_all => 'POSIX::tzset not ok on windows' }
else { plan tests => 61 }
$ENV{TZ}='CET';
#$ENV{TZ}='Europe/Oslo';
#$ENV{TZ}='Asia/Kolkata';
require POSIX; POSIX::tzset();
my $t =1450624919; #20151220-16:21:59 Sun
my $t2=1000000000; #20150909-03:46:40 Sun
my $t3=1560000000; #20190608-15:20:00 Sat
#my @lt=localtime($t);
#print tms($t),"<<- ".tms()."\n";
t/27_timestuff.t view on Meta::CPAN
1550494380 18/February/2019:13:53
1000000000 9/Sep/2001:03:46:40
1000000000 9/9/2001:03:46:40"
} else { ok(1) for 1..18 }
__END__
http://stackoverflow.com/questions/753346/how-do-i-set-the-timezone-for-perls-localtime
https://en.wikipedia.org/wiki/Tz_database
perl -MPOSIX -le' print for tzname' #GMT GMT
perl -MPOSIX -le'tzset;print for tzname' #CET CEST
( run in 1.067 second using v1.01-cache-2.11-cpan-49f99fa48dc )