Perl получить дату до десяти дней определенной даты - PullRequest
1 голос
/ 27 мая 2020

Мне нужно получить дату за 10 дней до введенной даты.

Вот мой сценарий - (Ссылка взята из ответа Дейва)

#!/usr/bin/perl

use strict;
use warnings;

use Time::Local;
use POSIX 'strftime';

my $DATE = $ARGV[0];
( $DATE =~ /(....)(..)(..)/ );

my ($day, $mon, $yr) = ( $3, $2, $1 );

my $midday = timelocal(0, 0, 12, $day, $mon, $yr); 

my $midday_before = $midday - (10 * 24 * 60 * 60);

my $required_date = strftime('%Y-%m-%d', localtime($midday_before));

print "10 days to before ".$yr."-".$mon."-".$day." is : $required_date\n";

Но мой вывод выглядит так, что меня смущает:

$ perl get_date.pl 20200527
10 days to before 2020-05-27 is : 2020-06-17

Я ожидаю 2020-05-17. Но это дает мне 2020-06-17, что на 20 дней раньше моей введенной даты.

Я не хочу использовать DateTime для этого. Поскольку при установке модулей возникает проблема с разрешением.

1 Ответ

3 голосов
/ 27 мая 2020

Вам нужно более внимательно прочитать документацию для Time :: Local . Он включает следующее:

Стоит обратить особое внимание на ожидаемые диапазоны для предоставленных значений. Значение дня месяца - это фактический день (т. Е. 1..31), а месяц - это количество месяцев, прошедших с января (0..11). Это согласуется со значениями, возвращаемыми из localtime() и gmtime().

В коде, который вы скопировали, я использовал localtime(), чтобы получить месяц (и другие части даты) и это дало мне целое число от 0 до 11. В вашем коде вы анализируете значение из своей входной строки, и это дает вам число от 1 до 12. Поэтому вам нужно вычесть 1 из вашего месяца, прежде чем передавать его в timelocal().

Это одна из причин, по которым были написаны более совершенные инструменты даты / времени, такие как DateTime и Time :: Piece . Пожалуйста, не игнорируйте их.

Обновление: Версия Time :: Piece:

#!/usr/bin/perl

use strict;
use warnings;

use Time::Piece;
use Time::Seconds;

my $today = Time::Piece->strptime($ARGV[0], '%Y%m%d');
my $then = $today - (10 * ONE_DAY);

my $fmt = '%Y-%m-%d';

print '10 days to before ', $today->strftime($fmt),
      ' is : ', $then->strftime($fmt), "\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...