Как получить вчера дату с использованием localtime?
Как настроить это, чтобы получить вчерашнюю дату с использованием localtime?
use strict;
sub spGetCurrentDateTime;
print spGetCurrentDateTime;
sub spGetCurrentDateTime {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my $currentDateTime = sprintf "%s %02d %4d", $abbr[$mon], $mday, $year+1900; #Returns => 'Aug 17 2010'
return $currentDateTime;
}
~
Ответы
Ответ 1
Задачу DST можно обойти, взяв 3600 с сегодняшнего дня вместо текущего времени:
#!/usr/bin/perl
use strict;
use warnings;
use Time::Local;
sub spGetYesterdaysDate;
print spGetYesterdaysDate;
sub spGetYesterdaysDate {
my ($sec, $min, $hour, $mday, $mon, $year) = localtime();
my $yesterday_midday=timelocal(0,0,12,$mday,$mon,$year) - 24*60*60;
($sec, $min, $hour, $mday, $mon, $year) = localtime($yesterday_midday);
my @abbr = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
my $YesterdaysDate = sprintf "%s %02d %4d", $abbr[$mon], $mday, $year+1900;
return $YesterdaysDate;
}
В свете "неуказанного" документально подтвержденного поведения решения strftime, предложенного Chas, этот подход может быть лучше, если вы не сможете проверить ожидаемые, но не гарантированные результаты на нескольких платформах.
Ответ 2
use DateTime qw();
DateTime->now->subtract(days => 1);
Выражение во второй строке возвращает объект DateTime
.
Ответ 3
Как заманчиво, чтобы просто вычесть день за секунды из текущего времени, бывают случаи, когда это даст неправильный ответ (секунды прыжка, DST и, возможно, другие). Мне легче просто оставить strftime
(доступный в основном модуле Perl 5 POSIX
), чтобы позаботиться обо всем этом для меня.
#!/usr/bin/perl
use strict;
use warnings;
use Time::Local;
use POSIX qw/strftime/;
#2010-03-15 02:00:00
my ($s, $min, $h, $d, $m, $y) = (0, 0, 0, 15, 2, 110);
my $time = timelocal $s, $min, $h, $d, $m, $y;
my $today = strftime "%Y-%m-%d %T", localtime $time;
my $yesterday = strftime "%Y-%m-%d %T", $s, $min, $h, $d - 1, $m, $y;
my $oops = strftime "%Y-%m-%d %T", localtime $time - 24*60*60;
print "$today -> $yesterday -> $oops\n";
Ответ 4
используйте Time:: Piece.
use strict;
use warnings;
use 5.010;
# These are core modules in Perl 5.10 and newer
use Time::Piece;
use Time::Seconds;
my $yesterday = localtime() - ONE_DAY;
say $yesterday->strftime('%b %d %Y');
Обратите внимание, что это может пойти не так в некоторых пограничных случаях, таких как начало летнего времени.
Следующая версия в таких случаях ведет себя правильно:
use strict;
use warnings;
use 5.010;
# These are core modules in Perl 5.10 and newer
use Time::Piece;
use Time::Seconds;
my $now = localtime();
my $yesterday = $now - ONE_HOUR*($now->hour + 12);
say $yesterday->strftime('%b %d %Y');
В качестве альтернативы вы можете использовать модуль DateTime, как описано в другом ответе. Это не основной модуль.
Ответ 5
Решение, предложенное большинством пользователей, неверно!
localtime(time() - 24*60*60)
наихудшая вещь, которую вы можете сделать, это предположить, что 1 день = 86400 секунд.
Пример: Часовой пояс America/New_York, дата - Пн Апр 3 00:30:00 2006
timelocal дает нам 1144038600
localtime (1144038600 - 86400) = Сб. 1 апреля 23:30:00 EST 2006
упс!
Право и единственное решение - позволить системной функции нормализовать значения
$prev_day = timelocal(0, 0, 0, $mday-1, $mon, $year);
Или пусть datetime frameworks (DateTime, Class::Date, etc)
делают то же самое.
Что это.
Ответ 6
localtime(time() - 24*60*60)
Ответ 7
This is how I do it.
#!/usr/bin/perl
use POSIX qw(strftime);
$epoc = time();
$epoc = $epoc - 24 * 60 * 60;
$datestring = strftime "%F", localtime($epoc);
print "Yesterday date is $datestring \n";