perl strftime 本地时间减去 12 小时

Dri*_*rin 1 perl datetime strftime localtime

我正在使用 perl strftime for (datetime now)

perl -MPOSIX -e 'print POSIX::strftime("%m/%d/%Y %H:%M", localtime());'
Run Code Online (Sandbox Code Playgroud)

我想现在减去 12 小时的日期时间

输出示例: 2/7/2020 1:002/6/2020 13:00<- 仅减去 12 小时

请使用提到的代码帮助解决此问题

zdi*_*dim 6

POSIXstrftime

返回字符串。

并且您不能方便地从字符串中减去小时数。

相反,使用库进行日期时间处理进行操作,然后使用 strftime

Time::Piece的示例

perl -MTime::Piece -MTime::Seconds -wE'
    $t = (localtime) - 12*ONE_HOUR;
    say $t->strftime("%m/%d/%Y %H:%M")'
Run Code Online (Sandbox Code Playgroud)

时间::秒自带一起Time::Piece,为各种日期时间计算。

虽然它Time::Piece是核心、良好和众所周知的,但它确实有微妙之处和局限性,对于更多涉及的工作,我建议使用无所不知(而且又大又重)的DateTime

perl -MDateTime -wE'
    $t = DateTime->now(time_zone => "local")->subtract(hours => 12); 
    say $t->strftime("%m/%d/%Y %H:%M")'
Run Code Online (Sandbox Code Playgroud)

我认为值得强调的是,该模块几乎可以完成所有有关日期时间的工作。


请注意,请记住夏令时更改带来的问题。在时钟的奇迹般的跳跃和偶尔不存在的时间之间可能会有不愉快的惊喜,尽管很少(一个例子)。

这是ikegami提供的程序,用于测试即将到来的夏令时(3 月 8 日,凌晨 2 点 -> 凌晨 3 点)

use strict;
use warnings;

use DateTime      qw( );
use POSIX         qw( strftime );
use Time::Piece   qw( localtime );
use Time::Seconds qw( ONE_HOUR );

my $epoch = 1583683200;  # 2020-03-08T12:00:00

CORE::say
   for
      DateTime->from_epoch( epoch => $epoch, time_zone => $ENV{TZ} )
              ->subtract( hours => 12 ),
      strftime("%FT%T", localtime($epoch - 12*60*60)),
      ( localtime($epoch) - 12*ONE_HOUR )->strftime("%FT%T");
Run Code Online (Sandbox Code Playgroud)

然后设置TZ环境变量并运行它

TZ=America/New_York perl test_DST.pl
Run Code Online (Sandbox Code Playgroud)

(在 bash 中,而在 tcsh 中是setenv TZ "America/New_York"; perl test_DST.pl)  

输出

2020-03-07T23:00:00
2020-03-07T23:00:00
2020-03-07T23:00:00

具有该名称的函数存在于许多环境中,并且始终返回格式化的字符串。