输入:45天
应使用perl
更新
从评论中复制的代码。
use POSIX 'strftime';
print strftime "%Y_%m_%d_%H_%M_%S/n", localtime() - 24 * 60 * 60;
答案 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);
非常接近。你有三个小问题。
/n
意味着\n
。24 * 60 * 60
,这是一天。你想要45 *24 * 60 * 60
。time()
的输出中减去45天,然后将该值传递给localtime()
。所以使用你的方法,你会想要:
use POSIX 'strftime';
print strftime "%Y_%m_%d_%H_%M_%S\n", localtime(time - 45 * 24 * 60 * 60;
但是我使用Time::Piece和Time::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";