问题描述
我有一个下面的脚本,该脚本应该获取最近两天的日期。
我发现了2种不同的方法,但是一种方法可以很好地工作(array2
),而另一种方法则不能(array1
)。
下面是我的脚本:
use strict;
use warnings;
use Data::Dumper;
my (@array1,@array2);
$array1[1] = `TZ=GMT+24 date +%Y\-%m\-%d`; chomp $array1[1];
$array1[2] = `TZ=GMT+48 date +%Y\-%m\-%d`; chomp $array1[2];
print "array1:\n".Dumper(\@array1);
$array2[1] = `date --date='1 day ago' "+%Y-%m-%d"`; chomp $array2[1];
$array2[2] = `date --date='2 day ago' "+%Y-%m-%d"`; chomp $array2[2];
print "array2:\n".Dumper(\@array2);
在两个数组中,其日期都应为过去2天。
例如:如果今天是2020-08-14
,则应将数组元素打印为2020-08-13
和2020-08-12
。
在array2
中按预期方式打印,但在array1
中按正常方式打印(请更正为使用TZ
获取过去日期的正确方法)。
我得到的结果如下:
array1:
$VAR1 = [
undef,'2020-08-13','2020-08-13'
];
array2:
$VAR1 = [
undef,'2020-08-12'
];
每个数组中的第一个元素还有undef
。为什么会这样?
我正在Linux version 2.6.32
中运行此脚本。
解决方法
除了调整后的24小时内,您无法使用TZ
变量进行数学运算。在TZ的文档中,请注意:
std偏移量
std字符串指定时区的名称。它必须是三个或更多字符,并且不能包含前导冒号,嵌入的数字,逗号或正负号。时区名称与偏移量之间没有空格字符,因此必须正确使用这些限制。
偏移量指定您必须将其添加到本地时间以获得协调世界时值的时间值。它的语法类似于[+ |-] hh [:mm [:ss]]。如果当地时区在本初子午线以西,则为正;如果当地时区在东,则为负。小时必须在0到24之间,分钟和秒必须在0到59之间。
如前所述,Perl具有简单,简单的方法来操纵时间。您的代码派生了一个外部Shell进程,以实现本机可以完成的操作,因此虽然可用于GNU版本date
的第二种方法,但仍不理想。
$ for z in `seq 1 36`; do echo -n "$z - "; TZ="GMT+$z" date; done
1 - Fri 14 Aug 12:01:32 GMT 2020
2 - Fri 14 Aug 11:01:32 GMT 2020
3 - Fri 14 Aug 10:01:32 GMT 2020
4 - Fri 14 Aug 09:01:32 GMT 2020
5 - Fri 14 Aug 08:01:32 GMT 2020
6 - Fri 14 Aug 07:01:32 GMT 2020
7 - Fri 14 Aug 06:01:32 GMT 2020
8 - Fri 14 Aug 05:01:32 GMT 2020
9 - Fri 14 Aug 04:01:32 GMT 2020
10 - Fri 14 Aug 03:01:32 GMT 2020
11 - Fri 14 Aug 02:01:32 GMT 2020
12 - Fri 14 Aug 01:01:32 GMT 2020
13 - Fri 14 Aug 00:01:32 GMT 2020
14 - Thu 13 Aug 23:01:32 GMT 2020
15 - Thu 13 Aug 22:01:32 GMT 2020
16 - Thu 13 Aug 21:01:32 GMT 2020
17 - Thu 13 Aug 20:01:32 GMT 2020
18 - Thu 13 Aug 19:01:32 GMT 2020
19 - Thu 13 Aug 18:01:32 GMT 2020
20 - Thu 13 Aug 17:01:32 GMT 2020
21 - Thu 13 Aug 16:01:32 GMT 2020
22 - Thu 13 Aug 15:01:32 GMT 2020
23 - Thu 13 Aug 14:01:32 GMT 2020
24 - Thu 13 Aug 13:01:32 GMT 2020
25 - Thu 13 Aug 13:01:32 GMT 2020
26 - Thu 13 Aug 13:01:32 GMT 2020
27 - Thu 13 Aug 13:01:32 GMT 2020
28 - Thu 13 Aug 13:01:32 GMT 2020
29 - Thu 13 Aug 13:01:32 GMT 2020
30 - Thu 13 Aug 13:01:32 GMT 2020
31 - Thu 13 Aug 13:01:32 GMT 2020
32 - Thu 13 Aug 13:01:32 GMT 2020
33 - Thu 13 Aug 13:01:32 GMT 2020
34 - Thu 13 Aug 13:01:32 GMT 2020
35 - Thu 13 Aug 13:01:32 GMT 2020
36 - Thu 13 Aug 13:01:32 GMT 2020
您的第一种方法似乎可以使用24小时。由于时差不超过24小时是没有意义的,我希望date
足够聪明,可以将时差限制为24小时。