Perl 处理日期的自定义函数

转载 2016年05月30日 19:56:11


转载:http://blog.chinaunix.net/uid-7591044-id-3060595.html


最近做东西老用到处理时间的问题,索性写几个函数。

#!/usr/bin/perl -w
#===============================================================================
# Copyright (c) 2009,
# All rights reserved.
# 摘    要 :一些常用的时间处理函数
# 作    者 :2009-12-15 xingwang
# 版    本 :0.01
#===============================================================================
use strict;

# ------------------------------
# &subtime(date,n)
# 计算 某天的前 n 天或者后 n 天
# 参数:日期,前n天(n)或后n天(-n)
# ------------------------------
sub subtime {
my ($date,$number) = @_;
use HTTP::Date;
my $n = str2time($date);
$n += 86400 * $number;
my ($s,$mm,$h,$d,$m,$y) = (localtime($n))[0,1,2,3,4,5];
$y += 1900;
$m ++;
if ( $date =~ /:/ ) {
   return sprintf("%4d-%02d-%02d %02d:%02d:%02d",$y,$m,$d,$h,$mm,$s);
} else {
   return sprintf("%4d-%02d-%02d",$y,$m,$d);
}
}
print &submonth($ARGV[0],$ARGV[1]),"\n";
# ------------------------------
# &submonth(date,n)
# 计算 某天的前 n 月或者后 n 月
# 参数:日期,前n月(n)或后n月(-n)
# ------------------------------
sub submonth {
my ($date,$number) = @_;
use HTTP::Date;

my $n_temp = str2time($date);
my ($m_temp,$y_temp) = (localtime($n_temp))[4,5];
$y_temp += 1900;
$m_temp ++;
my %hs_monthDays = ('1'=>'31','3'=>'31','5'=>'31','7'=>'31','8'=>'31','10'=>'31','12'=>'31','4'=>'30','6'=>'30','9'=>'30','11'=>'30');
$hs_monthDays{'2'} = ($y_temp%4==0&&$y_temp%100!=0) || $y_temp%400==0 ? 29 : 28;


my $n = str2time($date);
my $monthdays = $hs_monthDays{$m_temp};
$n -= 86400 * $monthdays * $number;

my ($s,$mm,$h,$d,$m,$y) = (localtime($n))[0,1,2,3,4,5];
$y += 1900;
$m ++;

if ( $date =~ /:/ ) {
   return sprintf("%4d-%02d-%02d %02d:%02d:%02d",$y,$m,$d,$h,$mm,$s);
} else {
   return sprintf("%4d-%02d-%02d",$y,$m,$d);
}
}

# ------------------------------
# &nowtime()
# 当前时间
# ------------------------------
sub nowtime {
my ( $s,$min,$h,$d,$m,$y ) = (localtime(time()))[0,1,2,3,4,5];
$y += 1900;
$m ++;
return sprintf("%4d-%02d-%02d %02d:%02d:%02d",$y,$m,$d,$h,$min,$s);
}

# ------------------------------
# &nowdate()
# 当前日期
# ------------------------------
sub nowdate {
my ( $d,$m,$y ) = (localtime(time()))[3,4,5];
$y += 1900;
$m ++;
return sprintf("%4d-%02d-%02d",$y,$m,$d);
}

