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 来获取当地日期和时间。 在标量上下文中, 返回的是字符串格式。

Perl格式化输出时间日期

方法一: use POSIX qw(strftime);   my $timeStr1 = strftime "%Y-%m-%d", localtime; my $timeSt...

Perl变量作用域和自定义函数小结

想MS用perl编程,先熟悉perl的语法,没必要深究,看http://perldoc.perl.org/perlintro.html就够了,主要熟悉变量、operator,file and I/...
  • tengh
  • tengh
  • 2012-01-07 22:00
  • 718

根据输入日期通过位移方式解决包含当月的前几月自定义函数

1. 需求概述 A.报表里通常会用到同期比,上年同期比。对有些零售行业的报表可能要求比较高一些,对包含当月的前3,6,12个月的一些同期比,比上年同期等,因此数据的处理和计算起来常规的同期比就更复...

根据输入日期通过位移方式解决包含当月的前几月自定义函数 http://reportsoft.blog.hexun.com/75077561_d.html

字号:大 中 小 1. 需求概述 A.报表里通常会用到同期比,上年同期比。对有些零售行业的报表可能要求比较高一些,对包含当月的前3,6,12个月的一些同期比,比上年同期等,因此数据的...

[MSSQL]日期集合-周、月、季度、年等计算以及自定义函数

以下为网上收集和自己工作中写的一些方法现整理如下: SQL --本周第一天 SELECT DATEADD(Day,1-(DATEPART(Weekday,getdate())+@@DATEFIR...

JavaScript自定义日期格式化函数

我们对JavaScript扩展其中一个较常的做法便是对Date.prototype的扩展。因为我们知道,Date类只提供了若干获取日期元素的方法,如getDate(),getMinute()……却没有...

根据输入日期通过位移方式解决包含当月的前几月自定义函数

1. 需求概述 A.报表里通常会用到同期比,上年同期比。对有些零售行业的报表可能要求比较高一些,对包含当月的前3,6,12个月的一些同期比,比上年同期等,因此数据的处理和计算起来常规的同期比就更复...

JavaScript自定义日期格式化函数

我们对 JavaScript 扩展其中一个较常的做法便是对 Date.prototype 的扩展。因为我们知道,Date 类只提供了若干获取日期元素的方法,如 getDate(),getMinute(...

SQL日期集合-周、月、季度、年等计算以及自定义函数

SQL  --本周第一天  SELECT DATEADD(Day,1-(DATEPART(Weekday,getdate())+@@DATEFIRST-1)%7,getdate())  --or  s...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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