Show
Ignore:
Timestamp:
04/03/08 08:14:20 (20 months ago)
Author:
fumiakiy
Message:

Implemented MT::DateTime::compare. BugId:67917

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • branches/release-33/lib/MT/DateTime.pm

    r1174 r1744  
    1313use vars qw( @EXPORT_OK ); 
    1414@EXPORT_OK = qw( ymd2rd tz_offset_as_seconds ); 
     15 
     16use MT::Util qw( epoch2ts ); 
    1517 
    1618sub new { 
     
    170172} 
    171173 
     174sub _param2ts { 
     175    my ( $param, $blog ) = @_; 
     176 
     177    my ( $type, $value ); 
     178    if ( 'HASH' eq ref($param) ) { 
     179        $type = $param->{type}; 
     180        $value = $param->{value}; 
     181    } 
     182    else { 
     183        $type = 'ts'; 
     184        $value = $param; 
     185    } 
     186    if ( 'CODE' eq ref($value) ) { 
     187        $value = $value->(); 
     188    } 
     189 
     190    my $ts; 
     191    if ( 'epoch' eq $type ) { 
     192        $ts = epoch2ts( $blog, $value ); 
     193    } 
     194    elsif ( 'datetime' eq $type ) { 
     195        $ts = sprintf "%04d%02d%02d%02d%02d%02d", 
     196            $value->year, 
     197            $value->month, 
     198            $value->day, 
     199            $value->hour, 
     200            $value->minute, 
     201            $value->second; 
     202    } 
     203    else { 
     204        $ts = $value; 
     205    } 
     206    $ts; 
     207} 
     208 
     209sub compare { 
     210    my $self = shift; 
     211    my %param = @_; 
     212    # a => $ts | CODE | { value => CODE|$v, type => ts|epoch|datetime } 
     213    # b => $ts | CODE | { value => CODE|$v, type => ts|epoch|datetime } 
     214    # blog => ref|N|undef 
     215    # comparer => CODE|undef 
     216 
     217    my $blog = $param{blog}; 
     218    if ( defined($blog) && !ref($blog) ) { 
     219        $blog = MT->model('blog')->load( $blog ); 
     220        $blog = undef unless ref($blog); 
     221    } 
     222 
     223    if ( !exists($param{a}) && ref($self) ) { 
     224        $param{a} = { value => $self, type => 'datetime' }; 
     225    } 
     226    my $ts_a = _param2ts( $param{a}, $blog ); 
     227 
     228    if ( !exists($param{b}) && ref($self) ) { 
     229        $param{b} = { value => $self, type => 'datetime' }; 
     230    } 
     231    my $ts_b = _param2ts( $param{b}, $blog ); 
     232 
     233    my $comparer = $param{code}; 
     234    if ( 'CODE' eq ref($comparer) ) { 
     235        return $comparer->( $ts_a, $ts_b ); 
     236    } 
     237    else { 
     238        return $ts_a - $ts_b; 
     239    } 
     240} 
     241 
    1722421; 
    173243__END__