# ----------------------------------------------------
# &formatdate()
# 格式化日期
# 输入的格式:
# yyyy-mm-dd、yyyy-m-d、yyyymmdd、yyyy/mm/dd、
# yyyy/m/d、yyyy-mm、yyyy-m、yyyymm、yyyy/mm、yyyy/m
# ----------------------------------------------------
sub formatdate {
my $date = shift;
my $type = shift;

$date =~ /^(\d{4})[-\/](\d{2}|\d)[-\/](\d{2}|\d)$/g; # yyyy-mm-dd yyyy/mm/dd
$date =~ /^(\d{4})(\d{2})(\d{2})$/;       # yyyymmdd
$date =~ /^(\d{4})(\d{2})$/;        # yyyymm
$date =~ /^(\d{4})[-\/](\d{2}|\d)$/g;      # yyyy-mm yyyy/mm

die "Format Date Erro:The date you input( $date ) is not correct." unless ( $1 or $2 );

if ( $type eq 'yyyymm' ) {
   return sprintf("%04d%02d",$1,$2);
} elsif ( $type eq 'yyyymmdd' and $3) {
   return sprintf("%04d%02d%02d",$1,$2,$3);
} elsif ( $type eq 'yyyy-mm-dd' and $3) {
   return sprintf("%04d-%02d-%02d",$1,$2,$3);
} elsif ( $type eq 'yyyy-mm') {
   return sprintf("%04d-%02d",$1,$2);
} elsif ( $type eq 'alldays' or $type eq 'endday' ) {
   my $hs_monthDays = {'01'=>'31','03'=>'31','05'=>'31','07'=>'31','08'=>'31','10'=>'31','12'=>'31','04'=>'30','06'=>'30','09'=>'30','11'=>'30'};
   $hs_monthDays->{'02'} = ($1%4==0&&$1%100!=0)||$1%400==0 ? 29 : 28;
   return $hs_monthDays->{$2};
} else {
   die "Format Date Erro:Return date ( Date = $date ,Type = $type ) is not correct."
}
}

1;

[码海拾贝 之Perl]获取日期以及日期的加减

在Perl 中, 不安装其他模组的状况下, 可以使用 localtime 来获取当地日期和时间。 在标量上下文中, 返回的是字符串格式。...
  • oscar999
  • oscar999
  • 2015年01月05日 18:26
  • 3887

shell下时间日期的加减乘除运算

 转载:http://tanxw.blog.51cto.com/4309543/1602915 首先我们先来说说什么是shell下的时间戳:      自1970年1月1日(00:...
  • chen790602
  • chen790602
  • 2016年05月30日 20:55
  • 6829

时区转化和perl函数

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC,Universal Time Coordinated)。UTC与格林...
  • bruce_wang_janet
  • bruce_wang_janet
  • 2014年01月26日 00:45
  • 1131

Perl的时间处理

1)Date::Calc这里是冠军模块: use strict; use warnings; use Date::Calc qw(Add_Delta_YMD); my $startDate ...
  • zhangxinrun
  • zhangxinrun
  • 2010年09月15日 21:23
  • 4445

[Perl] 在 Perl 下处理时间的小技巧 strftime

[Perl] 在 Perl 下处理时间的小技巧 strftimeAug 21st, 2010 Leave a comment | Trackback转载本站文章请注明,转载自:扶凯[http://ww...
  • zxianyong
  • zxianyong
  • 2010年12月28日 14:39
  • 1898

perl 时间处理函数

1) Date::Calc这里是冠军模块: use strict; use warnings; use Date::Calc qw(Add_Delta_YMD); my $s...
  • frt007
  • frt007
  • 2015年05月02日 13:06
  • 1398

时区转化和perl函数

整个地球分为二十四时区,每个时区都有自己的本地时间。在国际无线电通信场合,为了统一起见,使用一个统一的时间,称为通用协调时(UTC,Universal Time Coordinated)。UTC与格林...
  • bruce_wang_janet
  • bruce_wang_janet
  • 2014年01月26日 00:45
  • 1131

畅谈Perl时间处理函数用法

本文重点讨论Perl时间处理函数的概念, Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移, 并且Perl借取了C、sed、awk、shellscripting以及很多其他程序语言的...
  • fireroll
  • fireroll
  • 2013年02月18日 14:39
  • 793

畅谈Perl时间处理函数用法

本文重点讨论Perl时间处理函数的概念, Perl能在绝大多数操作系统运行,可以方便地向不同操作系统迁移, 并且Perl借取了C、sed、awk、shellscripting以及很多其他程序语言的...
  • AnneQiQi
  • AnneQiQi
  • 2016年10月21日 16:40
  • 877

Perl处理Excel文件

http://blog.csdn.net/caz28/article/details/7943530 现在很多数据是以Excel文件格式保存的,对人来讲修改添加都比较方便,但程序处理就比较麻烦。 ...
  • zgyrelax
  • zgyrelax
  • 2014年03月16日 23:28
  • 793
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Perl 处理日期的自定义函数
举报原因:
原因补充:

(最多只允许输入30个字)