X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FLocale.pm;h=4cbef16844fad3ba04d3627b1c7b8a7fd31e0276;hb=fee5532a132c44dcfc1743393cba00c8e3397176;hp=b6065da7761d8f9df1054c1c9fc49ed242603d29;hpb=dbda14c263efd93aca3b7114015a47d86b8581e3;p=kivitendo-erp.git diff --git a/SL/Locale.pm b/SL/Locale.pm index b6065da77..4cbef1684 100644 --- a/SL/Locale.pm +++ b/SL/Locale.pm @@ -364,8 +364,8 @@ sub parse_date { ($yy, $mm, $dd) = ($date =~ /(..)(..)(..)/); } - $dd *= 1; - $mm *= 1; + $_ ||= 0 for ($dd, $mm, $yy); + $_ *= 1 for ($dd, $mm, $yy); $yy = ($yy < 70) ? $yy + 2000 : $yy; $yy = ($yy >= 70 && $yy <= 99) ? $yy + 1900 : $yy; @@ -374,16 +374,44 @@ sub parse_date { } sub parse_date_to_object { - my $self = shift; - my ($yy, $mm, $dd) = $self->parse_date(@_); + my ($self, $string, %params) = @_; + + $params{dateformat} ||= $::myconfig{dateformat} || 'yy-mm-dd'; + $params{numberformat} ||= $::myconfig{numberformat} || '1,000.00'; + my $num_separator = $params{numberformat} =~ m{,\d+$} ? ',' : '.'; + + my ($date_str, $time_str) = split m{\s+}, $string, 2; + my ($yy, $mm, $dd) = $self->parse_date(\%params, $date_str); + + my ($hour, $minute, $second) = split m/:/, ($time_str || ''); + $second ||= '0'; + + ($second, my $millisecond) = split quotemeta($num_separator), $second, 2; + $_ ||= 0 for ($hour, $minute, $millisecond); + + $millisecond = substr $millisecond, 0, 3; + $millisecond .= '0' x (3 - length $millisecond); + + return undef unless $yy && $mm && $dd; + return DateTime->new(year => $yy, month => $mm, day => $dd, hour => $hour * 1, minute => $minute * 1, second => $second * 1, nanosecond => $millisecond * 1000000); +} + +sub format_date_object_to_time { + my ($self, $datetime, %params) = @_; - return $yy && $mm && $dd ? DateTime->new(year => $yy, month => $mm, day => $dd) : undef; + my $format = $::myconfig{timeformat} || 'hh:mm'; + $format =~ s/hh/\%H/; + $format =~ s/mm/\%M/; + $format =~ s/ss/\%S/; + + return $datetime->strftime($format); } sub format_date_object { my ($self, $datetime, %params) = @_; - my $format = $::myconfig{dateformat} || 'yyyy-mm-dd'; + my $format = $params{dateformat} || $::myconfig{dateformat} || 'yyyy-mm-dd'; + my $num_separator = ($params{numberformat} || $::myconfig{numberformat} || '1,000.00') =~ m{,\d+$} ? ',' : '.'; $format =~ s/yy(?:yy)?/\%Y/; $format =~ s/mm/\%m/; $format =~ s/dd/\%d/; @@ -391,9 +419,10 @@ sub format_date_object { my $precision = $params{precision} || 'day'; $precision =~ s/s$//; my %precision_spec_map = ( - second => '%H:%M:%S', - minute => '%H:%M', - hour => '%H', + millisecond => '%H:%M:%S' . $num_separator . '%3N', + second => '%H:%M:%S', + minute => '%H:%M', + hour => '%H', ); $format .= ' ' . $precision_spec_map{$precision} if $precision_spec_map{$precision}; @@ -598,6 +627,21 @@ Add hour:minute to the date. Add hour:minute:second to the date. +=item * C + +Add hour:minute:second.millisecond to the date. The decimal separator +is derived from the number format. + +=item * C + +The number format to use, e.g. C<1,000.00>. If unset the user's +current number format is used. + +=item * C + +The date format to use, e.g. C. If unset the user's current +date format is used. + =back =item C @@ -616,9 +660,14 @@ TODO: Describe new TODO: Describe parse_date -=item C +=item C + +Parses a date and optional timestamp in C<$string> and returns an +instance of L. The date and number formats used are the ones +the user has currently selected. They can be overriden by passing them +in as parameters to this function, though. -TODO: Describe parse_date_to_object +The time stamps can have up to millisecond precision. =item C