"bnj.s" schreef:

> I have a file with lots of times in the format "01:22:33,456", where
> the numbers after the comma represent the milliseconds.
>
> I would like to reduce all these times by a given offset. I first
> thought to convert the string to a sort of date format, and then to
> do a minus operation, and then to convert the result back to a string
> of the original form. However, I have great difficulties finding how
> to handle times and dates. I am sure, however, that there exist a
> simple way to do so in perl. Could you please help me and tell me how
> you would do it?


What is the smallest (earliest) time value, and is it bigger than the
offset?

If yes:

#!/usr/bin/perl
  use strict ;
  use warnings ;

  use integer ;

  sub t2ms
  {
    $_[3] ||= '' ;
    $_[3]  .= '0' while length $_[3] < 3 ;
    return ( ( $_[0] * 60 + $_[1] ) * 60 + $_[2] ) * 1000 + $_[3] ;
  }

  sub ms2t
  {
    $_[3] = $_[0] % (          1000)                    ;
    $_[2] = $_[0] % (     60 * 1000) / (          1000) ;
    $_[1] = $_[0] % (60 * 60 * 1000) / (     60 * 1000) ;
    $_[0] = $_[0]                    / (60 * 60 * 1000) ;
    return @_ ;
  }

  my $qr = qr/(\d\d):(\d\d):(\d\d)(?:,(\d*))?/ ;

  my $offset = - t2ms( '00:00:01,234' =~ m/$qr/ ) ;

  while ( <DATA> )
  {
    printf "%02d:%02d:%02d,%03d\n", ms2t( t2ms( m/$qr/ ) + $offset ) ;
  }

__DATA__
01:22:33,456
12:34:56,7
23:45:19,001
23:45:19,01
23:45:19,0
23:45:19,
23:45:19


But please check out DateTime::Duration too.

-- 
Affijn, Ruud

"Gewoon is een tijger."




-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to