Location: PHPKode > scripts > date > date/dataclass.php
<?php

# date class
# coded by Alessandro Rosa
# e-mail : hide@address.com
# site : http://malilla.supereva.it

# last update and bug fixed at : Jan 24th 2007

# Copyright (C) 2007  Alessandro Rosa

# This program 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 3 of the License, or
# any later version.

# This program 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 this program; if not, write to the Free Software Foundation,
# Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA

# Compiled with PHP 4.4.0

$lastday_months = array( 1 => 31, 
                         2 => 28,
                         3 => 31,
                         4 => 30,
                         5 => 31,
                         6 => 30,
                         7 => 31,
                         8 => 31,
                         9 => 30,
                         10 => 31,
                         11 => 30,
                         12 => 31 ) ;

$lastday_months2 = array( 1 => 31, 
                         2 => 29,
                         3 => 31,
                         4 => 30,
                         5 => 31,
                         6 => 30,
                         7 => 31,
                         8 => 31,
                         9 => 30,
                         10 => 31,
                         11 => 30,
                         12 => 31 ) ;

// fill this array with the months name in your output language

$name_months = array( "01" => Gennaio,
                      "02" => Febbraio,
                      "03" => Marzo,
                      "04" => Aprile,
                      "05" => Maggio,
                      "06" => Giugno,
                      "07" => Luglio,
                      "08" => Agosto,
                      "09" => Settembre,
                      "10" => Ottobre,
                      "11" => Novembre,
                      "12" => Dicembre
                    ) ;

// fill this array with the week days name in your output language

$name_days = array( "Domenica",
                    "Lunedì",
                    "Martedì",
                    "Mercoledì",
                    "Giovedì",
                    "Venerdì",
                    "Sabato"
              ) ;

$short_name_days = array( "D",
                    "L",
                    "M",
                    "M",
                    "G",
                    "V",
                    "S"
              ) ;


class date
{
      function date()
      {
          $this->start_date = 0 ;
      }

      function isbisextile( $year )
      {
          if ( ( $year % 4 == 0 ) && ( $year % 100 != 0 ) && ( $year % 1000 != 0 ) ) return true ;
          else if ( $year % 400 == 0 ) return true ;
          else if ( ( $year % 1000 == 0 ) && ( $year % 4000 != 0 ) ) return true ;
          else return false ;
      }
      
      function set_start_date( $d, $m, $y )
      {
          $this->start_day = $d + 0; // + 0 forces each entry string to turn into a number
          $this->start_month = $m + 0;
          $this->start_year = $y + 0;
      
          $this->days_of_the_year = $this->isbisextile( $y ) ? 366 : 365 ;
      }

