【问题标题】:Perl Date calculations over two monthsPerl 两个月内的日期计算
【发布时间】:2014-09-26 18:28:25
【问题描述】:

我有一份报告,每周在星期五运行一些数据库查询,其中数据是从星期一到星期五,并生成一个包含结果的表格。当报告在上个月星期一的星期五运行时,我遇到了问题。例如上周五。星期五是 8 月的第一天,星期一是 7 月 28 日。以下是我的脚本的日期和时间部分。

    my $date = `date +%Y%m%d`;
    chomp($date);
    my $time = `date +%H%M%S`;
    chomp($time);
    my $day = `date +%A`; 
    chomp($day);
    my $time = `date +%H%M%S`; 
    chomp($time);
    my $dispTime = `date +%H:%M`; 
    chomp($dispTime);

    # Set the Dates
    my $end = $date;
    my $start = $end;

    # Check the day and define start and end dates.

    if ($day eq "Friday") {
    $start = $end - 5;
    my @mytime=localtime;
    my ($s, $min, $h, $d, $m, $y) = (0, 0, 0, $mytime[3], $mytime[4], $mytime[5]);
    my $todayminus5 = strftime "%Y%m%d", $s, $min, $h, $d - 5, $m, $y;
    $start = $todayminus5;

在我的报告日志中,它打印了计算的日期并打印了这个

    Start Date = 2014080,
    End Date = 20140801

有谁知道为什么这似乎无法计算超过两个月的日期?

【问题讨论】:

    标签: mysql sql perl date


    【解决方案1】:

    您应该将Time::Piece 与其姊妹模块Time::Seconds 结合使用。如果你有一个相当新的 Perl 版本,那么它应该已经安装了,因为它从 Perl 5 版本 10 开始就是一个核心模块。

    顺便说一句,从星期五到前一个星期一,你需要减去 天!

    use strict;
    use warnings;
    
    use Time::Piece;
    use Time::Seconds 'ONE_DAY';
    
    my $now = localtime;
    
    if ($now->wdayname eq 'Fri') {
      my $monday = ($now - ONE_DAY * 4)->strftime('%Y%m%d');
    
      # etc.
    }
    

    【讨论】:

      【解决方案2】:

      我会重新设计您正在采用的方法 - 您正在多次调用 date,这首先可能是一个警告信号。你有很多边缘情况——如果是在月初,从你的日子中减去“5”会给你一个负数——这会破坏事情——但是当年份变化时你会遇到类似的问题。

      我不会与上一篇文章相矛盾,但我建议您简化一下:

      my $ONE_DAY_s = 60 * 60 * 24; 
      my $now = time();
      
      my $then = $now - 4*$ONE_DAY_s;
      
      my ( $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($now);
      $year += 1900;
      
      print "Now: $year $mon $mday\n";
      
      ( $sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime($then);
      $year += 1900;
      
      print "Then: $year $mon $mday\n";
      

      (转录,而不是粘贴,因此请注意拼写错误)。

      您可以使用$wday 来确定是否是星期五。

      尽管存在执行此操作的模块 - 我会非常谨慎地使用重复调用外部命令,然后尝试破坏结果。

      【讨论】:

        【解决方案3】:

        您可以使用Datetime 模块获取开始日期和结束日期

        例子:

        use strict;
        use warnings;
        
        use DateTime;
        
        my $today_date = DateTime->today();                         # Current date (Friday)
        my $old_date = $today_date->clone()->subtract(days => 4);   # First DoW (Monday)
        
        print $today_date, "\n";
        print $old_date, "\n";
        

        输出:

        2014-08-04T00:00:00
        2014-07-31T00:00:00
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-12-04
          • 1970-01-01
          • 2022-11-18
          • 1970-01-01
          • 1970-01-01
          • 2021-07-20
          相关资源
          最近更新 更多