查找给定日期所在月份的第一天

时间:2014-05-16 18:17:45

标签: perl

在Perl中,如果将变量$ period_end_date设置为,例如,' 4/30/2014',如何将$ period_start_date设置为' 4/1/2014'和$ next_period_start_date到' 5/1/2014'? (即分别设定为月份的第一个月和下个月的第一个月。

我尝试过使用DateTime模块但我的系统找不到它。我正在考虑使用substr来提取碎片,但月和日可以有1或2位数。

我如何更改/' s之间的内容?

2 个答案:

答案 0 :(得分:1)

如果您知道输入数据将始终采用mm/dd/yyyy格式,并且您真的只担心mmdd可以有一个或两个数字,然后你可以使用正则表达式匹配:

$period_end_date =~ m{(\d+)/(\d+)/(\d+)};
my $month = $1;
my $day   = $2;
my $year  = $3;

我使用m{}格式进行模式匹配而不是//,以避免必须在日期内转义/个字符。你可以写 而是模式/(\d+)\/(\d+)\/(\d+)/

答案 1 :(得分:1)

这应该对你有帮助。

此解决方案不是使用更复杂的正则表达式,而是从字符串中提取所有数字字段。

计算只是递增月份,如果月份已经变为1,也会增加年份。

use strict;
use warnings;

my $period_end_date = '4/30/2014';

my @mdy = $period_end_date =~ /\d+/g;

$mdy[1] = 1;
my $period_start_date = sprintf '%02d/%02d/%04d', @mdy;

$mdy[0] = $mdy[0] % 12 + 1;
++$mdy[2] if $mdy[0] == 1;
my $next_period_start_date = sprintf '%02d/%02d/%04d', @mdy;

print "$_\n" for $period_end_date, $period_start_date, $next_period_start_date;

<强>输出

4/30/2014
04/01/2014
05/01/2014