Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Perl中将历元时间转换为YMD?_Perl - Fatal编程技术网

如何在Perl中将历元时间转换为YMD?

如何在Perl中将历元时间转换为YMD?,perl,Perl,我正在尝试将一个日期从历元转换为年-月-日,并获得正确的日期 my $day = 18322; my ($y, $m, $d) = (gmtime 86400*$day)[5,4,3]; 纪元日期为1583020800转换如下$y为120$m为2$d为1 我想我必须加上$y=$y+1900我得到了正确的年份,我可以在$m中加上1来得到正确的月份日期$d我不需要添加任何内容。这是正确的吗。我正在为某人接管代码,但我不知道[5,4,3]的作用 大纪元时间1583020800是2020年3月1日太阳

我正在尝试将一个日期从历元转换为年-月-日,并获得正确的日期

my $day = 18322;
my ($y, $m, $d) = (gmtime 86400*$day)[5,4,3];
纪元日期为1583020800转换如下$y为120$m为2$d为1
我想我必须加上
$y=$y+1900
我得到了正确的年份,我可以在
$m
中加上1来得到正确的月份日期
$d
我不需要添加任何内容。这是正确的吗。我正在为某人接管代码,但我不知道
[5,4,3]
的作用

大纪元时间1583020800是2020年3月1日太阳00:00:00

您可以使用
gmtime
,但这很尴尬。它返回一个值数组,需要对它们进行转换。年份是自1900年以来的年数,月份从0开始。这是因为它是一个围绕Perl编写的薄包装器

my($y,$m,$d) = (gmtime(1583020800))[5,4,3];
$y += 1900;
$m += 1;
printf "%04d-%02d-%02d\n", $y, $m, $d;
相反,使用内置的

或者更强大


大纪元时间1583020800是太阳2020年3月1日00:00:00

您可以使用
gmtime
,但这很尴尬。它返回一个值数组,需要对它们进行转换。年份是自1900年以来的年数,月份从0开始。这是因为它是一个围绕Perl编写的薄包装器

my($y,$m,$d) = (gmtime(1583020800))[5,4,3];
$y += 1900;
$m += 1;
printf "%04d-%02d-%02d\n", $y, $m, $d;
相反,使用内置的

或者更强大

(…)[5,4,3]
是一个文本列表片段。parens中的东西创建了一个列表,但它只选择元素5、4和3

gmtime
docs指向,显示列表中每件事物的位置:

localtime
        Converts a time as returned by the time function to a 9-element
        list with the time analyzed for the local time zone. Typically
        used as follows:

            #     0    1    2     3     4    5     6     7     8
            my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                                        localtime(time);
(…)[5,4,3]
是一个文本列表片段。parens中的东西创建了一个列表,但它只选择元素5、4和3

gmtime
docs指向,显示列表中每件事物的位置:

localtime
        Converts a time as returned by the time function to a 9-element
        list with the time analyzed for the local time zone. Typically
        used as follows:

            #     0    1    2     3     4    5     6     7     8
            my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) =
                                                        localtime(time);

我会使用时间::片,如施沃恩的回答。但是为了涵盖所有基础,您也可以使用POSIX.pm中的
strftime()
函数

use feature 'say';
use POSIX qw[strftime];

say strftime('%Y-%m-%d', gmtime(1583020800));
输出:

2020-03-01

您可以将不同格式的字符串传递给strftime()

我将使用Time::Piece,如Schwern的答案所示。但是为了涵盖所有基础,您也可以使用POSIX.pm中的
strftime()
函数

use feature 'say';
use POSIX qw[strftime];

say strftime('%Y-%m-%d', gmtime(1583020800));
输出:

2020-03-01

您可以将不同格式的字符串传递给strftime()

您是从18322天开始的吗?或者epoch 158320800?“[5,4,3]所做的”是从数组中只提取需要的部分。由于
gmtime
返回一个数组,因此它周围的括号允许您直接使用
[5,4,3]
符号来获取所需的元素:5、4和3。请参阅
perldoc-f localtime
或了解有关gmtime/localtime数组的详细信息。您希望该历元时间的日期在哪个时区?是否从18322天开始?或者epoch 158320800?“[5,4,3]所做的”是从数组中只提取需要的部分。由于
gmtime
返回一个数组,因此它周围的括号允许您直接使用
[5,4,3]
符号来获取所需的元素:5、4和3。有关gmtime/localtime数组的详细信息,请参见
perldoc-f localtime
或。您希望该历元时间的日期位于哪个时区?如果要转换为YMD,则DateTime在这方面没有优势。这对于做复杂的日期数学很有好处,它涉及到所有需要的神秘细节。Schwern知道这一点,但大多数人不知道。如果转换为YMD是一项任务,DateTime在这方面真的没有优势。这对于做复杂的日期数学很有好处,它涉及到所有需要的神秘细节。Schwern知道这一点,但大多数人不知道。