localtime($seconds)
возвращает информацию о локальной дате и времени, соответствующую $seconds
секундам после полуночи 1 января 1970 года, UT C (1970-01-01T00: 00: 00Z), игнорируя високосные секунды.
Итак, предположим, что машина использует Европу / Париж в качестве часового пояса. Когда было 0 секунд после 1970-01-01T00: 00: 00Z, местное время было бы 1970-01-01T01: 00: 00 + 01: 00. Поэтому на такой машине вы получаете 01:00:00
.
#!/usr/bin/perl
use feature qw( say );
use POSIX qw( strftime );
say strftime("%Y-%m-%dT%H:%M:%S%z", localtime(0)) =~ s/(?=..\z)/:/r;
say strftime(" %H:%M:%S", localtime(0));
$ TZ=Europe/Paris ./a
1970-01-01T01:00:00+01:00
01:00:00
$ TZ=America/Montreal ./a
1969-12-31T19:00:00-05:00
19:00:00
. Вы не должны использовать localtime
. Вы могли бы использовать gmtime
в некоторой степени.
#!/usr/bin/perl
use feature qw( say );
use POSIX qw( strftime );
say strftime("%Y-%m-%dT%H:%M:%SZ", gmtime(0));
say strftime(" %H:%M:%S", gmtime(0));
$ TZ=Europe/Paris ./b
1970-01-01T00:00:00Z
00:00:00
$ TZ=America/Montreal ./b
1970-01-01T00:00:00Z
00:00:00
Но на самом деле, вы даже не должны использовать strftime
, так как это для времени, а не продолжительности. Это будет работать, но только в экстенте.
strftime("%H:%M:%S", gmtime($secs))
будет работать в течение, но не включая 24 * 60 * 60 секунд. strftime("%d:%H:%M:%S", gmtime($secs))
будет работать в течение длительностей до, но не включая 31 * 24 * 60 * 60 секунд, если вы можете представлять день как 24 часа.