X-Git-Url: http://git.rot13.org/?a=blobdiff_plain;f=C4%2FDate.pm;h=f8bb6dbb0f6b52a0e25a7fe11c32ea0292b784aa;hb=3d41d906b88f0d649f3eac330e7a4da8da160fe5;hp=5e3a6cfdd6d1512e89a87d4eb2935c78168395bd;hpb=feb424a443c06218fd0877366ab6467d2c5eff29;p=koha.git diff --git a/C4/Date.pm b/C4/Date.pm index 5e3a6cfdd6..f8bb6dbb0f 100644 --- a/C4/Date.pm +++ b/C4/Date.pm @@ -1,10 +1,22 @@ -#!/usr/bin/perl -w - package C4::Date; +# This file is part of Koha. +# +# Koha is free software; you can redistribute it and/or modify it under the +# terms of the GNU General Public License as published by the Free Software +# Foundation; either version 2 of the License, or (at your option) any later +# version. +# +# Koha is distributed in the hope that it will be useful, but WITHOUT ANY +# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR +# 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 use strict; use C4::Context; -use Date::Manip; +use Date::Calc qw(Parse_Date Decode_Date_EU Decode_Date_US Time_to_Date check_date); require Exporter; @@ -16,30 +28,24 @@ $VERSION = 0.01; @EXPORT = qw( &display_date_format + &get_date_format_string_for_DHTMLcalendar &format_date + &format_date_in_iso + &fixdate ); - sub get_date_format { #Get the database handle my $dbh = C4::Context->dbh; - - #Query the database to get the dateformat - my $sth = $dbh->prepare("SELECT value FROM systempreferences WHERE variable='dateformat'"); - - $sth->execute(); - - my ($dateformat) = $sth->fetchrow; - - return $dateformat + return C4::Context->preference('dateformat'); } sub display_date_format { my $dateformat = get_date_format(); - + if ( $dateformat eq "us" ) { return "mm/dd/yyyy"; @@ -58,33 +64,174 @@ sub display_date_format } } +sub get_date_format_string_for_DHTMLcalendar { + my $dateformat = get_date_format(); + + if ( $dateformat eq 'us' ) { + return '%m/%d/%Y'; + } + elsif ( $dateformat eq 'metric' ) { + return '%d/%m/%Y'; + } + elsif ( $dateformat eq "iso" ) { + return '%Y-%m-%d'; + } + else { + return 'Invalid date format: ' + . $dateformat . '.' + . ' Please change in system preferences'; + } +} sub format_date { my $olddate = shift; my $newdate; - my $dateformat = get_date_format(); - - if ( $dateformat eq "us" ) - { - $olddate = ParseDate($olddate); - $newdate = UnixDate($olddate,'%m/%d/%Y'); - } - elsif ( $dateformat eq "metric" ) - { - $olddate = ParseDate($olddate); - $newdate = UnixDate($olddate,'%d/%m/%Y'); - } - elsif ( $dateformat eq "iso" ) + if ( ! $olddate ) { - $olddate = ParseDate($olddate); - $newdate = UnixDate($olddate,'%Y-%m-%d'); - } - else - { - return "Invalid date format: $dateformat. Please change in system preferences"; + return ""; } + +# warn $olddate; +# $olddate=~s#/|\.|-##g; + my ($year,$month,$day)=Parse_Date($olddate); + ($year,$month,$day)=split /-|\/|\.|:/,$olddate unless ($year && $month); +# warn "$olddate annee $year mois $month jour $day"; + if ($year>0 && $month>0){ + my $dateformat = get_date_format(); + $dateformat="metric" if (index(":",$olddate)>0); + if ( $dateformat eq "us" ) + { + $newdate = sprintf("%02d/%02d/%04d",$month,$day,$year); + } + elsif ( $dateformat eq "metric" ) + { + $newdate = sprintf("%02d/%02d/%04d",$day,$month,$year); + } + elsif ( $dateformat eq "iso" ) + { + # Date_Init("DateFormat=iso"); + $newdate = sprintf("%04d-%02d-%02d",$year,$month,$day); + } + else + { + return "Invalid date format: $dateformat. Please change in system preferences"; + } +# warn "newdate :$newdate"; + } + return $newdate; +} + +sub format_date_in_iso +{ + my $olddate = shift; + my $newdate; + + if ( ! $olddate ) + { + return ""; + } + if (check_whether_iso($olddate)){ + return $olddate; + } else { + my $dateformat = get_date_format(); + my ($year,$month,$day); + my @date; + my $tmpolddate=$olddate; + $tmpolddate=~s#/|\.|-|\\##g; + $dateformat="metric" if (index(":",$olddate)>0); + if ( $dateformat eq "us" ) + { + ($month,$day,$year)=split /-|\/|\.|:/,$olddate unless ($year && $month); + if ($month>0 && $day >0){ + @date = Decode_Date_US($tmpolddate); + } else { + @date=($year, $month,$day) + } + } + elsif ( $dateformat eq "metric" ) + { + ($day,$month,$year)=split /-|\/|\.|:/,$olddate unless ($year && $month); + if ($month>0 && $day >0){ + @date = Decode_Date_EU($tmpolddate); + } else { + @date=($year, $month,$day) + } + } + elsif ( $dateformat eq "iso" ) + { + ($year,$month,$day)=split /-|\/|\.|:/,$olddate unless ($year && $month); + if ($month>0 && $day >0){ + @date=($year, $month,$day) if (check_date($year,$month,$day)); + } else { + @date=($year, $month,$day) + } + } + else + { + return "9999-99-99"; + } + $newdate = sprintf("%04d-%02d-%02d",$date[0],$date[1],$date[2]); + return $newdate; + } +} + +sub check_whether_iso +{ + my $olddate = shift; + my @olddate= split /\-/,$olddate ; + return 1 if (length($olddate[0])==4 && length($olddate[1])<=2 && length($olddate[2])<=2); + return 0; +} + +=head2 fixdate + +( $date, $invalidduedate ) = fixdate( $year, $month, $day ); + +=cut + +sub fixdate { + my ( $year, $month, $day ) = @_; + my $invalidduedate; + my $date; + if ( $year && $month && $day ) { + if ( ( $year eq 0 ) && ( $month eq 0 ) && ( $year eq 0 ) ) { + } + else { + if ( ( $year eq 0 ) || ( $month eq 0 ) || ( $year eq 0 ) ) { + $invalidduedate = 1; + } + else { + if ( + ( $day > 30 ) + && ( ( $month == 4 ) + || ( $month == 6 ) + || ( $month == 9 ) + || ( $month == 11 ) ) + ) + { + $invalidduedate = 1; + } + elsif ( ( $day > 29 ) && ( $month == 2 ) ) { + $invalidduedate = 1; + } + elsif ( + ( $month == 2 ) + && ( $day > 28 ) + && ( ( $year % 4 ) + && ( ( !( $year % 100 ) || ( $year % 400 ) ) ) ) + ) + { + $invalidduedate = 1; + } + else { + $date = "$year-$month-$day"; + } + } + } + } + return ( $date, $invalidduedate ); } 1;