X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FHelper%2FDateTime.pm;h=15ab95a7b7473519989cd0f92aca72e4029a6830;hb=abafb475d9742e3a6c28427477235c923b21eeef;hp=c79dad1b84d919cee4485fe7914cdaa43dc7e35a;hpb=fa7fc7eeb3ca718914affee06c0629a08d571288;p=kivitendo-erp.git diff --git a/SL/Helper/DateTime.pm b/SL/Helper/DateTime.pm index c79dad1b8..15ab95a7b 100644 --- a/SL/Helper/DateTime.pm +++ b/SL/Helper/DateTime.pm @@ -2,8 +2,17 @@ package DateTime; use strict; +use DateTime::Format::Strptime; + use SL::Util qw(_hashify); +my ($ymd_parser, $ymdhms_parser); + +sub new_local { + my ($class, %params) = @_; + return $class->new(hour => 0, minute => 0, second => 0, time_zone => $::locale->get_local_time_zone, %params); +} + sub now_local { return shift->now(time_zone => $::locale->get_local_time_zone); } @@ -72,6 +81,54 @@ sub subtract_businessdays { $self->add_business_duration(%params); } +sub end_of_month { + my ($self) = @_; + return $self->truncate(to => 'month')->add(months => 1)->subtract(days => 1); +} + +sub next_workday { + my ($self, %params) = @_; + + my $extra_days = $params{extra_days} // 1; + $self->add(days => $extra_days); + + my $day_of_week = $self->day_of_week; + $self->add(days => (8 - $day_of_week)) if $day_of_week >= 6; + + return $self; +} + +sub from_ymd { + my ($class, $ymd_string) = @_; + + if (!$ymd_parser) { + $ymd_parser = DateTime::Format::Strptime->new( + pattern => '%Y-%m-%d', + locale => 'de_DE', + time_zone => 'local' + ); + } + + return $ymd_parser->parse_datetime($ymd_string // ''); +} + +sub from_ymdhms { + my ($class, $ymdhms_string) = @_; + + if (!$ymdhms_parser) { + $ymdhms_parser = DateTime::Format::Strptime->new( + pattern => '%Y-%m-%dT%H:%M:%S', + locale => 'de_DE', + time_zone => 'local' + ); + } + + $ymdhms_string //= ''; + $ymdhms_string =~ s{ }{T}; + + return $ymdhms_parser->parse_datetime($ymdhms_string); +} + 1; __END__ @@ -86,6 +143,11 @@ SL::Helpers::DateTime - helper functions for L =over 4 +=item C + +Returns the time given in C<%params> with the time zone set to the +local time zone. + =item C Returns the current time with the time zone set to the local time zone. @@ -111,6 +173,37 @@ component (as opposed to L). The legacy name C is still supported. +=item C + +Parses a date string in the ISO 8601 format C and returns +an instance of L. The time is set to midnight (00:00:00). + +=item C + +Parses a date/time string in the ISO 8601 format +C (a space instead of C is also supported) and +returns an instance of L. + +=item C + +Sets the object to the last day of object's month at midnight. Returns +the object itself. + +=item C + +Sets the object to the next workday. The recognized parameter is: + +=over 2 + +=item * C - optional: If C is given, then +that amount of days is added to the objects date and if the resulting +date is not a workday, the object is set to the next workday. +Defaults to 1. + +=back + +Returns the object itself. + =back =head1 AUTHOR