このコードにミリ秒を追加する最も効率的な方法は何ですか?

このコードにミリ秒を追加する最も効率的な方法は何ですか?
#-----------------------------------------------------------------------------
#
# 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 );
    # ....
}

おすすめ記事