1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44
|
use strict;
use warnings;
use Time::Local;
use feature "say";
sub timestamp2date {
my $timestamp = shift;
my ($sec, $min, $hour, $day, $month, $year) = localtime $timestamp;
$year += 1900;
$month += 1;
($min, $hour, $day, $month) = map { sprintf "%02d", $_ } $min, $hour, $day, $month; # préfixer avec un zéro quand il n'y a qu'un chiffre
return "$year-$month-$day $hour:$min";
}
sub date2timestamp {
# format: 2018-01-24 00:19
my ($date_in, $round) = @_;
my ($year, $month, $day, $hour, $min) = split /[- :]/, $date_in;
$year -= 1900;
$month -= 1;
my $rounding_correction_sec = find_rounding($min, $round);
my $timestamp = timelocal (0, $min, $hour, $day, $month, $year);
return $timestamp + $rounding_correction_sec;
}
sub find_rounding {
my ($min, $round) = @_;
return 0 unless $round;
my $rest_div = $min % (abs $round);
return 0 unless $rest_div;
if ($round < 0) {
# On renvoie le nombre de secondes à retrancher
return -$rest_div * 60;
} else {
# nombre de seconde à ajouter
return ($round - $rest_div) * 60;
}
}
# Tests de conversion: conversion en time stamp puis reconversion en date
my $dat = "2018-01-24 00:19";
say timestamp2date(date2timestamp($dat, 5)); # Arrondi 5 mn au-dessus -> 2018-01-24 00:20
say timestamp2date(date2timestamp($dat, -5)); # Arrondi 5 mn en-dessous -> 2018-01-24 00:15 |
Partager