Qual é a maneira mais eficiente de adicionar milissegundos a este código?

0
#-----------------------------------------------------------------------------
#
# 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 )));
    }
    
por I AM L 12.12.2012 / 02:54

1 resposta

2

Para obter uma precisão maior para sua função formatTime , é necessário executar milissegundos, em vez de segundos. Você não pode levar segundos arredondados e torná-lo mais preciso.

Como o localtime () só aceita segundos desde a época, você precisará converter os milésimos de segundo passados e convertê-los em segundos. Aqui está um exemplo:

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

A outra opção seria usar o DateTime . Se você passar em segundos como um decimal, ele poderá criar um objeto DateTime com maior precisão:

use DateTime;

sub formatTime {
    my ( $seconds ) = @_;
    my $dt = DateTime->from_epoch( epoch => $seconds );
    # ....
}
    
por 12.12.2012 / 03:55