#-----------------------------------------------------------------------------
#
# Get time string
#
#-----------------------------------------------------------------------------
#
sub formatTime
{
my ( $seconds ) = @_;
my( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
localtime( $seconds );
$year += 1900;
$mon += 1;
return ( sprintf "%02d/%02d/%04d %02d:%02d:%02d",
$mday,$mon,$year,$hour,$min,$sec );
}
#-----------------------------------------------------------------------------
#
# Extract time from the string
#
#-----------------------------------------------------------------------------
#
sub extractTime
{
my ( $edate, $time ) = @_;
my $date = $1 if ($edate =~ /(\d+\/\d+\/\d+)/); # remove leading '[' etc.
my ( $mday, $mon, $year ) = split( /\//, $date );
my ( $hour,$min, $sec ) = split( /:/, $time );
return (timelocal( $sec, $min, $hour, $mday, ($mon - 1), ($year - 1900 )));
}
답변1
함수의 정밀도를 높이려면 formatTime
초 단위가 아닌 밀리초 단위로 측정해야 합니다. 반올림된 초 수를 사용하여 더 정확하게 만들 수는 없습니다.
localtime()은 epoch 이후의 초만 허용하므로 전달된 밀리초를 초로 변환해야 합니다. 예는 다음과 같습니다.
use POSIX qw(floor);
sub formatTime {
my ( $milliseconds ) = @_;
my $seconds = floor($milliseconds / 1000);
my $msec = $milliseconds % 1000;
my( $sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst ) =
localtime( $seconds );
$year += 1900;
$mon += 1;
return ( sprintf "%02d/%02d/%04d %02d:%02d:%02d:%04d",
$mday,$mon,$year,$hour,$min,$sec,$msec );
}
또 다른 옵션은 다음을 사용하는 것입니다.날짜 시간. 초를 분수로 전달하면 더 높은 정밀도로 DateTime 객체를 생성할 수 있습니다.
use DateTime;
sub formatTime {
my ( $seconds ) = @_;
my $dt = DateTime->from_epoch( epoch => $seconds );
# ....
}