      function daysfrombegin()
      {
            $tmp_days = 0 ;
            
            $a = array();
            $a = $this->isbisextile( $this->start_year ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;

            $tmp_days += $this->start_day ;

            for ( $i = 1; $i <= ( intval( $this->start_month ) - 1 ); $i++ ) $tmp_days += $a{$i} ;
            
            return --$tmp_days ;
      }

      function daystoend()
      {
            $tmp_days = 0 ;
            
            $a = array();
            $a = $this->isbisextile( $this->start_year ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;

            $m = $this->start_month ; // zero-based index of the input month
            $tmp_days += ( $a{$m} - $this->start_day ) ;
            
            for ( $i = ( intval( $this->start_month ) + 1 ) ; $i <= 12; $i++ ) $tmp_days += $a{$i} ;
            
            return $tmp_days ;
      }

      function to_months( $months )
      {
            $tmp_d = $this->start_day ;
            $tmp_m = $this->start_month ;
            $tmp_y = $this->start_year ;

            $y = floor( abs( $months ) / 12.0 ) ;
            $m = $months % 12 ;
            
            $tmp_m += $m ;
            $tmp_y += $y ;

            $this->end_day = ( intval( $tmp_d ) < 10 ) ? "0$tmp_d" : $tmp_d ;
            $this->end_month = ( intval( $tmp_m ) < 10 ) ? "0$tmp_m" : $tmp_m ;
            $this->end_year = ( intval( $tmp_y ) < 10 ) ? "0$tmp_y" : $tmp_y ;
      }

      function to_years( $years )
      {
            $tmp_d = $this->start_day ;
            $tmp_m = $this->start_month ;
            $tmp_y = $this->start_year ;

            $tmp_y += $years ;

            $this->end_day = ( intval( $tmp_d ) < 10 ) ? "0$tmp_d" : $tmp_d ;
            $this->end_month = ( intval( $tmp_m ) < 10 ) ? "0$tmp_m" : $tmp_m ;
            $this->end_year = ( intval( $tmp_y ) < 10 ) ? "0$tmp_y" : $tmp_y ;
      }

      function to_date( $days )
      {
            $tmp_d = $this->start_day ;
            $tmp_m = $this->start_month ;
            $tmp_y = $this->start_year ;
            
            $unit_d = ( intval( $days < 0 ) ) ? -1 : +1;
            $unit_m = ( intval( $days < 0 ) ) ? -1 : +1;
            $unit_y = ( intval( $days < 0 ) ) ? -1 : +1;
            
            $a = array();
            $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;

            $days = abs( $days );

            while( intval( $days ) > 0 )
            {
                  $tmp_d += $unit_d ;
                  $days-- ;
                  
                  if ( intval( $tmp_d ) == 0 ) // when $unit_d is -1
                  {
                        $tmp_m-- ;
                        if ( intval( $tmp_m ) == 0 )
                        {
                           $tmp_m = 12 ;
                           $tmp_y-- ;
    
                           $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;
                        }
                  
                        while( intval( $days ) > $a{ intval( $tmp_m ) } )
                        {
                            $days -= $a{ intval( $tmp_m ) } ;
                            $tmp_m-- ;
 
                            if ( intval( $tmp_m ) == 0 )
                            {
                               $tmp_m = 12 ;
                               $tmp_y-- ;
    
                               $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;
                            }
                       }
                        
                        $tmp_d = $a{ intval( $tmp_m ) } ;
                  }
                  else if ( $tmp_d == ( $a{ intval( $tmp_m ) } + 1 ) )  // when $unit_d is +1
                  {
                        // first we check whether the next month is January,
                        // therefore the year is incremented by one and checked if bisextile.
                                      
                        if ( ( intval( $tmp_m ) + 1 ) == 13 )
                        {
                            $tmp_m = 1 ;    $tmp_y++ ;
                            $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;
                        }
                        else $tmp_m++ ;

                        while( intval( $days ) > $a{ intval( $tmp_m ) } ) // looks at the days of the next month
                        {
                            $tmp_d = $a{ intval( $tmp_m ) } ;
                            $days -= $tmp_d ;

                            if ( ( intval( $tmp_m ) + 1 ) == 13 )
                            {
                                $tmp_m = 1 ;    $tmp_y++ ;
                                $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;
                            }
                            else $tmp_m++ ;
                        }

                        $tmp_d = 1 ;
                  }
                  //////////////////////////////////////////////
            }

            $this->end_day = ( intval( $tmp_d ) < 10 ) ? "0$tmp_d" : $tmp_d ;
            $this->end_month = ( intval( $tmp_m ) < 10 ) ? "0$tmp_m" : $tmp_m ;
            $this->end_year = ( intval( $tmp_y ) < 10 ) ? "0$tmp_y" : $tmp_y ;
      }

      function daysbetween( $sd, $sm, $sy, $ed, $em, $ey, &$bSwap )
      {
            $bSwap = false ;

            if ( intval( $ey ) < intval( $sy ) )
            {
                $this->swap( $sd, $ed ) ;
                $this->swap( $sm, $em ) ;
                $this->swap( $sy, $ey ) ;

                $bSwap = true ;
            }
            else if ( intval( $em ) < intval( $sm ) && intval( $ey ) == intval( $sy ) )
            {
                $this->swap( $sd, $ed ) ;
                $this->swap( $sm, $em ) ;
                $this->swap( $sy, $ey ) ;

                $bSwap = true ;
            }
            else if ( intval( $ed ) < intval( $sd ) && intval( $em ) == intval( $sm ) && intval( $ey ) == intval( $sy ) )
            {
                $this->swap( $sd, $ed ) ;
                $this->swap( $sm, $em ) ;
                $this->swap( $sy, $ey ) ;

                $bSwap = true ;
            }
      
            $days = 0;
            $tmp_d = $sd ; $tmp_m = $sm ; $tmp_y = $sy ;
            $a = array();
            $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;

            while( true )
            {
                  if ( $tmp_d == $ed && $tmp_m == $em && $tmp_y == $ey ) break;

                  if ( intval( $tmp_d ) == ( $a{ intval( $tmp_m ) } ) )
                  {
                        $tmp_d = 1 ;
                        $tmp_m++ ;

                        if ( intval( $tmp_m ) == 13 )
                        {
                           $tmp_m = 1 ;    $tmp_y++ ;
                           $a = $this->isbisextile( $tmp_y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;
                        }
                  }

                  $tmp_d++ ;

                  //////////////////////////////////////////////
                  $days++ ; // loops to exit
            }
      
            return ( $bSwap ) ? "-$days" : $days ;
      }

      function timebetween( $sh, $sm, $ss, $eh, $em, $es, &$bOneDayOut )
      {
            $a = array() ;

            if ( ( $ss < 0 || $ss > 59 ) ||
                 ( $eh < 0 || $eh > 59 ) ||
                 ( $sm < 0 || $sm > 59 ) ||
                 ( $em < 0 || $em > 59 ) ||
                 ( $sh < 0 || $sh > 23 ) ||
                 ( $eh < 0 || $eh > 23 ) )
            {
                $a['seconds'] = -1 ;
                $a['minutes'] = -1 ;
                $a['hours'] = -1 ;
                
                return $a ;
            }

if ( $ss > $es || $sm > $em || $sh > $eh )
{
    $bOneDayOut = true ;

    $this->swap( $ss, $es );
    $this->swap( $sm, $em );
    $this->swap( $sh, $eh );
}

            $seconds = $ss - $es ;
            $minutes = $sm - $em ;
            $hours = $sh - $eh ;

            $bSECS = false ;
            $bMINS = false ;
            $bHOURS = false ;

            if ( $seconds < 0 )
            {
                $seconds = 60 - abs( $seconds ) ;  $bSECS = true ;
            }

            if ( $minutes < 0 )
            {
                $minutes = 60 - abs( $minutes ) ; $bMINS = true ;
            }

            if ( $hours < 0 )
            {
                $hours = 24 - abs( $hours ) ; $bHOURS = true ;
            }
      
            if ( $bSECS ) $minutes-- ;
            if ( $bMINS ) $hours-- ;
      
            $a['seconds'] = $seconds ;
            $a['minutes'] = $minutes ;
            $a['hours'] = $hours ;

            return $a ;
      }

      function to_time( $sHOURS, $sMINUTES, $sSECONDS, $withinHOURS, $withinMINUTES, $withinSECONDS )
      {
              if ( !( $this->check_time( $sHOURS, $sMINUTES, $sSECONDS ) ) ) return false ;
              
              if ( $withinHOURS < 0 || $withinMINUTES < 0 || $withinSECONDS < 0 )
              {
                  $withinHOURS = 0 - abs( $withinHOURS );
                  $withinMINUTES = 0 - abs( $withinMINUTES );
                  $withinSECONDS = 0- abs( $withinSECONDS );
              }
              
              $sSECONDS += $withinSECONDS ;
              $addONminutes = floor( $sSECONDS / 60 );
              $sSECONDS = ( $sSECONDS < 0 ) ? 60 - abs( $sSECONDS ) % 60 : $sSECONDS % 60 ;
              ///////////////////////////////
              $sMINUTES += $withinMINUTES + $addONminutes ;
              $addONhours = floor( $sMINUTES / 60 );
              $sMINUTES = ( $sMINUTES < 0 ) ? 60 - abs( $sMINUTES ) % 60 : $sMINUTES % 60 ;
              ///////////////////////////////
              if ( $sHOURS == 0 ) $sHOURS = 24 ;
              $sHOURS += $withinHOURS + $addONhours ;
              $sHOURS = ( $sHOURS < 0 ) ? 24 - abs( $sHOURS ) % 24 : $sHOURS % 24 ;
              
              $a = array();
              $a['seconds'] = abs( $sSECONDS );
              $a['minutes'] = abs( $sMINUTES );
              $a['hours'] = abs( $sHOURS );
              
              return $a ;
              
      }


      function get_start_all_date() { $a = array( $this->start_day, $this->start_month, $this->start_year ); return $a ; }
      function get_end_all_date() { $a = array( $this->end_day, $this->end_month, $this->end_year ); return $a ; }
      function get_end_all_date_ref( &$m, &$d, &$y ) { $d = $this->end_day ; $m = $this->end_month ; $y = $this->end_year; }

      function get_start_day()   { return $this->start_day ;   }
      function get_start_month() { return $this->start_month ; }
      function get_start_year()  { return $this->start_year ;  }
      function get_end_day()     { return $this->end_day ;     }
      function get_end_month()   { return $this->end_month ;   }
      function get_end_year()    { return $this->end_year ;    }

      function get_start_day_name() {
            $this->start_day += 0 ;
            $this->start_month += 0 ;
            
            $date = getdate( mktime( 0, 0, 0, $this->start_month, $this->start_day, $this->start_year ) );
              
            return $GLOBALS['name_days'][$date['wday']] ;
      }

      function get_end_day_name() {
            $this->end_day += 0 ;
            $this->end_month += 0 ;
            
            $date = getdate( mktime( 0, 0, 0, $this->end_month, $this->end_day, $this->end_year ) );
            
            return $GLOBALS['name_days'][$date['wday']] ;
      }

      function get_start_day_index() {
            $this->start_day += 0 ;
            $this->start_month += 0 ;
            
            $date = getdate( mktime( 0, 0, 0, $this->start_month, $this->start_day, $this->start_year ) );
              
            return ( $date['wday'] == 0 ) ? 7 : $date['wday'] ;
      }

      function get_end_day_index() {
            $this->end_day += 0 ;
            $this->end_month += 0 ;
            
            $date = getdate( mktime( 0, 0, 0, $this->end_month, $this->end_day, $this->end_year ) );
            
            return ( $date['wday'] == 0 ) ? 7 : $date['wday'] ;
      }

      function get_start_month_name() { $this->start_month += 0 ; $m = ( $this->start_month < 10 ) ? "0$this->start_month" : $this->start_month ; return $GLOBALS['name_months'][$m] ; }
      function get_end_month_name()   { $this->end_month += 0 ; $m = ( $this->end_month < 10 ) ? "0$this->end_month" : $this->end_month ; return $GLOBALS['name_months'][$m] ; }

      function get_month_name( $index )   { return $GLOBALS['name_months'][$index] ; }

      function get_month_days( $month, $year )
      { 
          $a = $this->isbisextile( $year ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;
          
          if ( $this->isbisextile( $year ) ) return $a[$month] ;
          else return $a[$month] ;
      }

      function swap( &$a, &$b ) { $t = $a ; $a = $b ; $b = $t ; }

      function isnumeric( $sText )
      {
          $re = "^[0-9]{1,2}$" ;
          return eregi( $re, $sText ) ;
      }

      function check_date( $d, $m, $y )
      {
            if ( !( $this->isnumeric( $d ) ) ) return false ;
            if ( !( $this->isnumeric( $m ) ) ) return false ;
            if ( !( $this->isnumeric( $d ) ) ) return false ;
            
            $a = array();
            $a = $this->isbisextile( $y ) ? $GLOBALS['lastday_months2'] : $GLOBALS['lastday_months'] ;

            if ( $m < 1 || $m > 12 ) return false ;     
            if ( $d < 1 || $d > $a{$m} ) return false ;
            
            return true ;
      }

      function check_time( $hours, $minutes, $seconds )
      {
            if ( !( $this->isnumeric( $hours ) ) ) return false ;
            if ( !( $this->isnumeric( $minutes ) ) ) return false ;
            if ( !( $this->isnumeric( $seconds ) ) ) return false ;
            
            if ( abs( $seconds ) >= 60 ) return false ;     
            if ( abs( $minutes ) >= 60 ) return false ;     
            if ( abs( $hours ) >= 24 ) return false ;     
            
            return true ;
      }
      
      function today( &$m, &$d, &$y )
      {
          $today = getdate();
          $m = $today['mon'];     $d = $today['mday'];      $y = $today['year'];
      }

      function format_today( $fmt, $sep )
      {
          if ( strlen( $fmt ) < 5 || strlen( $fmt ) > 8 ) $fmt = "mmddyyyy" ;
          if ( strlen( $sep ) == 0 ) $sep = "/" ;
          
          $today = getdate();
          $m = $today['mon'];     $d = $today['mday'];      $y = $today['year'];
          $d += 0 ;     $m += 0 ;     $y += 0 ;

          $d = ( $d < 10 ) ? "0$d" : $d ;
          $m = ( $m < 10 ) ? "0$m" : $m ;
      
          switch( $fmt )
          {
              case "ddmmyy":
                  $y = substr( $y, -2 ) ;
                  return "$d$sep$m$sep$y" ;
              break;
              case "mmddyy":
                  $y = substr( $y, -2 ) ;
                  return "$m$sep$d$sep$y" ;
              break;
              case "ddmmyyyy":
                  return "$d$sep$m$sep$y" ;
              break;
              case "mmddyyyy":
                  return "$m$sep$d$sep$y" ;
              break;
              default:
                  return "$m$sep$d$sep$y" ;
              break;
          }
      }

      function format_date( $m, $d, $y, $fmt, $sep )
      {
          if ( !isset( $fmt ) || strlen( $fmt ) < 5 || strlen( $fmt ) > 8 ) $fmt = "mmddyyyy" ;
          if ( !isset( $sep ) || strlen( $sep ) == 0 ) $sep = "/" ;

          $d += 0 ;     $m += 0 ;     $y += 0 ;

          $d = ( $d < 10 ) ? "0$d" : $d ;
          $m = ( $m < 10 ) ? "0$m" : $m ;
      
          switch( $fmt )
          {
              case "ddmmyy":
                  $y = substr( $y, -2 ) ;
                  return "$d$sep$m$sep$y" ;
              break;
              case "mmddyy":
                  $y = substr( $y, -2 ) ;
                  return "$m$sep$d$sep$y" ;
              break;
              case "ddmmyyyy":
                  return "$d$sep$m$sep$y" ;
              break;
              case "mmddyyyy":
                  return "$m$sep$d$sep$y" ;
              break;
              default:
                  return "$m$sep$d$sep$y" ;
              break;
          }
      }

      function format_time( $hours, $mins, $seconds, $fmt, $sep )
      {
          if ( !isset( $fmt ) || strlen( $fmt ) < 5 || strlen( $fmt ) > 8 ) $fmt = "hhmmss" ;
          if ( !isset( $sep ) || strlen( $sep ) == 0 ) $sep = ":" ;

          $hours += 0 ;     $mins += 0 ;     $seconds += 0 ;

          $prefix = ( $hours < 0 || $mins < 0 || $seconds < 0 ) ? "-" : "" ;

          $hours = abs( $hours );   $mins = abs( $mins );   $seconds = abs( $seconds );

          $hours = ( $hours < 10 ) ? "0$hours" : $hours ;
          $mins = ( $mins < 10 ) ? "0$mins" : $mins ;
          $seconds = ( $seconds < 10 ) ? "0$seconds" : $seconds ;
      
          switch( $fmt )
          {
              case "hhmmss":
                  return "$prefix$hours$sep$mins$sep$seconds" ;
              break;
          }
      }

      function isbefore( $sm, $sd, $sy, $em, $ed, $ey )
      {
          if ( $ey > $sy ) return true ;
          else if ( $ey < $sy ) return false ;
          else
          {
                if ( $em > $sm ) return true ;
                else if ( $em < $sm ) return false ;
                else
                {
                    if ( $ed > $sd ) return true ;
                    else if ( $ed < $sd ) return false ;
                    else return false ;
                }
          }
      }

      function isafter( $sm, $sd, $sy, $em, $ed, $ey )
      {
            if ( $this->isbefore( $sm, $sd, $sy, $em, $ed, $ey ) ) return false ;
            else return true ;
      }

      var $start_day ;
      var $start_month ;
      var $start_year ;
      var $days_of_the_year ;

      var $end_day ;
      var $end_month ;
      var $end_year ;

      var $lastday_months;
      var $err_no ;
}

?>
Return current item: date