Perl Localtime возвращает 16 часов, когда ввод только секунды - PullRequest
1 голос
/ 20 января 2011

Я, должно быть, делаю что-то не так, но я не могу понять это. Когда я даю секунды в качестве аргумента для localtime (), я получаю секунды и 16 часов назад.

my $startTime = time;

(process)

my $endTime = time;

my $diffTime = ( $endTime - $startTime );

($sec,$min,$hour) = localtime( $diffTime );

print STDERR "diffTime = $diffTime\n";
print STDERR "hour = $hour\n";
print STDERR "min= $min\n";
print STDERR "sec = $sec\n";

print( sprintf( "Elapsed time : %02d:%02d:%02d\n", $hour, $min, $sec ) );

... всегда печатает:

diffTime = 4
hour = 16
min= 0
sec = 4
Elapsed time : 16:00:04

ХОРОШО. Выяснили, как добавлять комментарии - настройки NoScript были слишком жесткими.

Спасибо ...

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

Проблема не в том, чтобы использовать gmtime. Возможно, это не самое эффективное решение, но оно работает для того, что мне нужно, это всего лишь простая информация, позволяющая пользователю оценить, как долго он может ждать завершения процедуры, и принять решение о том, насколько велик вход набор данных, с которым ему / ей удобно.

Ответы [ 4 ]

5 голосов
/ 20 января 2011

$difftime - это разница между двумя "временами эпохи" (секундами с полуночи по Гринвичу 01.01.1970), но это не делает время эпохиТак что это не совсем подходящий аргумент для localtime().Вам лучше самим вычислить разбивку по ч / м / с:

($sec,$min,$hour) = ($difftime % 60, int($difftime/60) % 60, int($difftime/3600));
5 голосов
/ 20 января 2011

Вы смешиваете длительности и временные метки, это напрашивается на неприятности ... Вы можете отказаться от использования gmtime, как предполагает Мансур, но тем не менее вы используете яблоко в качестве апельсина.

Следующее работает и использует модули ядра Time :: Piece и Time :: Seconds . Для $diffTime->pretty вам нужна более новая версия (1.20) Time :: Piece, чем та, которая связана с текущими версиями Perl.

use strict;
use warnings;
use 5.010;
use Time::Piece 1.20;

my $startTime = localtime();

# (process)

my $endTime = localtime();

my $diffTime = ( $endTime - $startTime );

say STDERR "diffTime = ", $diffTime;
say STDERR "hours = ", $diffTime->hours;      # not the same thing as above
say STDERR "minutes = ", $diffTime->minutes;  # not the same thing as above
say STDERR "seconds = ", $diffTime->seconds;  # not the same thing as above

say "Elapsed time: ", $diffTime->pretty;

Это может напечатать что-то вроде:

150
0.0416666666666667
2.5
150
2 minutes, 30 seconds
4 голосов
/ 20 января 2011

Вы хотите использовать функцию gmtime вместо функции localtime.

Поскольку датой начала является 1 января 1970 г. 00:00:00 GMT / UTC звонок по номеру localtime(0) даст вам дату эпохи в вашем часовом поясе.

РЕДАКТИРОВАТЬ: Спасибо за продолжение.Как уже упоминалось, это работает, только если вы измеряете интервал, который составляет менее 24 часов.Функции localtime и gmtime фактически возвращают значения даты: секунд, минут, часов, дня месяца, месяца, года, дня года и того, попадает ли время в летнее время.Конечно, все, кроме секунд, минут и часов, не имеет смысла вне контекста даты.

3 голосов
/ 20 января 2011

Это та же проблема, что и сказать, что поскольку ℉ → ℃ требует преобразования C = (F - 32) * 5/9, то, если он стал теплее на 5 ℉, это должно быть то же самое, что и повышение теплоты на −15 ℃, поскольку получить, когда вы просто вставьте 5 ℉ в очевидную, но неправильную формулу.

Видишь, почему это не имеет смысла? Согревание на 5 ℉ - это совсем не то же самое, что похолодание на 15 ℃!

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

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

...