Linux 日期在Perl代码中解析不正确

Linux 日期在Perl代码中解析不正确,linux,perl,date,Linux,Perl,Date,我有一个下面的脚本,应该取得最后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

我有一个下面的脚本,应该取得最后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-13',
          '2020-08-12'
        ];
还有
unde
作为每个数组中的第一个元素。为什么会这样


我在
Linux 2.6.32版中运行此脚本

除了在+-24小时内进行调整外,您无法使用
TZ
变量进行计算。从的文档中,请注意:

标准偏差

std字符串指定时区的名称。它的长度必须为三个或三个以上字符,且不得包含前导冒号、嵌入数字、逗号或加号和减号。时区名称与偏移量之间没有空格字符分隔,因此这些限制是正确解析规范所必需的

偏移量指定必须添加到本地时间的时间值,以获得协调的通用时间值。它的语法类似于[+-]hh[:mm[:ss]]。如果当地时区位于本初子午线以西,则为正;如果位于东面,则为负。小时必须介于0和24之间,分秒必须介于0和59之间


如前所述,Perl提供了简单、无误的时间操纵方法。您的代码分叉了一个外部外壳过程,以实现本机可以完成的任务,因此这是不可取的,尽管对于GNU版本的
date

第二种方法选择是可行的,但除了在+-24小时内进行调整外,您不能使用
TZ
变量进行数学运算。从的文档中,请注意:

$ 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
标准偏差

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小时


您的第一种方法似乎可以工作24小时。由于时差超过24小时毫无意义,我认为
date
足够聪明,可以将时差限制在24小时。

你为什么要花费大量精力来确定这些日期?core Perl附带了很多工具来完成您想要做的事情。@simbabque,我理解这一点,我会一直使用Perl来完成这一点。由于这些脚本已经是以这种方式编写的,因此尝试理解其未正确解析的原因。即使它添加了24/48小时,它也会将UTC+0时某人的当前日期添加到24/48小时,而不是本地当前日期的24/48小时。你好像忘了世界各地的日子都不一样@ikegami在这种情况下至少应该更改日期,对吗?我在想
@array1
应该产生与
@array2
相同的结果。我的理解正确吗?你为什么要花这么多时间去约会?core Perl附带了很多工具来完成您想要做的事情。@simbabque,我理解这一点,我会一直使用Perl来完成这一点。由于这些脚本已经是以这种方式编写的,因此尝试理解其未正确解析的原因。即使它添加了24/48小时,它也会将UTC+0时某人的当前日期添加到24/48小时,而不是本地当前日期的24/48小时。你好像忘了世界各地的日子都不一样@ikegami在这种情况下至少应该更改日期,对吗?我在想
@array1
应该产生与
@array2
相同的结果。我的理解正确吗?