2015-09-24 4 views
0

Я пытаюсь вычислить дату/время в течение семи дней и четырех часов в будущем с введенной даты и распечатать его в удобном для восприятия формате.Расчет даты в Perl

у меня есть:

print "Enter a date YYYY MM DD. Remember perl's months go from 0-11.\n"; 
while (@dateEnt < 1) { 
    my $dateEntered = <STDIN>; 
    chomp $dateEntered; 
    push @dateEnt, $dateEntered; 

    (@datedata) = split (/\s+/, $dateEntered); 
    $year= $datedata[0]; 
    $month = $datedata[1]; 
    $day = $datedata[2]; 
} 

$time = time; 
$readabletime = localtime($time); 

use Time::Local; 
$timeEntUseable = timelocal(00, 00, 00, $day, $month, $year); 
$laterdate = localtime($timeEntUseable + (60 * 60 * 4 * 24)); 
print "The time 7 days and 4 hours from the time entered is $laterdate\n"; 

Когда я вхожу 2015 00 01 (1 января 2015) в первый вопрос мой результат 2 января 2015 в 4:00:00. Ответ должен быть 7 января 2015 года в 4:00:00. Любая помощь?

ответ

0

Я думаю, что здесь:

$laterdate = localtime($timeEntUseable + (60 * 60 * 4 * 24)); 

должно быть:

$laterdate = localtime($timeEntUseable + (60 * 60 * (24 * 7 + 4))); 

И не правильный выход 8 января 2015 в 4:00:00?

  • 60 * 60 означает, по часу
  • 24 * 7 означает часов 7 дней
  • + 4 означает дополнительные 4 часа, что 7 дней
6

Использование Time :: Кусок и времени :: секунд (ядро начиная с 5.10):

#!/usr/bin/perl 
use warnings; 
use strict; 
use Time::Piece; 
use Time::Seconds; 

my $date; 
until ($date) { 
    print 'Enter a date (YYYY/MM/DD): '; 
    chomp(my $input = <>); 
    $date = eval { 'Time::Piece'->strptime($input, '%Y/%m/%d') }; 
} 
$date += 7 * ONE_DAY + 4 * ONE_HOUR; 
print $date, "\n"; 

Обратите внимание, что результатом является Thu J a 04:00:00 2015, как 1 + 7 = 8.

+0

Есть ли причина использовать 'eval' здесь? Можем ли мы не называть 'Time :: Pice-> strptime' напрямую? – srvsh

+0

@skmrx: Он обрабатывает неправильный ввод, например «сегодня», «qwerty» и т. Д. – choroba

+0

Спасибо, это приятно! – srvsh