📄 date.pm
字号:
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("&month_first_day_of_year($_[0], $_[1]) + &days_in_month($_[0], $_[1]) -1");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::DaysInMonth;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the number of days in the month I<expr1>, in year I<expr2>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&days_in_month(E<lt> I<expr1> E<gt>, E<lt> I<expr2> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'days_in_month');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \@g_@{[ uc($self->name()) ]}_LEAP = (0,31,29,31,30,31,30,31,31,30,31,30,31); # \&@{[ $self->name() ]}()");
$c->code("my \@g_@{[ uc($self->name()) ]} = (0,31,28,31,30,31,30,31,31,30,31,30,31); # \&@{[ $self->name() ]}()");
return $c;
}
sub translate # args: month, year
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("($_[1] % 4 == 0 ? \$g_@{[ uc($self->name()) ]}_LEAP\[$_[0]] : \$g_@{[ uc($self->name()) ]}\[$_[0]])");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::MonthNumber;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returhs the month number for the month name in I<expr>. The month name may be in either short (3 character) of long (full name) format.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&month_number(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'month_number');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \%g_MONTH_NUM = ");
$c->code("(");
$c->over();
map
(
$c->code("@{[ uc($_->name()) ]} => '@{[ sprintf(q{%02d}, $_->month_number()) ]}',"),
$self->catalogue()->months()->to_array()
);
map
(
$c->code("@{[ uc(substr($_->name(), 0, 3)) ]} => '@{[ sprintf(q{%02d}, $_->month_number()) ]}',"),
$self->catalogue()->months()->to_array()
);
$c->back();
$c->code("); # \&@{[ $self->name() ]}()");
return $c;
}
sub translate # args: month_name
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("\$g_MONTH_NUM{qq#\@{[ uc($_[0]) ]}#}");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::MonthName;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the month full-name for the month number in I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&month_name(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'month_name');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \%g_MONTH_NAME = ");
$c->code("(");
$c->over();
map
(
do {
$c->code("@{[ $_->month_number() ]} => '@{[ $_->name() ]}',");
},
$self->catalogue()->months()->to_array()
);
$c->back();
$c->code("); # \&@{[ $self->name() ]}()");
return $c;
}
sub translate # args: month_number
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("\$g_MONTH_NAME{int($_[0])}");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::MonthAbbr;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the month short-name (3 character) for the month number in I<expr>.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&month_abbr(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'month_abbr');
use Class::STL::ClassMembers::Constructor;
sub translate # args: month_number
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("uc(substr(&month_name($_[0]), 0, 3))");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::AddDays;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Adds the number of days in I<expr> to the current date and returns this date value.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&add_days(E<lt> I<expr> E<gt>)'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'add_days');
use Class::STL::ClassMembers::Constructor;
sub translate # args: days
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code();
$c->code("do { my \@tm=localtime(time()+(($_[0]) *24*60*60)); sprintf(qq{%04d%02d%02d}, \$tm[5]+1900, \$tm[4]+1, \$tm[3]); }");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Today;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns todays date in the format specified in the date-type I<expr> (or I<default_datetype> property if not specified).'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today([ E<lt> I<expr> E<gt> ])'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \$g_TODAY=sprintf(qq{%04d%02d%02d}, (localtime)[5]+1900, (localtime)[4]+1, (localtime)[3]); # Macro:@{[ $self->name() ]}()");
return $c;
}
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
defined($_[0]) && $_[0] ne ''
? $c->code("&to_date(\$g_TODAY<YYYYMMDD>, $_[0])")
: $c->code("\$g_TODAY");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::TodayYear;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the year number for the current system date.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today_year()'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today_year');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \$g_TODAY_YEAR = (localtime)[5] + 1900; # \&@{[ $self->name() ]}()");
return $c;
}
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("\$g_TODAY_YEAR");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::TodayMonth;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the month number for the current system date.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today_month()'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today_month');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \$g_TODAY_MONTH = (localtime)[4]+1; # \&@{[ $self->name() ]}()");
return $c;
}
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("\$g_TODAY_MONTH");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::TodayDay;
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'description', default => 'Returns the day number for the current system date.'),
Class::STL::ClassMembers::DataMember->new(name => 'usage', default => '&today_day()'),
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'today_day');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("my \$g_TODAY_DAY = (localtime)[3]; # \&@{[ $self->name() ]}()");
return $c;
}
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate(@_);
$c->code("\$g_TODAY_DAY");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::MonthsSinceCache; # TODO: ???
use base qw(ETL::Pequel3::Type::Macros::Date::Abstract);
use Class::STL::ClassMembers
Class::STL::ClassMembers::DataMember->new(name => 'name', default => 'months_since_cache');
use Class::STL::ClassMembers::Constructor;
sub code_init_global
{
my $self = shift;
my $c = $self->SUPER::code_init_global(@_);
$c->code("use constant _MONTHS_SINCE_C_TODAY_YEAR => int @{[ (localtime)[5] + 1900 ]}; # \&@{[ $self->name ]}()");
$c->code("use constant _MONTHS_SINCE_C_TODAY_MONTH => int @{[ (localtime)[4]+1 ]}; # \&@{[ $self->name ]}()");
$c->code("my \%_CACHE_MONTHS_SINCE;"); # if ($self->root->o_cache_months_since);
return $c;
}
sub translate
{
my $self = shift;
my $c = $self->SUPER::translate();
#> return ("$_CACHE_MONTHS_SINCE{$_[0]} || ((_MONTHS_SINCE_C_TODAY_YEAR - int(substr($_[0], 0, 4))) * 12) + (_MONTHS_SINCE_C_TODAY_MONTH - int(substr($_[0], 4, 2)))");
$c->code("$_[0] !~ /\\d+/ ? 0 : ((_MONTHS_SINCE_C_TODAY_YEAR - int(substr($_[0], 0, 4))) * 12) + (_MONTHS_SINCE_C_TODAY_MONTH - int(substr($_[0], 4, 2)))");
# return ("((_MONTHS_SINCE_C_TODAY_YEAR - (unpack('a4 a2', $_[0]))[0]) * 12) + (_MONTHS_SINCE_C_TODAY_MONTH - (unpack('a4 a2', $_[0]))[1])");
return $c;
}
}
# ----------------------------------------------------------------------------------------------------
{
package ETL::Pequel3::Type::Macros::Date;
use ETL::Pequel3::Type::Extension;
use base qw(ETL::Pequel3::Type::Extension::Abstract);
use Class::STL::ClassMembers;
use Class::STL::ClassMembers::SingletonConstructor;
sub new_extra
{
my $self = shift;
$self->catalogue()->macros()->push_front(
ETL::Pequel3::Type::Macros::ToDate->new(),
#> ETL::Pequel3::Type::Macros::DateCmp->new(),
#> ETL::Pequel3::Type::Macros::ToDmy->new(),
#> ETL::Pequel3::Type::Macros::FromDmy->new(),
ETL::Pequel3::Type::Macros::MonthsSince->new(),
ETL::Pequel3::Type::Macros::MonthsBetween->new(),
ETL::Pequel3::Type::Macros::DateLastDay->new(),
ETL::Pequel3::Type::Macros::MonthLastDay->new(),
#> ETL::Pequel3::Type::Macros::DayOfWeek->new(),
ETL::Pequel3::Type::Macros::DateNextDay->new(),
ETL::Pequel3::Type::Macros::DateRangeValues->new(),
ETL::Pequel3::Type::Macros::DayOfYear->new(),
ETL::Pequel3::Type::Macros::MonthFirstDayOfYear->new(),
ETL::Pequel3::Type::Macros::MonthLastDayOfYear->new(),
ETL::Pequel3::Type::Macros::DaysInMonth->new(),
ETL::Pequel3::Type::Macros::AddDays->new(),
ETL::Pequel3::Type::Macros::Y->new(),
ETL::Pequel3::Type::Macros::D->new(),
ETL::Pequel3::Type::Macros::M->new(),
ETL::Pequel3::Type::Macros::Today->new(),
ETL::Pequel3::Type::Macros::TodayYear->new(),
ETL::Pequel3::Type::Macros::TodayMonth->new(),
ETL::Pequel3::Type::Macros::TodayDay->new(),
#< ETL::Pequel3::Type::Macros::MonthsSinceCache->new(),
ETL::Pequel3::Type::Macros::MonthNumber->new(),
ETL::Pequel3::Type::Macros::MonthName->new(), #MonthFullName
#> ETL::Pequel3::Type::Macros::DayName->new(),
ETL::Pequel3::Type::Macros::MonthAbbr->new(), #MonthAbbrName
#> ETL::Pequel3::Type::Macros::DaysInYear->new(),
#> ETL::Pequel3::Type::Macros::Now->new,
#> ETL::Pequel3::Type::Macros::Time->new,
#> ETL::Pequel3::Type::Macros::DaysBetween->new, # return num days between 2 dates
#> ETL::Pequel3::Type::Macros::DateIsBetween->new, # &date_is_between(dt1, dt2)
#> ETL::Pequel3::Type::Macros::DayNumberToDate->new, # return date for day number in year
#> ETL::Pequel3::Type::Macros::AddMonths->new, # return date plus months
);
return $self;
}
}
# ----------------------------------------------------------------------------------------------------
1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -