【问题标题】:perl to open file with yesterday's date in localtime()perl 在 localtime() 中打开具有昨天日期的文件
【发布时间】:2014-05-05 20:43:06
【问题描述】:

我需要打开带有今天日期和昨天日期的文件,我可以打开今天的文件,但我不知道如何打开昨天,我使用的是本地时间,因为我的 perl 版本是 5.8.8。 所以其他时间/日期模块不可用 这就是我目前所拥有的

#!/usr/local/bin/perl

@months = qw( Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec );
@days = qw(Sun Mon Tue Wed Thu Fri Sat Sun);

($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(); 
$year = $year+1900;

print "c:\\DBR_$year\\$months[$mon]\\Failures_output\\$mday$months[$mon]report.csv"
    || die "can't open output file for reading: $!";

打印出来

c:\DBR_2014\May\Failures_output\5Mayreport.csv

现在我如何打开与昨天日期相同的文件

【问题讨论】:

    标签: perl


    【解决方案1】:

    localtime/mktime 往返将为您提供昨天开始时午夜的纪元编号(即 mday 比现在少 1 的时间)

    use POSIX 'mktime';
    
    my @now = localtime();
    my $yesterday = mktime 0, 0, 0, $now[3]-1, $now[4], $now[5];
    

    然后您可以将其放入strftime 以提供时间字符串;你不需要像这样的几个月的数组

    use POSIX 'strftime';
    
    my $path = strftime("c:\\DBR_%Y\\%b\\Failures_output\\%d%breport.csv", localtime($yesterday));
    

    (您不必担心mday 已经为 1 的情况,因为mktime 会正确处理)。

    【讨论】:

    • 通过将 12 小时作为 mktime 来避免某些地方出现奇怪的 dst 问题
    【解决方案2】:

    localtime 可以接受一个纪元秒参数,所以一定要获取昨天的日期,只需调用

    @yesterday = localtime( time - 86400 );   # 86400 = 24 * 60 * 60
    

    【讨论】:

    • 这在一年中 DST 恢复到标准时间的那一天不太适用。因此,前一天只有 23 小时;如果您在之后一天的第一个小时内拨打此电话,您将跳过昨天并打到前一天。因此为什么 localtime/mktime 与 mday - 1 往返。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2019-12-06
    • 1970-01-01
    相关资源
    最近更新 更多