gpt4 book ai didi

perl - 是否有与 SAS 的 INTNX 函数或 Javascript 的 Dateadd 函数等效的 Perl 函数?

转载 作者:行者123 更新时间:2023-12-02 10:55:36 26 4
gpt4 key购买 nike

我正在尝试使用 Perl 将中国农历系统转换为公历,既出于娱乐又出于学习目的。我以为有某种简单的数学算法可以完成这项工作,但结果证明我错了。不管怎样,经过一番谷歌搜索后,我发现了一些可以完成这项工作的现成 SAS 代码。嗯,对于我来说,弄清楚如何用 Perl 重写大部分代码并不是太困难。但有这样的事情:

Convert2Gregorian = INTNX ('day', conDate, AddDay-1);

Google 告诉我 INTNX 是一个函数,可以返回一个日期,在该日期之后添加了特定的日期间隔。但使用关键字“Perl INTNX”给我没有任何用处。然后我找到了一个用Javascript编写的脚本,一般方法大致相同,只是Javascript使用了Dateadd函数,例如:

Return DateAdd(DateInterval.Day, AddDay - 1, conDate) 

我也尝试使用 PPM 进行搜索,但无法找到我想要的模块。有人可以给我一些指点吗?

提前致谢:)

更新

感谢@psilva 和@hobbs:)

哈哈,我终于可以将一种编程语言翻译成另一种编程语言了。好有趣 :)只是为了好玩,也许供以后引用:这是原始的SAS代码和我翻译的Perl代码。如果我错了请纠正我:)

注意:数据不完整。

SAS代码如下:

data DateNtoG (drop = Ngstrings conDate AddMonth AddDay Mrunyue I);
array NGlist{43} $18_TEMPORARY_(
"010110101010170130" /*(1968)*/
"010101101010000217" /*(1969)*/
"100101101101000206" /*(1970)*/
"010010101110150127" /*(1971)*/
);

input tYear tMonth tDay RunYue;

if (tyear >1967 and tyear<2011) then do;
NGstrings = NGlist(tYear - 1967);
conDate = MDY (substr (NGstrings,15,2),(NGstrings, 17,2), tYear);

AddMonth = tMonth;

select (substr(NGstrings, 14, 1));
when ("A" ) Mrunyue=10;
when ("B" ) Mrunyue=11;
when ( "C" ) Mrunyue=12;
otherwise Mrunyue = substr (NGstrings, 14,1);
end;

if ((RunYue=1) and (tMonth=Mrunyue) ANDMrunyue>0)or ((tMonth Mrunyue) AND Mrunyue>0) then
do;
Addmonth = tMonth+1;
end;

AddDay = tDay;
do i = 1 To AddMonth-1;
AddDay = AddDay + 29 + substr(NGstrings,i,1);
end;

dNtoG = INTNX ('day', conDate, AddDay - 1);
put "Transfereddate:" dNtoGdate9.;
end;

翻译后的 Perl 代码如下:暂时不处理未定义的情况

(我更改了原来的SAS变量名称)

#!perl

# A Chinese-Gregorian Calendar System Converter just for Testing

use Date::Calc qw(Add_Delta_Days);
use integer;
use strict;
use warnings;

$_ = shift @ARGV;

if (length == 8) {
$_.=0;
}

my ($Lunar_Year,$Lunar_Month,$Lunar_Day,$Leap_Month) = /(\d\d\d\d)(\d\d)(\d\d)(\d)/;


my %Lunar_Year_Patterns = qw/1968 010110101010170130 1969 010101101010000217 1970 100101101101000206 1971 010010101110150127/;

if (substr ($Lunar_Year_Patterns{$Lunar_Year},13,1) =~ /A/) {
$Leap_Month = 10;
} elsif (substr ($Lunar_Year_Patterns{$Lunar_Year},13,1)=~ /B/){
$Leap_Month = 11;
} elsif (substr ($Lunar_Year_Patterns{$Lunar_Year},13,1)=~ /C/){
$Leap_Month = 12;
} else {
$Leap_Month = substr($Lunar_Year_Patterns{$Lunar_Year},13,1);
}

my $First_Lunar_Day_In_Gregorian_Month = substr($Lunar_Year_Patterns{$Lunar_Year},14,2);
my $First_Lunar_Day_In_Gregorian_Day = substr($Lunar_Year_Patterns{$Lunar_Year},16,2);

my $AddMonth;
if ( (($Leap_Month ==1) && ($Lunar_Month == $Leap_Month) && ($Leap_Month > 0)) || (($Lunar_Month > $Leap_Month) && ($Leap_Month>0) ) ){
$AddMonth = $Lunar_Month +1;
} else {
$AddMonth = $Lunar_Month;
}

my $AddDay;
$AddDay = $Lunar_Day;

for(my $i = 1; $i <= $AddMonth - 1; $i++){
$AddDay = $AddDay +29 + substr($Lunar_Year_Patterns{$Lunar_Year},$i,1);
}


my @Gregorian = Add_Delta_Days($Lunar_Year,$First_Lunar_Day_In_Gregorian_Month,$First_Lunar_Day_In_Gregorian_Day,$AddDay -1);
print @Gregorian;

最佳答案

DateTime是处理日期的 800 磅 gorilla 。它相当大,但它之所以大,是因为它做了很多事情,更重要的是,它做得正确

使用 DateTime,您只需构造开始日期的 DateTime 对象,然后通过添加以下内容获取结束日期:$dt->add(days => $add_days).

此外,还有一个 DateTime::Calendar::Chinese即使您想重新发明这个特定的轮子以获得乐趣,您也可以将结果与之进行比较:)

关于perl - 是否有与 SAS 的 INTNX 函数或 Javascript 的 Dateadd 函数等效的 Perl 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1920820/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com