Как я нахожу дату, которая является на три дня ранее, чем данная дата в Perl?

Python 3

Ther являются двумя способами достигнуть этого:

1) С количеством встроенной функции ()

sentence = 'Mary had a little lamb'
print(sentence.count('a'))`

2) не используя функцию

sentence = 'Mary had a little lamb'    
count = 0

for i in sentence:
    if i == "a":
        count = count + 1

print(count)
5
задан brian d foy 2 September 2009 в 17:49
поделиться

7 ответов

Date :: Calc - это модуль чемпиона:

use strict;
use warnings;
use Date::Calc qw(Add_Delta_YMD);

my $startDate = '2000-01-01';
my ($startYear, $startMonth, $startDay) = $startDate =~ m/(\d{4}-(\d{2})-\d{2})/;

# 1 year, 2 months, 3 days, after startDate
my $endDate = join('-', Add_Delta_YMD($startYear, $startMonth, $startDay, 1, 2, 3));

Модуль имеет огромное количество подпрограмм преобразования времени, особенно тех, которые имеют дело с дельтами. Также заслуживают внимания DateTime и Date :: Manip .

10
ответ дан 18 December 2019 в 05:44
поделиться

Date :: Calc может использоваться для таких вычислений:

#!/usr/bin/perl

use strict;
use warnings;
use Date::Calc qw(Add_Delta_Days);

my ( $yyyy, $mm, $dd ) = ( 2009, 9, 2 );
my @date = Add_Delta_Days( $yyyy, $mm, $dd, -3 );
print join( '-', @date );
9
ответ дан 18 December 2019 в 05:44
поделиться

См. perldoc POSIX для функции mktime () .

Это поможет вам преобразовать дату и время в простое число, которое является время Unix (полагаю, количество секунд с 1 января 1970 г.). Затем вычтите из этого числа 3 (дня), умноженное на 24 (часы в день), умноженное на 60 (минуты в час), умноженное на 60 (секунды в минуту) или 259200 секунд, и используйте localtime () , чтобы преобразовать это количество секунд обратно в строковое представление.

Это, вероятно, лучшее решение *, потому что оно будет обрабатывать изменения месяца и года автоматически. Любое другое решение, вероятно, окажется более сложным после учета проверки того, закончились ли у нас дни в месяце или месяцы в году.


РЕДАКТИРОВАТЬ: * Вне рассмотрения ] CPAN .

1
ответ дан 18 December 2019 в 05:44
поделиться

Вариантов так много, что это в меру смущает. Отчасти это зависит от того, какие еще расчеты могут вам понадобиться в будущем, и будут ли время и часовые пояса когда-либо иметь значение, и тому подобное.

Вы можете посмотреть на любой из этих

, чтобы назвать только три (набора) модулей. Я бы посоветовал Date :: Calc или Date :: Manip для простоты, но если в будущем вам нужно будет что-то необычное, то DateTime модули могут быть лучше.

4
ответ дан 18 December 2019 в 05:44
поделиться

В mktime замечательно то, что он будет обрабатывать любое время смещения. Используется январь = 0; и 2009 год = 109 на этой схеме. Таким образом, напечатанный месяц - 1 и полный год - 1900.

use POSIX qw<mktime>;

my ( $year, $month, $day ) = split '-', $date;
my $three_day_prior = mktime( 0, 0, 0, $day - 3, $month - 1, $year - 1900 );

mktime также полезен для определения последнего дня месяца. Вы просто переходите к дню 0 следующего месяца.

mktime( 0, 0, 0, 0, $month, $year - 1900 );
0
ответ дан 18 December 2019 в 05:44
поделиться

Это просто с Date :: Simple

C:\>perl -MDate::Simple=today -e "print today()-3"
2009-08-30
0
ответ дан 18 December 2019 в 05:44
поделиться

DateTime - канонический способ работы с датами в современном Perl:

use DateTime;

my ($year, $month, $day) = split '-', '2009-09-01';

my $date = DateTime->new( year => $year, month => $month, day => $day );

$date->subtract( days => 3 );

# $date is now three days earlier (2009-08-29T00:00:00)
6
ответ дан 18 December 2019 в 05:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: