Как я могу преобразовать время эпохи в YMD в Perl? - PullRequest
1 голос
/ 19 июня 2020

Я пытаюсь преобразовать дату из эпохи в день месяца в году и получить правильную дату.

my $day = 18322;
my ($y, $m, $d) = (gmtime 86400*$day)[5,4,3];

Дата эпохи 1583020800 Преобразование выглядит следующим образом $y is 120 $m is 2 $d is 1 Думаю, у меня есть чтобы добавить $y = $y+1900 Я получаю правильный год, я могу добавить 1 к $m, чтобы получить правильный месяц день $d Мне не нужно ничего добавлять. Это верно. Я принимаю код для кого-то, но понятия не имею, что делает [5,4,3].

Ответы [ 3 ]

4 голосов
/ 19 июня 2020

Эпоха 1583020800: 1 марта 00:00:00 2020.

Можно использовать gmtime, но это неудобно. Он возвращает массив значений, и их нужно преобразовать. Год - это количество лет, прошедших с 1900 года, а месяц начинается с 0. Это потому, что это тонкая оболочка вокруг struct tm из C языка программирования Perl записывается.

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

Вместо этого используйте встроенный Time :: Piece .

use v5.10;

use Time::Piece;
my $time = Time::Piece->gmtime(1583020800);
say $time->ymd;

Или более мощный DateTime .

use v5.10;

use DateTime;
my $dt = DateTime->from_epoch(epoch => 1583020800);
say $dt->ymd;
3 голосов
/ 21 июня 2020

(...)[5,4,3] - это буквальный фрагмент списка. Элемент внутри скобок создает список, но при этом выбираются только элементы 5, 4 и 3.

Документы gmtime указывают на localtime , который показывает вам положение каждого элемента. в его списке:

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);
0 голосов
/ 22 июня 2020

Я бы использовал Time :: Piece, как в ответе Шверна. Но, чтобы охватить все основы, вы также можете использовать функцию strftime() из POSIX.pm.

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

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

Вывод:

2020-03-01

Вы можете передавать строки разных форматов в strftime().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...