+ -
当前位置:首页 → 问答吧 → 请教各位perl牛牛们,如何获得关于日期间隔的信息

请教各位perl牛牛们,如何获得关于日期间隔的信息

时间:2010-08-25

来源:互联网

比如怎么能得到2010年1月1日到2010年5月1日之间的所有日期(20100101,20100102,20100103..20100430,20100501)。初学,对perl中的一些时间函数不是很熟,请各位巨牛、大牛、小牛牛们指点...

作者: howdoyoudoworld   发布时间: 2010-08-25

本帖最后由 黑色阳光_cu 于 2010-08-25 01:45 编辑
  1. #!/bin/env perl

  2. # appleii
  3. # 2010.08.25

  4. use strict;
  5. use warnings;
  6. use Time::Local;

  7. sub get_date_range
  8. {
  9.         my ($date_s, $date_e) = @_;
  10.         my ($year_s, $mon_s, $day_s) = unpack("A4A2A2", $date_s);
  11.         my ($year_e, $mon_e, $day_e) = unpack("A4A2A2", $date_e);
  12.         my @date_range;

  13.         my $seconds_s = timelocal(0, 0, 0, $day_s, $mon_s - 1, $year_s);
  14.         my $seconds_e = timelocal(0, 0, 0, $day_e, $mon_e - 1, $year_e);
  15.         my $seconds_in_one_day = 24 * 60 * 60;

  16.         if ($seconds_s > $seconds_e)
  17.         {
  18.                 ($seconds_s, $seconds_e) = ($seconds_e, $seconds_s);
  19.         }

  20.         while ($seconds_s <= $seconds_e)
  21.         {
  22.                 my ($day, $mon, $year) = (localtime($seconds_s))[3, 4, 5];
  23.                 $mon += 1;
  24.                 $year += 1900;
  25.                 push(@date_range, sprintf("%04d%02d%02d", $year, $mon, $day));
  26.                 $seconds_s += $seconds_in_one_day;
  27.         }

  28.         return @date_range;
  29. }

  30. warn join "\n", get_date_range("20100501", "20100101");
复制代码

作者: 黑色阳光_cu   发布时间: 2010-08-25

Date::Calc模块有很丰富的日期计算函数,使用起来很方便。
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;
  4. use Date::Calc qw( Add_Delta_Days );

  5. my ($y,$m,$d) = (2010,01,01);
  6. while (1) {
  7.         ($y,$m,$d) = Add_Delta_Days($y,$m,$d,1);
  8.          my $new_date = sprintf("%04d%02d%02d",$y,$m,$d);
  9.          last if ($new_date > 20100501);
  10.          print "$new_date\n";
  11. }
复制代码

作者: iamlimeng   发布时间: 2010-08-25

回复 黑色阳光_cu


    感谢阳光牛牛,熬夜伤身,多多休息

作者: howdoyoudoworld   发布时间: 2010-08-25

回复 iamlimeng


   谢谢limeng
不知Date::Calc模块怎么下载安装

作者: howdoyoudoworld   发布时间: 2010-08-25

我不牛,但是怎么装模块倒还知道
shell下输入 ppm install Date::Calc
或shell下输入 cpan 看下里面的帮助,一样的。

作者: zhlong8   发布时间: 2010-08-25

本帖最后由 netherunix 于 2010-08-25 10:45 编辑

回复 iamlimeng


   这位兄弟的程序,开始日期总是打印不出来,这样就少统计一天了!


  把my $new_date = sprintf("%04d%02d%02d",$y,$m,$d);
  修改成这样就可以了:
  my $new_date = sprintf("%04d%02d%02d",$y,$m,$d-1);

作者: netherunix   发布时间: 2010-08-25