← Index
NYTProf Performance Profile   « line view »
For svc/members/upsert
  Run on Tue Jan 13 11:50:22 2015
Reported on Tue Jan 13 12:09:49 2015

Filename/mnt/catalyst/koha/Koha/DateUtils.pm
StatementsExecuted 19 statements in 1.76ms
Subroutines
Calls P F Exclusive
Time
Inclusive
Time
Subroutine
111957µs7.15msKoha::DateUtils::::BEGIN@23Koha::DateUtils::BEGIN@23
111445µs458µsKoha::DateUtils::::BEGIN@19Koha::DateUtils::BEGIN@19
11137µs40µsKoha::DateUtils::::BEGIN@24Koha::DateUtils::BEGIN@24
11112µs12µsKoha::DateUtils::::BEGIN@21Koha::DateUtils::BEGIN@21
11111µs74µsKoha::DateUtils::::BEGIN@26Koha::DateUtils::BEGIN@26
11110µs32µsKoha::DateUtils::::BEGIN@27Koha::DateUtils::BEGIN@27
1118µs16µsKoha::DateUtils::::BEGIN@20Koha::DateUtils::BEGIN@20
1116µs6µsKoha::DateUtils::::BEGIN@22Koha::DateUtils::BEGIN@22
0000s0sKoha::DateUtils::::dt_from_stringKoha::DateUtils::dt_from_string
0000s0sKoha::DateUtils::::format_sqldatetimeKoha::DateUtils::format_sqldatetime
0000s0sKoha::DateUtils::::output_prefKoha::DateUtils::output_pref
Call graph for these subroutines as a Graphviz dot language file.
Line State
ments
Time
on line
Calls Time
in subs
Code
1package 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.,
17# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18
19228µs2470µs
# spent 458µs (445+13) within Koha::DateUtils::BEGIN@19 which was called: # once (445µs+13µs) by C4::Koha::BEGIN@28 at line 19
use strict;
# spent 458µs making 1 call to Koha::DateUtils::BEGIN@19 # spent 13µs making 1 call to strict::import
20220µs224µs
# spent 16µs (8+8) within Koha::DateUtils::BEGIN@20 which was called: # once (8µs+8µs) by C4::Koha::BEGIN@28 at line 20
use warnings;
# spent 16µs making 1 call to Koha::DateUtils::BEGIN@20 # spent 8µs making 1 call to warnings::import
21241µs112µs
# spent 12µs within Koha::DateUtils::BEGIN@21 which was called: # once (12µs+0s) by C4::Koha::BEGIN@28 at line 21
use 5.010;
# spent 12µs making 1 call to Koha::DateUtils::BEGIN@21
22221µs16µs
# spent 6µs within Koha::DateUtils::BEGIN@22 which was called: # once (6µs+0s) by C4::Koha::BEGIN@28 at line 22
use DateTime;
# spent 6µs making 1 call to Koha::DateUtils::BEGIN@22
232665µs17.15ms
# spent 7.15ms (957µs+6.19) within Koha::DateUtils::BEGIN@23 which was called: # once (957µs+6.19ms) by C4::Koha::BEGIN@28 at line 23
use DateTime::Format::DateParse;
# spent 7.15ms making 1 call to Koha::DateUtils::BEGIN@23
24235µs242µs
# spent 40µs (37+2) within Koha::DateUtils::BEGIN@24 which was called: # once (37µs+2µs) by C4::Koha::BEGIN@28 at line 24
use C4::Context;
# spent 40µs making 1 call to Koha::DateUtils::BEGIN@24 # spent 2µs making 1 call to C4::Context::import
25
26226µs2138µs
# spent 74µs (11+63) within Koha::DateUtils::BEGIN@26 which was called: # once (11µs+63µs) by C4::Koha::BEGIN@28 at line 26
use base 'Exporter';
# spent 74µs making 1 call to Koha::DateUtils::BEGIN@26 # spent 63µs making 1 call to base::import
273917µs369µs
# spent 32µs (10+22) within Koha::DateUtils::BEGIN@27 which was called: # once (10µs+22µs) by C4::Koha::BEGIN@28 at line 27
use version; our $VERSION = qv('1.0.0');
# spent 32µs making 1 call to Koha::DateUtils::BEGIN@27 # spent 22µs making 1 call to version::import # spent 15µs making 1 call to version::__ANON__[version.pm:52]
28
291900nsour @EXPORT = (
30 qw( dt_from_string output_pref format_sqldatetime )
31);
32
33=head1 DateUtils
34
35Koha::DateUtils - Transitional wrappers to ease use of DateTime
36
37=head1 DESCRIPTION
38
39Koha has historically only used dates not datetimes and been content to
40handle these as strings. It also has confused formatting with actual dates
41this is a temporary module for wrappers to hide the complexity of switch to DateTime
42
43=cut
44
45=head2 dt_ftom_string
46
47$dt = dt_from_string($date_string, [$format, $timezone ]);
48
49Passed a date string returns a DateTime object format and timezone default
50to the system preferences. If the date string is empty DateTime->now is returned
51
52=cut
53
54sub dt_from_string {
55 my ( $date_string, $date_format, $tz ) = @_;
56 if ( !$tz ) {
57 $tz = C4::Context->tz;
58 }
59 if ( !$date_format ) {
60 $date_format = C4::Context->preference('dateformat');
61 }
62 if ($date_string) {
63 if ( ref($date_string) eq 'DateTime' ) { # already a dt return it
64 return $date_string;
65 }
66
67 if ( $date_format eq 'metric' ) {
68 $date_string =~ s#-#/#g;
69 $date_string =~ s/^00/01/; # system allows the 0th of the month
70 $date_string =~ s#^(\d{1,2})/(\d{1,2})#$2/$1#;
71 } else {
72 if ( $date_format eq 'iso' ) {
73 $date_string =~ s/-00/-01/;
74 if ( $date_string =~ m/^0000-0/ ) {
75 return; # invalid date in db
76 }
77 } elsif ( $date_format eq 'us' ) {
78 $date_string =~ s#-#/#g;
79 $date_string =~ s[/00/][/01/];
80 } elsif ( $date_format eq 'sql' ) {
81 $date_string =~
82s/(\d{4})(\d{2})(\d{2})\s+(\d{2})(\d{2})(\d{2})/$1-$2-$3T$4:$5:$6/;
83 return if ($date_string =~ /^0000-00-00/);
84 $date_string =~ s/00T/01T/;
85 }
86 }
87 return DateTime::Format::DateParse->parse_datetime( $date_string,
88 $tz->name() );
89 }
90 return DateTime->now( time_zone => $tz );
91
92}
93
94=head2 output_pref
95
96$date_string = output_pref({ dt => $dt [, dateformat => $date_format, timeformat => $time_format, dateonly => 0|1, as_due_date => 0|1 ] });
97$date_string = output_pref( $dt );
98
99Returns a string containing the time & date formatted as per the C4::Context setting,
100or C<undef> if C<undef> was provided.
101
102This routine can either be passed a DateTime object or or a hashref. If it is
103passed a hashref, the expected keys are a mandatory 'dt' for the DateTime,
104an optional 'dateformat' to override the dateformat system preference, an
105optional 'timeformat' to override the TimeFormat system preference value,
106and an optional 'dateonly' to specify that only the formatted date string
107should be returned without the time.
108
109=cut
110
111sub output_pref {
112 my $params = shift;
113 my ( $dt, $force_pref, $force_time, $dateonly, $as_due_date );
114 if ( ref $params eq 'HASH' ) {
115 $dt = $params->{dt};
116 $force_pref = $params->{dateformat}; # if testing we want to override Context
117 $force_time = $params->{timeformat};
118 $dateonly = $params->{dateonly} || 0; # if you don't want the hours and minutes
119 $as_due_date = $params->{as_due_date} || 0; # don't display the hours and minutes if eq to 23:59 or 11:59 (depending the TimeFormat value)
120 } else {
121 $dt = $params;
122 }
123
124 return unless defined $dt;
125
126 $dt->set_time_zone( C4::Context->tz );
127
128 my $pref =
129 defined $force_pref ? $force_pref : C4::Context->preference('dateformat');
130
131 my $time_format = $force_time || C4::Context->preference('TimeFormat');
132 my $time = ( $time_format eq '12hr' ) ? '%I:%M %p' : '%H:%M';
133 my $date;
134 if ( $pref =~ m/^iso/ ) {
135 $date = $dateonly
136 ? $dt->strftime("%Y-%m-%d")
137 : $dt->strftime("%Y-%m-%d $time");
138 }
139 elsif ( $pref =~ m/^metric/ ) {
140 $date = $dateonly
141 ? $dt->strftime("%d/%m/%Y")
142 : $dt->strftime("%d/%m/%Y $time");
143 }
144 elsif ( $pref =~ m/^us/ ) {
145 $date = $dateonly
146 ? $dt->strftime("%m/%d/%Y")
147 : $dt->strftime("%m/%d/%Y $time");
148 }
149 else {
150 $date = $dateonly
151 ? $dt->strftime("%Y-%m-%d")
152 : $dt->strftime("%Y-%m-%d $time");
153 }
154
155 if ( $as_due_date ) {
156 $time_format eq '12hr'
157 ? $date =~ s| 11:59 PM$||
158 : $date =~ s| 23:59$||;
159 }
160
161 return $date;
162}
163
164=head2 format_sqldatetime
165
166$string = format_sqldatetime( $string_as_returned_from_db );
167
168a convenience routine for calling dt_from_string and formatting the result
169with output_pref as it is a frequent activity in scripts
170
171=cut
172
173sub format_sqldatetime {
174 my $str = shift;
175 my $force_pref = shift; # if testing we want to override Context
176 my $force_time = shift;
177 my $dateonly = shift;
178
179 if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) {
180 my $dt = dt_from_string( $str, 'sql' );
181 return q{} unless $dt;
182 $dt->truncate( to => 'minute' );
183 return output_pref({
184 dt => $dt,
185 dateformat => $force_pref,
186 timeformat => $force_time,
187 dateonly => $dateonly
188 });
189 }
190 return q{};
191}
192
19313µs1;