X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=Koha%2FDateUtils.pm;h=4ae0d0ce694935d3f9eac3c699c0a21e19cfa0a9;hb=0f6882896d6a806fb474b1fd172e3e93919d960c;hp=94ea73126e3d11494f96418bf9846aae9ed375af;hpb=b7b6a8e388bea78dd7511b11df7380bcee649a79;p=koha.git diff --git a/Koha/DateUtils.pm b/Koha/DateUtils.pm index 94ea73126e..4ae0d0ce69 100644 --- a/Koha/DateUtils.pm +++ b/Koha/DateUtils.pm @@ -13,8 +13,8 @@ package Koha::DateUtils; # A PARTICULAR PURPOSE. See the GNU General Public License for more details. # # You should have received a copy of the GNU General Public License along with -# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, -# Suite 330, Boston, MA 02111-1307 USA +# Koha; if not, write to the Free Software Foundation, Inc., +# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. use strict; use warnings; @@ -26,7 +26,9 @@ use C4::Context; use base 'Exporter'; use version; our $VERSION = qv('1.0.0'); -our @EXPORT = (qw( dt_from_string output_pref)); +our @EXPORT = ( + qw( dt_from_string output_pref format_sqldatetime output_pref_due format_sqlduedatetime) +); =head1 DateUtils @@ -69,42 +71,172 @@ sub dt_from_string { } else { if ( $date_format eq 'iso' ) { $date_string =~ s/-00/-01/; - if ( $date_string =~ m/^0000-00/ ) { + if ( $date_string =~ m/^0000-0/ ) { return; # invalid date in db } } elsif ( $date_format eq 'us' ) { - $date_string =~ s[-00-][-01-]; + $date_string =~ s#-#/#g; + $date_string =~ s[/00/][/01/]; } elsif ( $date_format eq 'sql' ) { $date_string =~ s/(\d{4})(\d{2})(\d{2})\s+(\d{2})(\d{2})(\d{2})/$1-$2-$3T$4:$5:$6/; + return if ($date_string =~ /^0000-00-00/); $date_string =~ s/00T/01T/; } } - return DateTime::Format::DateParse->parse_datetime( $date_string, $tz ); + return DateTime::Format::DateParse->parse_datetime( $date_string, + $tz->name() ); } return DateTime->now( time_zone => $tz ); } +=head2 output_pref + +$date_string = output_pref({ dt => $dt [, dateformat => $date_format, timeformat => $time_format, dateonly => 0|1 ] }); +$date_string = output_pref( $dt ); + +Returns a string containing the time & date formatted as per the C4::Context setting, +or C if C was provided. + +This routine can either be passed a DateTime object or or a hashref. If it is +passed a hashref, the expected keys are a mandatory 'dt' for the DateTime, +an optional 'dateformat' to override the dateformat system preference, an +optional 'timeformat' to override the TimeFormat system preference value, +and an optional 'dateonly' to specify that only the formatted date string +should be returned without the time. + +=cut + sub output_pref { - my $dt = shift; - my $pref = C4::Context->preference('dateformat'); + my $params = shift; + my ( $dt, $force_pref, $force_time, $dateonly ); + if ( ref $params eq 'HASH' ) { + $dt = $params->{dt}; + $force_pref = $params->{dateformat}; # if testing we want to override Context + $force_time = $params->{timeformat}; + $dateonly = $params->{dateonly} || 0; # if you don't want the hours and minutes + } else { + $dt = $params; + } + + return unless defined $dt; + + $dt->set_time_zone( C4::Context->tz ); + + my $pref = + defined $force_pref ? $force_pref : C4::Context->preference('dateformat'); + + my $time_format = $force_time || C4::Context->preference('TimeFormat'); + my $time = ( $time_format eq '12hr' ) ? '%I:%M %p' : '%H:%M'; + given ($pref) { when (/^iso/) { - return $dt->strftime('%Y-%m-%d $H:%M'); + return $dateonly + ? $dt->strftime("%Y-%m-%d") + : $dt->strftime("%Y-%m-%d $time"); } when (/^metric/) { - return $dt->strftime('%d/%m/%Y $H:%M'); + return $dateonly + ? $dt->strftime("%d/%m/%Y") + : $dt->strftime("%d/%m/%Y $time"); } when (/^us/) { - return $dt->strftime('%m/%d/%Y $H:%M'); + + return $dateonly + ? $dt->strftime("%m/%d/%Y") + : $dt->strftime("%m/%d/%Y $time"); } default { - return $dt->strftime('%Y-%m-%d $H:%M'); + return $dateonly + ? $dt->strftime("%Y-%m-%d") + : $dt->strftime("%Y-%m-%d $time"); } } return; } +=head2 output_pref_due + +$date_string = output_pref_due({ dt => $dt [, dateformat => $date_format, timeformat => $time_format, dateonly => 0|1 ] }); +$date_string = output_pref_due($dt); + +Returns a string containing the time & date formatted as per the C4::Context setting + +This routine can either be passed a DateTime object or or a hashref. If it is +passed a hashref, the expected keys are a mandatory 'dt' for the DateTime, +an optional 'dateformat' to override the dateformat system preference, an +optional 'timeformat' to override the TimeFormat system preference value, +and an optional 'dateonly' to specify that only the formatted date string +should be returned without the time. + +This is effectively a wrapper around output_pref for due dates; +the time portion is stripped if it is '23:59' + +=cut + +sub output_pref_due { + my $disp_str = output_pref(@_); + $disp_str =~ s/ 23:59//; + return $disp_str; +} + +=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 + +sub format_sqldatetime { + my $str = shift; + my $force_pref = shift; # if testing we want to override Context + my $force_time = shift; + my $dateonly = shift; + + if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) { + my $dt = dt_from_string( $str, 'sql' ); + return q{} unless $dt; + $dt->truncate( to => 'minute' ); + return output_pref({ + dt => $dt, + dateformat => $force_pref, + timeformat => $force_time, + dateonly => $dateonly + }); + } + return q{}; +} + +=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 + +sub format_sqlduedatetime { + my $str = shift; + my $force_pref = shift; # if testing we want to override Context + my $force_time = shift; + my $dateonly = shift; + + if ( defined $str && $str =~ m/^\d{4}-\d{2}-\d{2}/ ) { + my $dt = dt_from_string( $str, 'sql' ); + $dt->truncate( to => 'minute' ); + return output_pref_due({ + dt => $dt, + dateformat => $force_pref, + timeformat => $force_time, + dateonly => $dateonly + }); + } + return q{}; +} + 1;