| File: | Koha/DateUtils.pm |
| Coverage: | 88.6% |
| line | stmt | bran | cond | sub | time | code |
|---|---|---|---|---|---|---|
| 1 | package Koha::DateUtils; | |||||
| 2 | ||||||
| 3 | # Copyright (c) 2011 PTFS-Europe Ltd. | |||||
| 4 | # This file is part of Koha. | |||||
| 5 | # | |||||
| 6 | # Koha is free software; you can redistribute it and/or modify it under the | |||||
| 7 | # terms of the GNU General Public License as published by the Free Software | |||||
| 8 | # Foundation; either version 2 of the License, or (at your option) any later | |||||
| 9 | # version. | |||||
| 10 | # | |||||
| 11 | # Koha is distributed in the hope that it will be useful, but WITHOUT ANY | |||||
| 12 | # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR | |||||
| 13 | # A PARTICULAR PURPOSE. See the GNU General Public License for more details. | |||||
| 14 | # | |||||
| 15 | # You should have received a copy of the GNU General Public License along with | |||||
| 16 | # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, | |||||
| 17 | # Suite 330, Boston, MA 02111-1307 USA | |||||
| 18 | ||||||
| 19 | 15 15 15 | 474 86 653 | use strict; | |||
| 20 | 15 15 15 | 146 133 644 | use warnings; | |||
| 21 | 15 15 15 15 15 15 | 1528 1252 322 113 99 318 | use 5.010; | |||
| 22 | 15 15 15 | 119 58 457 | use DateTime; | |||
| 23 | 15 15 15 | 112969 165286 919 | use DateTime::Format::DateParse; | |||
| 24 | 15 15 15 | 218 80 291 | use C4::Context; | |||
| 25 | ||||||
| 26 | 15 15 15 | 115 61 1134 | use base 'Exporter'; | |||
| 27 | 15 15 15 | 45930 179489 227 | use version; our $VERSION = qv('1.0.0'); | |||
| 28 | ||||||
| 29 | our @EXPORT = ( | |||||
| 30 | qw( dt_from_string output_pref format_sqldatetime output_pref_due format_sqlduedatetime) | |||||
| 31 | ); | |||||
| 32 | ||||||
| 33 - 43 | =head1 DateUtils Koha::DateUtils - Transitional wrappers to ease use of DateTime =head1 DESCRIPTION Koha has historically only used dates not datetimes and been content to handle these as strings. It also has confused formatting with actual dates this is a temporary module for wrappers to hide the complexity of switch to DateTime =cut | |||||
| 44 | ||||||
| 45 - 52 | =head2 dt_ftom_string $dt = dt_from_string($date_string, [$format, $timezone ]); Passed a date string returns a DateTime object format and timezone default to the system preferences. If the date string is empty DateTime->now is returned =cut | |||||
| 53 | ||||||
| 54 | sub dt_from_string { | |||||
| 55 | 11 | 75 | my ( $date_string, $date_format, $tz ) = @_; | |||
| 56 | 11 | 71 | if ( !$tz ) { | |||
| 57 | 10 | 117 | $tz = C4::Context->tz; | |||
| 58 | } | |||||
| 59 | 11 | 61 | if ( !$date_format ) { | |||
| 60 | 0 | 0 | $date_format = C4::Context->preference('dateformat'); | |||
| 61 | } | |||||
| 62 | 11 | 73 | if ($date_string) { | |||
| 63 | 11 | 100 | if ( ref($date_string) eq 'DateTime' ) { # already a dt return it | |||
| 64 | 1 | 6 | return $date_string; | |||
| 65 | } | |||||
| 66 | ||||||
| 67 | 10 | 54 | if ( $date_format eq 'metric' ) { | |||
| 68 | 2 | 4 | $date_string =~ s#-#/#g; | |||
| 69 | 2 | 5 | $date_string =~ s/^00/01/; # system allows the 0th of the month | |||
| 70 | 2 | 22 | $date_string =~ s#^(\d{1,2})/(\d{1,2})#$2/$1#; | |||
| 71 | } else { | |||||
| 72 | 8 | 55 | if ( $date_format eq 'iso' ) { | |||
| 73 | 3 | 24 | $date_string =~ s/-00/-01/; | |||
| 74 | 3 | 25 | if ( $date_string =~ m/^0000-0/ ) { | |||
| 75 | 1 | 11 | return; # invalid date in db | |||
| 76 | } | |||||
| 77 | } elsif ( $date_format eq 'us' ) { | |||||
| 78 | 1 | 3 | $date_string =~ s#-#/#g; | |||
| 79 | 1 | 4 | $date_string =~ s[/00/][/01/]; | |||
| 80 | } elsif ( $date_format eq 'sql' ) { | |||||
| 81 | 4 | 30 | $date_string =~ | |||
| 82 | s/(\d{4})(\d{2})(\d{2})\s+(\d{2})(\d{2})(\d{2})/$1-$2-$3T$4:$5:$6/; | |||||
| 83 | 4 | 23 | $date_string =~ s/00T/01T/; | |||
| 84 | } | |||||
| 85 | } | |||||
| 86 | 9 | 97 | return DateTime::Format::DateParse->parse_datetime( $date_string, | |||
| 87 | $tz->name() ); | |||||
| 88 | } | |||||
| 89 | 0 | 0 | return DateTime->now( time_zone => $tz ); | |||
| 90 | ||||||
| 91 | } | |||||
| 92 | ||||||
| 93 - 102 | =head2 output_pref $date_string = output_pref($dt, [$format] ); Returns a string containing the time & date formatted as per the C4::Context setting A second parameter allows overriding of the syspref value. This is for testing only In usage use the DateTime objects own methods for non standard formatting =cut | |||||
| 103 | ||||||
| 104 | sub output_pref { | |||||
| 105 | 8 | 29 | my $dt = shift; | |||
| 106 | 8 | 27 | my $force_pref = shift; # if testing we want to override Context | |||
| 107 | 8 | 28 | my $pref = | |||
| 108 | defined $force_pref ? $force_pref : C4::Context->preference('dateformat'); | |||||
| 109 | 8 | 26 | given ($pref) { | |||
| 110 | 8 | 24 | when (/^iso/) { | |||
| 111 | 1 | 18 | return $dt->strftime('%Y-%m-%d %H:%M'); | |||
| 112 | } | |||||
| 113 | 7 | 20 | when (/^metric/) { | |||
| 114 | 6 | 33 | return $dt->strftime('%d/%m/%Y %H:%M'); | |||
| 115 | } | |||||
| 116 | 1 | 9 | when (/^us/) { | |||
| 117 | 1 | 14 | return $dt->strftime('%m/%d/%Y %H:%M'); | |||
| 118 | } | |||||
| 119 | 0 | 0 | default { | |||
| 120 | 0 | 0 | return $dt->strftime('%Y-%m-%d %H:%M'); | |||
| 121 | } | |||||
| 122 | ||||||
| 123 | } | |||||
| 124 | 0 | 0 | return; | |||
| 125 | } | |||||
| 126 | ||||||
| 127 - 139 | =head2 output_pref_due $date_string = output_pref_due($dt, [$format] ); Returns a string containing the time & date formatted as per the C4::Context setting A second parameter allows overriding of the syspref value. This is for testing only In usage use the DateTime objects own methods for non standard formatting This is effectivelyt a wrapper around output_pref for due dates the time portion is stripped if it is '23:59' =cut | |||||
| 140 | ||||||
| 141 | sub output_pref_due { | |||||
| 142 | 4 | 7 | my $disp_str = output_pref(@_); | |||
| 143 | 4 | 226 | $disp_str =~ s/ 23:59//; | |||
| 144 | 4 | 33 | return $disp_str; | |||
| 145 | } | |||||
| 146 | ||||||
| 147 - 154 | =head2 format_sqldatetime $string = format_sqldatetime( $string_as_returned_from_db ); a convenience routine for calling dt_from_string and formatting the result with output_pref as it is a frequent activity in scripts =cut | |||||
| 155 | ||||||
| 156 | sub format_sqldatetime { | |||||
| 157 | 2 | 51 | my $str = shift; | |||
| 158 | 2 | 3 | my $force_pref = shift; # if testing we want to override Context | |||
| 159 | 2 | 15 | if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) { | |||
| 160 | 1 | 3 | my $dt = dt_from_string( $str, 'sql' ); | |||
| 161 | 1 | 946 | $dt->truncate( to => 'minutes' ); | |||
| 162 | 1 | 658 | return output_pref( $dt, $force_pref ); | |||
| 163 | } | |||||
| 164 | 1 | 6 | return q{}; | |||
| 165 | } | |||||
| 166 | ||||||
| 167 - 174 | =head2 format_sqlduedatetime $string = format_sqldatetime( $string_as_returned_from_db ); a convenience routine for calling dt_from_string and formatting the result with output_pref_due as it is a frequent activity in scripts =cut | |||||
| 175 | ||||||
| 176 | sub format_sqlduedatetime { | |||||
| 177 | 2 | 3 | my $str = shift; | |||
| 178 | 2 | 2 | my $force_pref = shift; # if testing we want to override Context | |||
| 179 | 2 | 20 | if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) { | |||
| 180 | 2 | 4 | my $dt = dt_from_string( $str, 'sql' ); | |||
| 181 | 2 | 1982 | $dt->truncate( to => 'minutes' ); | |||
| 182 | 2 | 1130 | return output_pref_due( $dt, $force_pref ); | |||
| 183 | } | |||||
| 184 | 0 | return q{}; | ||||
| 185 | } | |||||
| 186 | ||||||
| 187 | 1; | |||||