2020/07/01 ã«ãªã³ã©ã€ã³ã§éå¬ããã ãPerlè¥æã®äŒ(https://connpass.com/event/179235/)ãã§ã®LTè³æã§ãã
äžèšã®æç« ã¯ã¹ã©ã€ãå 容ãäžéšä¿®æ£ãããã®ã§ãã
åŒçšã®äžã¯ç¹ã«URLãç¡ãéãã¯perldoc.jpããã®åŒçšã§ãã
Perlã§ã®åºæ¬å®è£
$^T倿°ãtime颿°
Perlã«ã¯$^T
ãšãã倿°ãäºã宣èšãããŠããŠã
ããã°ã©ã ãå®è¡éå§ããæå»ããçŽå (1970幎ã®å§ã) ããã®ç§æ°ã§ 瀺ãããã®ã§ã
ãšå®çŸ©ãããŠããŸãããã®æ°åã¯çŽå (1970幎ã®å§ã)ããã®ç§æ°ã§ãã
$ perl -E 'say $^T' 1593654027
ãããçŽå
(1970幎ã®å§ã) ã£ãŠäœãªã®ããããšãtime
颿°ã«è§£èª¬ããããŸãã
ã»ãšãã©ã®ã·ã¹ãã ã§ã¯çŽå ã¯UTC1970幎1æ1æ¥00:00:00ã§ã;ç¹åŸŽçãªäŸå€ãšããŠã¯ãå€ãMacOSã§ã¯ããŒã«ã«ã¿ã€ã ãŸãŒã³ã®1904幎1æ1æ¥00:00:00ãçŽå ãšããŠäœ¿ããŸãã
UTC1970幎1æ1æ¥00:00:00ã¯ããããUNIXæéãªã®ã§åºæºãšããŠããããããã§ãã
æ¬åœã«äŸå€ãšããŠå€ãMacïŒPower PCã®MacintoshãããïŒïŒã®ãšãã ãUTC1904幎1æ1æ¥00:00:00ãéå§ã«ãªããŸãããªã1904幎ãªã®ããšãããšãããã幎ã®äŸå€åé¿ã®ããã®æ¥ä»ã ããã§ãã
ããããããã幎ãšã¯ã
- 西æŠå¹Žã4ã§å²ãåãã幎ã¯(ååãšããŠ)é幎ã
- ãã ãã西æŠå¹Žã100ã§å²ãåãã幎ã¯(ååãšããŠ)平幎ã
- ãã ãã西æŠå¹Žã400ã§å²ãåãã幎ã¯å¿ ãé幎ã
ãšå®çŸ©ãããŠããŸãã
ãªã®ã§1900幎ã¯100幎ã«äžåºŠã®äŸå€ã§ããã幎ãçºçããã2000幎ã¯400幎ã«äžåºŠã®äŸå€ã§ããã幎ãçºçããŸããã€ãŸã1904幎ããå§ãããš2096幎ãŸã§4幎ã«äžåºŠããã幎ãååšããã®ã§ãããã幎ãçºçããªããšããäŸå€åŠçãããªãã§æžã¿ãŸãã
$^T倿°ãtime颿°ãã©ã¡ããã·ã¹ãã æéãè¿ãã®ã§ã©ã¡ãã䜿ã£ãŠãåãã§ããå€åtime颿°ã®ã»ããèªã¿ãããã®ã§ãã¡ãã®ã»ããè¯ãããšæããŸãã
localtime颿°, gmtime颿°
time颿°ã¯çŸåšæéãç¥ããã«ãUNIXæéïŒç§æ°ïŒã§è¿ãããã®ã§æ®éã«ã¯æ±ããªããšããåé¡ããããŸãã
ããã§time颿°ããåå¥ã®æå»æ
å ±ãåãåºãããšãã§ããlocaltime
颿°ããããŸãã
time颿°ãè¿ãæå»ããããŒã«ã«ãªã¿ã€ã ãŸãŒã³ã§æž¬ã£ãæå»ãšããŠã9èŠçŽ ã®é åã«å€æããŸãã
my @localtime = localtime; say $localtime[2]; # OR my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime; say $hour;
åž°ã£ãŠããé åã®äžèº«ã¯index 0ããé ã«ãããªã£ãŠããŸãã
$sec
⊠ç§$min
⊠å$hour
⊠æé$mday
⊠æ¥$mon
⊠æ$year
⊠幎$wday
âŠ ææ¥$yday
⊠1幎ã®äžã§äœæ¥ç®$isdst
âŠ å€æéãã©ãã
ãã ããå¹Žã®æ±ãããã®ãŸãŸã®ã°ã¬ãŽãªãªæŠã§åºåãããŸããã2020幎ã ãš$yearã¯120ã§è¿ã£ãŠããŸãã
$year 㯠1900 幎ããã®å¹Žæ°ãæã¡ãŸãã
1900幎ã¯äººéãèªã¿ãããããã«äžäºæ¡ã§å€æã§ããéå§å°ç¹ã§ããããããPOSIXæºæ ã§ããããªã®ã§1900ãè¶³ããŠããæ±ããŸãã
ã¹ã«ã©ãŒã®ãšãã«æ±ããšæ¥ä»æ å ±å«ããŠæååã§åºåãããŸãã
$ perl -E 'say scalar localtime' Thu Jul 2 12:26:19 2020
POSIX::strftime
ã䜵çšããŠäœ¿ããšä»»æã®åºåãããããšãã§ããŸãã
use POSIX qw(strftime); my $now_string = strftime "%a %b %e %H:%M:%S %Y", localtime
localtimeã ãšãã·ã³ã®æéã«äŸåããããæ¥æ¬ã ãšGMT+9:00ã§ã°ãªãããžæšæºæãã9æéè¶³ãããæéã«ãªããŸãã
ããããã·ã³ã®æéãããã£ãŠããã®ã§ããã°åçŽã«-9æéã§èšç®ããã°ããã®ã§ããããµãŒããŒã«çœ®ããå Žåã«æéããããªãå Žåããããæ»ãæéãããããªããªããŸãã
ããã§æåããã°ãªãããžæšæºæã§åºåãããgmtime
颿°ããããŸãããã¡ãã¯localtimeãšåãAPIã§åãæ±ãããšãã§ããŸãã
ã¢ãžã¥ãŒã«ã§ã®å®è£
Time::Piece
localtimeã¯äŸ¿å©ã§ããã䜿ããã圢ã«ããããã«ã¯çµå±é¢æ°åããå¿ èŠããããŸããæ¥ä»ãæå»æ å ±ãªã©ã¯åºåã®åœ¢ãå€§äœæ±ºãŸã£ãŠããããã®åœ¢ã«ããããæžãã®ãé¢åã§ãã
ããã§Time::Piece
ã®ç»å Žã§ããTime::Pieceã¯localtime颿°ãšgmtime颿°ãTime::Pieceãªããžã§ã¯ãã«ããŠè¿ããŠãããŸããã¡ãªã¿ã«Timepieceã¯æèšãšããæå³ã§ãã
åãæ¥ãªã©åç¬ã§æ¬²ããæ å ±ã®ã¡ãœããã¯ãã¡ãããæ¥ä»ããã©ãŒãããã®ä»æ¹ãªã©ãã¡ãœããã§æäŸãããŠããŸãã
$t->ymd # 2000-02-29 $t->date # $t->ymd ãšåã $t->mdy # 02-29-2000 $t->mdy("/") # 02/29/2000 $t->dmy # 29-02-2000 $t->dmy(".") # 29.02.2000 $t->datetime # 2000-02-29T12:34:56 (ISO 8601) $t->cdate # Tue Feb 29 12:34:56 2000 $t->time_separator($s) # ããã©ã«ãã®ã»ãã¬ãŒã¿ãèšå® (ããã©ã«ã ":") $t->date_separator($s) # ããã©ã«ãã®ã»ãã¬ãŒã¿ãèšå® (ããã©ã«ã "-") $t->day_list(@days) # ããã©ã«ãã®ææ¥ãèšå® $t->mon_list(@days) # ããã©ã«ãã®æåãèšå®
- Time::Piece - Object Oriented time objects - metacpan.org
- Time::Piece - オブジェクト指向な時間オブジェクト - perldoc.jp
Time::Pieceãªããžã§ã¯ãã«å¯ŸããŠTime::Secondsãå ç®ã»æžç®ããããTime::Pieceãªããžã§ã¯ãå士ã§å·®åãTime::Secondsã§åºãããããããšãã§ããŸãã
use Time::Piece; use Time::Seconds; my $today = localtime; my $tommorow = $today + ONE_DAY; # ONE_DAYã¯Time::Secondsã§å®çŸ©ãããŠãã1æ¥ say $tommorow->ymd; # Time::Pieceãªããžã§ã¯ã # 2020-07-03 my $diff = $tommorow - $today; say $diff->hours; # Time::Secondsãªããžã§ã¯ã # 24
ãŸããTime::Pieceãªããžã§ã¯ãåå£«ã§æ¯èŒããäºãã§ããŸãã
use Time::Piece; use Time::Seconds; my $today = localtime; my $tommorow = $today + ONE_DAY; $tommorow += ONE_HOUR; if ($tommorow - $today != 24 * ONE_HOUR) { say 'å·®ã¯24æéã§ã¯ãªãã§ã'; }
- Time::Seconds - a simple API to convert seconds to other date values - metacpan.org
- Time::Seconds - 他の日付の値を秒に変換する簡単な API - perldoc.jp
ããããäžã€åé¡ããã
ãã®ã¢ãžã¥ãŒã«ã¯ãperl ã® time() çµç±ã§æäŸãããgmtime() ãš localtime() ã察å¿ããŠããçŽå ç§ã·ã¹ãã ãå éšã§äœ¿çšããŠããŸãã
ããããtime颿°ã§æŸã£ãŠããtime_tåã¯ç¬Šå·ä»ãintã§å®è£ ãããŠãããã231-1(2,147,483,647ç§ = UTC2038幎01æ19æ¥03:14:07ïŒãè¶ ãããšè² ã«ãªãã æ£ããæå»ãæ±ãããšãã§ããªããªããŸãã
ãã®ãããåé¿çãåãå¿ èŠããããŸãã
64 ããã perl ã䜿ã£ãŠãã ããã ãŸãã¯ãããã®éžæè¢ãåããªãå Žåã¯ãéå»ãšæªæ¥ã®å¹Žã«å¯Ÿå¿ããŠãã DateTime ã¢ãžã¥ãŒã«ã䜿ã£ãŠãã ãã
ã»ãšãã©ã®å Žåã¯64bitã®Perlã§è§£æ±ºããŸãããå€ãPerlã䜿ããªããšãããªãå Žåãªã©ã§ã¯DateTime
ã§å¯ŸåŠããå¿
èŠããããŸãã
DateTimeã§ã§ããã®ã§ããã°Time::Pieceã®åªäœæ§ãç¡ããšæãããŸãããTime::Pieceã¯Perl 5.10以éã§ããã©ã«ãã§å ¥ã£ãŠããããšãDateTimeãã軜ããšããããšãããç¹ã«çç±ããªããã°Time::Pieceã䜿ãã®ãè¯ããšæããŸãã
ã§ãã©ããã£ãŠå ç®ãæ¯èŒãããŠãïŒ
ã¡ãã£ãšå¯ãéã§ãããå çšTime::Pieceã§ã¯å ç®ã»æžç®ã»æ¯èŒãã§ãããšèšããŸããããå·éã«èãããšããã¯ã¡ãã£ãšããããã§ãããšããã®ããTime::Pieceã¯ãªããžã§ã¯ããªã®ã§æ°å€ãæååã®ããã«çŽæ¥æ¯èŒããããšãã§ããŸããã
äžæè°ã ãªããšããããšã§meta::cpanããBrowseã§ã³ãŒããèŠãŠããšTime::Seconndsã«overloadããã±ãŒãžã§æŒç®åãå²ã£ãŠããããšãããããŸãã
use overload 'fallback' => 'undef', '0+' => \&seconds, '""' => \&seconds, '<=>' => \&compare, '+' => \&add, '-' => \&subtract, '-=' => \&subtract_from, '+=' => \&add_to, '=' => \© };
overloadããã±ãŒãžãšã¯ãªããããšperldoc.jpãèŠãŠã¿ããšã
Perl ã®æŒç®åã®ãªãŒããŒããŒããè¡ãããã±ãŒãž
ãšãããŸããã€ãŸãç®è¡æŒç®åãæ¯èŒæŒç®åãå¥ã®é¢æ°ã«äžæžãã§ããã¿ããã§ãã
Time::Secondsã§ã¯äŸãã°+ç®è¡æŒç®åã®å Žåã¯å·Šå³ããå€ãåã£ãŠadd颿°ã«å ¥ããå ç®ãããã®ãTime::Seconndsã§è¿ããŠããããšãããããŸãã
sub _get_ovlvals { my ($lhs, $rhs, $reverse) = @_; $lhs = $lhs->seconds; if (UNIVERSAL::isa($rhs, 'Time::Seconds')) { $rhs = $rhs->seconds; } elsif (ref($rhs)) { die "Can't use non Seconds object in operator overload"; } if ($reverse) { return $rhs, $lhs; } return $lhs, $rhs; } # ~ sub add { my ($lhs, $rhs) = _get_ovlvals(@_); return Time::Seconds->new($lhs + $rhs); }
Time::Piece::MySQL
æéãšããã°MySQLã§ã®æ±ãã¯ãªããªãã«é¢åã§ãã
äŸãã°ãæå»ã®è¡šèšã§ã¯fracïŒå°æ°ç¹ä»¥äžïŒã远å ãããŠããŸãã
ãŸããDATETIMEãšTIMESTAMPã¯åããã©ãŒãããã§ããµããŒããããŠããæéã®ç¯å²ãç°ãªãã DATETIMEã¯æã»æ¥ã«00ã蚱容ãããŸãããããŠãæã«ã¯åãå€ã§ãéãå€ã§ç»é²ãããããšããããŸãã
ããã§ãTime::Pieceã®æ¡åŒµã¡ãœãããšããŠTime::Piece::MySQL
ããããŸãã
Time::Piece->mysql_date
ã§Time::Pieceãªããžã§ã¯ããMySQLã®DATEåã«å€æããTime::Piece->from_mysql_date($datetime)
ã§MySQLã®DATEåããTime::Pieceãªããžã§ã¯ãã«å€æããããšãã§ããŸããDATETIMEã»TIMEã»TIMESTAMPã§ã察å¿ããã¡ãœããã䜿ãã°å€æããããšãã§ããŸãã
Time::HiRes
ããããã°æéãšããã°é¢åãªãã®ããããŸããããããã§ããå°æ°ç¹ä»¥äžã®æéã®æ±ãã§ãã
time颿°ã§ã¯ç§æ°ããæ±ããªããããããªç§ã»ãã€ã¯ãç§ãæ±ãããšãã§ããŸããã
Time::HiRes::gettimeofday
ã䜿ããštime颿°ã§è¿ã£ãŠããç§æ°æ
å ±ã«å ããŠãã€ã¯ãç§ãé
åã§è¿ã£ãŠããŸãã
use Time::Piece; use Time::HiRes; my ($time, $ms) = Time::HiRes::gettimeofday; my $t = localtime($time); say $t->datetime . ".$ms"; # 2020-07-02T19:31:40.946569