Perl 处理日期的自定义函数

news/2024/7/6 1:18:41
#最近做东西老用到处理时间的问题,索性写几个函数。
#!/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."
}
}


转载于:https://www.cnblogs.com/LCX/archive/2010/01/07/1641537.html


http://www.niftyadmin.cn/n/4150504.html

相关文章

异步

异步 所谓"异步",简单说就是一个任务分成两段,先执行第一段,然后转而执行其他任务,等做好了准备,再回过头执行第二段,比如,有一个任务是读取文件进行处理,异步的执行过程就是下面这样…

判断URL的HTTP状态

代码 PublicClassTestExistPublicSharedFunctionUrlExist(ByValsURL AsString) AsBooleanDimtemp AsBooleanFalseTryDimrequest AsHttpWebRequest DirectCast(WebRequest.Create(sURL), HttpWebRequest)WebProxy proxy new WebProxy("your proxy server", 8080); re…

查看已安装PERL的模块

1、perldoc perllocal2、推荐pmtools里的pminst命令 http://search.cpan.org/src/MLFISHER/pmtools-1.01/pminst3、编写如下标本#!/usr/bin/perl use strict; use ExtUtils::Installed;my $inst ExtUtils::Installed->new(); my modules $inst->modules();foreach(modul…

go Context的使用

控制并发有两种经典的方式,一种是WaitGroup,另外一种就是Context WaitGroup的使用 WaitGroup可以用来控制多个goroutine同时完成func main() {var wg sync.WaitGroupwg.Add(2)go func() {time.Sleep(2*time.Second)fmt.Println("1号完成")wg.D…

WINDOWS下的squid

今天写这篇教程目的在于分享自己在WINDOWS主机下配置squid的方法。哪些地方写的不完善或是不完整或是需要修改的地方,大家可以提出。我会第一时间纠正。下面看正文部分。先提条件,您预安装配置squid的这台计算机必须是联入网络的,系统版本是w…

Python基本数据类型之时间

2019独角兽企业重金招聘Python工程师标准>>> 1.什么是时间数据类型 Python中表示时间类型的数据结构为时间数据类型; 2.time模块 import time # 获取当前时间的时间戳 print(time.time()) #输出:1548742426.1698806# 返回当前时间的元组 t …

在WIN2008上,office2003精简版导致vs2008sp1崩溃

在笔记本换了个系统,还以为win2008跟vs08不兼容,痛苦的一次经历。。。。 转载于:https://www.cnblogs.com/LCX/archive/2010/02/23/1672103.html

SpringBoot 实战 (九) | 整合 Mybatis

微信公众号:一个优秀的废人如有问题或建议,请后台留言,我会尽力解决你的问题。前言 如题,今天介绍 SpringBoot 与 Mybatis 的整合以及 Mybatis 的使用,本文通过注解的形式实现。 什么是 Mybatis MyBatis 是支持定制化 …