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