1. Perl
  2. Date/Time

Find the time difference (including the date in the time)

To find the difference when the time contains a date, use the timelocal function of the Time::Local module to convert the time containing the date to seconds and find the difference.

Since the formatted time is described in logs etc., I created an example to find the time difference from that state.

use strict;
use warnings;

# Difference is 2 seconds Calculate this
print "(1) Find the time difference (time includes date)\n";
my $time_str1 = '30/Sep/2006:23:59:59';
my $time_str2 = '01/Oct/2006:00:00:01';


# Converts a string representation of time into a hash of time information, including dates.
my $time1 = time_from_str ($time_str1);
my $time2 = time_from_str ($time_str2);

# Convert time information hash to seconds to calculate elapsed seconds
my $sec_interval = time_to_sec ($time2) - time_to_sec ($time1);

print "Time difference is $sec_interval seconds.\n";


# A function that converts a string representation of time into a hash that represents time information
sub time_from_str {
  my $time_str = shift;
  return unless $time_str;
  
  my $time = {};
  
  # If it matches the format of the time including the date
  # if ($time_str =~ m ^ (\d{2})/(\w{3})/(\d{4}): (\d{2}): (\d{2}) :(\d{2}) $# ) {
    
    # Create hash
    @{$time}{qw/mday mon year hour min sec /}
      = ($1, $2, $3, $4, $5, $6);
    
    # Hash corresponding to the English notation of the month and the number of the month
    my %num_of_mon = (
      jan => 0, feb => 1, mar => 2, apr => 3, may => 4, jun => 5,
      jul => 6, aug => 7, sep => 8, oct => 9, nov => 10, dec => 11,
    );

    # Return if the month notation is incorrect
    $time->{mon} = $num_of_mon{lc($time->{mon})};
    return unless defined $time->{mon};
    
    $time->{year}-= 1900;
    
    return wantarray?%$time: $time;
  }
  return;
}

# Function to convert time to seconds
sub time_to_sec {
  my $time;
  if (ref $_[0] eq 'HASH') {
    $time = shift;
  }
  else {
    %$time = @_;
  }
  
  return unless defined $time->{sec};
  return unless defined $time->{min};
  return unless defined $time->{hour};
  return unless defined $time->{mday};
  return unless defined $time->{mon};
  return unless defined $time->{year};
  
  # Convert to seconds using the Time::Local module
  require Time::Local;
  my $sec = Time::Local::timelocal (
    $time->{sec},
    $time->{min},
    $time->{hour},
    $time->{mday},
    $time->{mon},
    $time->{year},
  );
  
  return $sec;
}

Output

(1) Find the time difference (time includes date)
The time difference is 2 seconds.

Explanation

Convert time string representation to hash representing time information

Converting a time containing a date such as '30/Sep/2006:23:59:59'to a hash representing time information.

The hash that represents the time information has six keys: sec, min, hour, mday, mon, and year.

After cutting out the date and time with a regular expression, the English name of the month such as Sep is converted to the month number.

sub time_from_str {
  my $time_str = shift;
  return unless $time_str;
  
  my $time = {};
  
  # If it matches the format of the time including the date
  # if ($time_str =~ m ^ (\d{2})/(\w{3})/(\d{4}): (\d{2}): (\d{2}) :(\d{2}) $# ) {
    
    # Create hash
    @{$time}{qw/mday mon year hour min sec /}
      = ($1, $2, $3, $4, $5, $6);
    
    # Hash corresponding to the English notation of the month and the number of the month
    my %num_of_mon = (
      jan => 0, feb => 1, mar => 2, apr => 3, may => 4, jun => 5,
      jul => 6, aug => 7, sep => 8, oct => 9, nov => 10, dec => 11,
    );

    # Return if the month notation is incorrect
    $time->{mon} = $num_of_mon{lc($time->{mon})};
    return unless defined $time->{mon};
    
    $time->{year}-= 1900;
    
    return wantarray?%$time: $time;
  }
  return;
}

Others are the same as "Find the time difference (if it does not exceed 24 hours)".

Convert time to seconds

To convert a time containing a date to seconds (epoch seconds), use the timelocal function of the Time::Local module.

Others are the same as "Find the time difference (if it does not exceed 24 hours)".

# Convert time information hash to seconds to calculate elapsed seconds
my $sec_interval = time_to_sec ($time2) - time_to_sec ($time1);

# Function to convert time to seconds
sub time_to_sec {
  my $time;
  if (ref $_[0] eq 'HASH') {
    $time = shift;
  }
  else {
    %$time = @_;
  }
  
  return unless defined $time->{sec};
  return unless defined $time->{min};
  return unless defined $time->{hour};
  return unless defined $time->{mday};
  return unless defined $time->{mon};
  return unless defined $time->{year};
  
  # Convert to seconds using the Time::Local module
  require Time::Local;
  my $sec = Time::Local::timelocal (
    $time->{sec},
    $time->{min},
    $time->{hour},
    $time->{mday},
    $time->{mon},
    $time->{year},
  );
  
  return $sec;
}

Related Informatrion