Манипуляции с датами в Perl - PullRequest
       4

Манипуляции с датами в Perl

0 голосов
/ 05 августа 2010

У меня была проблема с манипулированием датами. Это мой сценарий. У меня есть ежедневные файлы отчетов, которые будут создаваться с понедельника по пятницу. Теперь мне нужно сравнить эти отчеты. Мой код на perl должен работать таким образомчто если сегодня понедельник, мне нужно сравнить текущий отчет с отчетом пятницы на предыдущей неделе. И мой формат даты будет таким, как этот 20100803, если я даю так, мне нужно сравнить с 20100802. Если я даю отчет за понедельник, то есть 20100802, его следует сравнить20100730, т. Е. 30 июля.Может кто-нибудь, пожалуйста, помогите мне.

Заранее спасибо.

Ответы [ 5 ]

3 голосов
/ 05 августа 2010

Возможно, вы захотите взглянуть на какой-нибудь объект Date / DateTime, например Date::Calc. Например, вы можете разбить строку на день, месяц и год (используя Regex или все, что вы хотели бы использовать) для чего-то вроде:

#
#Set $date = "20100308" somehow, based on your file structure
#

$date =~ /^(\d{4})(\d{2})(\d{2})$/;
$year = $1;
$month = $2;
$day = $3;

$dow = Day_of_Week($day, $month, $year);

if ( $dow == 1 )
    $offset = -3; #Date is a Monday
} else {
    $offset = -1; #Date is Tuesday-Friday
}

#Find the date of the last report
$prev_report_date = Add_Delta_Days($day, $month, $year, $offset);

#
#Compare reports
#

Выше приведен лишь обобщенный пример, конечно. Я не знаю точно, как устроены ваши файлы или откуда берется поле даты, но вы также можете перейти на страницу Date :: Calc на CPAN для получения дополнительной помощи. Есть множество других пакетов, которые также имеют дело с датами. Это только один.

2 голосов
/ 05 августа 2010

Это не будет обрабатывать праздники (и вы должны действительно думать о них), но это минимальная реализация в Perl:

use strict;
use warnings;

use POSIX ();

my $date_string = '20100802';
my ( $year, $month, $day ) = unpack 'A4 A2 A2', $date_string;
my $today = POSIX::mktime( 0, 0, 0, $day, $month - 1, $year - 1900 );
( $day, $month, $year, my $wday ) = ( localtime $today )[3..6];
my $day_back 
    = POSIX::mktime( 0, 0, 0, $day - ( $wday == 1 ? 3 : 1 ), $month, $year )
    ;
my $day_str = POSIX::strftime( '%Y%m%d', localtime( $day_back ));

Где $time - это заданное значение времени.

1 голос
/ 07 июня 2011

В CPAN имеется множество модулей даты / времени, но DateTime - это канонический модуль Perl для даты и времени.

use DateTime;
print DateTime->now()->subtract(3)->ymd('');

Если вы когда-нибудь сомневаетесь в том, какой модуль CPAN использовать, первым хорошим шагом будет посмотреть, говорит ли Task :: Kensho что-нибудь об этом.

1 голос
/ 05 августа 2010

При Time::Piece имеется модуль базового распределения, который предлагает манипуляции с датой, сравнение и т. Д.

Время :: Штучные объекты, например поддержка - и + операторы. Из POD:

   The following are valid ($t1 and $t2 are Time::Piece objects):

      $t1 - $t2; # returns Time::Seconds object
      $t1 - 42;  # returns Time::Piece object
      $t1 + 533; # returns Time::Piece object
1 голос
/ 05 августа 2010

В зависимости от требуемого уровня производительности, существует пакет Perl, который представляет собой швейцарский армейский нож для манипуляции датами и их преобразования.

Называется Date::Manip.

Исходя из этого, вы можете легко запросить любую часть даты (например, день недели или неделя года) или сравнить или вычесть даты в действительно широком диапазоне форматов.

Я уверен, что это возможно и с другими инструментами. Я использовал Date :: Manip для таких прикольных вещей, как работа со строкой даты «последняя пятница» и получение реального значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...