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; |