减去系统日期的天数并在perl中转换为MMDDYYYY格式

时间:2015-12-02 06:10:03

标签: perl

输入:45天
应使用perl

将其转换为system_date-45 = MMDDYYYY格式

更新

从评论中复制的代码。

use POSIX 'strftime';
print strftime "%Y_%m_%d_%H_%M_%S/n", localtime() - 24 * 60 * 60;

4 个答案:

答案 0 :(得分:1)

围绕夏令时的边缘情况如此之多,我强烈建议使用正确的日期时间库。我还强烈建议你使用标准的YYYY-MM-DD格式:它是明确的(01022015 Jan2或Feb1?)并且它在词汇上排序正确。

$ perl -MDateTime -E '
    say DateTime->now
                ->set_time_zone("local")
                ->subtract(days => 45)
                ->strftime("%F")
'
2015-10-18

答案 1 :(得分:0)

由于你没有包括你的工作原因,我接近结束了这个问题。但我已经看到了你的评论 - 你应该编辑你的问题以包含它。

所以这是你的代码:

use POSIX 'strftime';
print strftime "%Y_%m_%d_%H_%M_%S/n", localtime() - 24 * 60 * 60);

非常接近。你有三个小问题。

  1. 您的/n意味着\n
  2. 你有24 * 60 * 60,这是一天。你想要45 *24 * 60 * 60
  3. 您需要从time()的输出中减去45天,然后将该值传递给localtime()
  4. 所以使用你的方法,你会想要:

    use POSIX 'strftime';
    print strftime "%Y_%m_%d_%H_%M_%S\n", localtime(time - 45 * 24 * 60 * 60;
    

    但是我使用Time::PieceTime::Seconds来编写它(两者都是自5.10以来Perl代码的一部分。

    use 5.010; # for say()
    use Time::Seconds;
    use Time::Piece
    
    say localtime(time - 45 * ONE_DAY)->strftime("%Y_%m_%d_%H_%M_%S");'
    

    更新:如果您要在DST转换的几个小时内运行此功能,那么您将得到错误的答案。解决此问题的常用方法是在进行减法之前将当地时间标准化为中午。

答案 2 :(得分:0)

如果您使用的是Linux系统,可以尝试:

#!/usr/bin/perl
my $date=`date +%m%d%Y -d "45 day ago"`; # This will work only on **linux**
print $date;

答案 3 :(得分:-1)

你可以使用Date :: Format中的time2str (86400是一天中的秒数)

use Date::Format; print time2str("%m%d%Y",time()-45*86400),"\n";