Perl:将当前时间与特定时间进行比较
Perl: compare current time to a specific time to
我是 perl 的新手。我正在研究每天运行的脚本。我想检查当前时间是否小于特定时间。我目前的解决方案是从localtime
中提取hour
和min
,然后进行比较。但我被告知要找到更好的解决方案。
当前代码:
my $flag;
for (;;) {
$flag = GetValue();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if( $flag ) {
#do action here
last;
} elsif ( $hour <= 17 ) {
if( $min <=30 ) {
print STDOUT "Keep running till 17:30 \n";
sleep 300;
} else {
die "Error";
}
} else {
die "Error";
}
}
基本上,语句 $flag = GetValue();
有时会意外地 returns 未定义值并导致脚本失败。所以我们要检查 $flag 是否定义。如果它被定义,那么我们执行一些代码并退出 for 循环。否则我们检查时间。如果时间小于 17:30 那么我们要等待一段时间并尝试再次获取标志的值。我只需要将比较当前时间的逻辑改成17:30
我想要我的东西:
} elsif ( $current_time <= 17:30 ) {
print STDOUT "Keep running till 17:30 \n";
sleep 300;
}
如何实现?
处理date-times的好方法是使用一个好的库,比如DateTime
my $dt_mark = DateTime
-> now(time_zone => 'local')
-> set(hour => 17, minute => 30);
for (;;) {
...
elsif ( DateTime->now(time_zone => 'local') <= $dt_mark ) {
...
可以避免为每次比较都构造一个新对象,但这会使代码更加复杂。请注意,DateTime
是一个大型图书馆,这可能有点矫枉过正。
如果目的确实只是将当前时间与固定时间进行比较 hour-minute 那么也许
elsif ( $hour < 17 or ($hour == 17 and $min <= 30) )
够好吗?
或者构成并使用可以进行词法比较的字符串
elsif ( sprintf("%02d%02d", $hour, $min) lt '1730' )
为了所述目的,可以这样做
my (undef, $min, $hour) = localtime(time);
这可能更清楚,因为它直接指示使用了 localtime
return 的哪些部分。
也可以省略 time
,根据 localtime
localtime EXPR
localtime
...
If EXPR is omitted, localtime
uses the current time (as returned by time
).
我是 perl 的新手。我正在研究每天运行的脚本。我想检查当前时间是否小于特定时间。我目前的解决方案是从localtime
中提取hour
和min
,然后进行比较。但我被告知要找到更好的解决方案。
当前代码:
my $flag;
for (;;) {
$flag = GetValue();
my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
if( $flag ) {
#do action here
last;
} elsif ( $hour <= 17 ) {
if( $min <=30 ) {
print STDOUT "Keep running till 17:30 \n";
sleep 300;
} else {
die "Error";
}
} else {
die "Error";
}
}
基本上,语句 $flag = GetValue();
有时会意外地 returns 未定义值并导致脚本失败。所以我们要检查 $flag 是否定义。如果它被定义,那么我们执行一些代码并退出 for 循环。否则我们检查时间。如果时间小于 17:30 那么我们要等待一段时间并尝试再次获取标志的值。我只需要将比较当前时间的逻辑改成17:30
我想要我的东西:
} elsif ( $current_time <= 17:30 ) {
print STDOUT "Keep running till 17:30 \n";
sleep 300;
}
如何实现?
处理date-times的好方法是使用一个好的库,比如DateTime
my $dt_mark = DateTime
-> now(time_zone => 'local')
-> set(hour => 17, minute => 30);
for (;;) {
...
elsif ( DateTime->now(time_zone => 'local') <= $dt_mark ) {
...
可以避免为每次比较都构造一个新对象,但这会使代码更加复杂。请注意,DateTime
是一个大型图书馆,这可能有点矫枉过正。
如果目的确实只是将当前时间与固定时间进行比较 hour-minute 那么也许
elsif ( $hour < 17 or ($hour == 17 and $min <= 30) )
够好吗?
或者构成并使用可以进行词法比较的字符串
elsif ( sprintf("%02d%02d", $hour, $min) lt '1730' )
为了所述目的,可以这样做
my (undef, $min, $hour) = localtime(time);
这可能更清楚,因为它直接指示使用了 localtime
return 的哪些部分。
也可以省略 time
,根据 localtime
localtime EXPR
localtime
...
If EXPR is omitted,localtime
uses the current time (as returned bytime
).