
#-----------------------------------------------------------------------------
#
# 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 );
# ....
}