## @file # (Enter your file info here) # # $Id: Time.pm 438 2008-05-06 14:35:19Z damjan $ ## @class RWDE::Time # (Enter RWDE::Time info here) package RWDE::Time; use strict; use warnings; use RWDE::DB::Record; use RWDE::DB::DefaultDB; use base qw(RWDE::DB::DefaultDB RWDE::DB::Record); ## @method object fetch_time($interval, $timestamp) # (Enter fetch_time info here) # @param timestamp (Enter explanation for param here) # @param interval (Enter explanation for param here) # @return (Enter explanation for return value--(Enter explanation for return value here)--here) sub fetch_time { my ($self, $params) = @_; my @required = qw( timestamp interval ); RWDE::DB::Record->check_params({ required => \@required, supplied => $params }); #insert regex for timestamp validation and interval validation... my $select = 'CAST(? as timestamp) + CAST(? as interval)'; my @query_params = ($$params{timestamp}, $$params{interval}); return $self->fetch_single({ select => $select, query_params => \@query_params }); } ## @method object fetch_diff($start_stamp, $stop_stamp) # (Enter fetch_diff info here) # @param stop_stamp (Enter explanation for param here) # @param start_stamp (Enter explanation for param here) # @return (Enter explanation for return value--(Enter explanation for return value here)--here) # @todo insert regex for timestamp validation and interval validation... sub fetch_diff { my ($self, $params) = @_; if (not defined $$params{start_stamp} or not defined $$params{stop_stamp}) { return; } my $select = 'CAST(? as date) - CAST(? as date)'; my @query_params = ($$params{stop_stamp}, $$params{start_stamp}); return $self->fetch_single({ select => $select, query_params => \@query_params }); } ## @method object fetch_exact_diff($start_stamp, $stop_stamp) # (Enter fetch_exact_diff info here) # @param stop_stamp (Enter explanation for param here) # @param start_stamp (Enter explanation for param here) # @return (Enter explanation for return value--(Enter explanation for return value here)--here) sub fetch_exact_diff { my ($self, $params) = @_; if (not defined $$params{start_stamp} or not defined $$params{stop_stamp}) { return; } #insert regex for timestamp validation and interval validation... my $select = "to_char(CAST(? as timestamp) - CAST(? as timestamp),'SS')"; my @query_params = ($$params{stop_stamp}, $$params{start_stamp}); return $self->fetch_single({ select => $select, query_params => \@query_params }); } ## @method object now() # Get the current timestamp. Should be used instead of embedding the call to now from # an object to keep the object in the correct state # @return (Enter explanation for return value--(Enter explanation for return value here)--here) sub now { my ($self, $params) = @_; return $self->fetch_time({ timestamp => 'NOW()', interval => 0 }); } ## @method object days_passed($timestamp) # This function returns the number of whole days that have passed since # date passed in date parameter. # @param timestamp (Enter explanation for param here) # @return (Enter explanation for return value--(Enter explanation for return value here)--here) sub days_passed { my ($self, $params) = @_; my $interval = RWDE::Time->fetch_diff({ start_stamp => $$params{timestamp}, stop_stamp => 'now()' }); # extract the number from the db response with the optional minus #$interval =~ m/([-]?\d+)\s+(day)/; #my $days = $1; #unless (defined($days)) { # $days = 0; #} return $interval; } ## @method object format_date($timestamp) # This function returns a human viewable date # @param timestamp (Enter explanation for param here) # @return (Enter explanation for return value--(Enter explanation for return value here)--here) sub format_date { my ($self, $params) = @_; my @required = qw( timestamp ); RWDE::DB::Record->check_params({ required => \@required, supplied => $params }); my @parts = split / /, $$params{timestamp}; my $time = {}; $$time{date} = $parts[0]; $$time{time} = $parts[1]; @parts = split(/-/, $$time{date}); $$time{year} = $parts[0]; $$time{month} = $parts[1]; $$time{day} = $parts[2]; return $time; } ## @method object format_qdate($timestamp) # (Enter format_qdate info here) # @param timestamp (Enter explanation for param here) # @return sub format_qdate { my ($self, $params) = @_; my @required = qw( timestamp ); RWDE::DB::Record->check_params({ required => \@required, supplied => $params }); my $time = $self->format_date({ timestamp => $$params{timestamp} }); return ("$$time{month}/$$time{day}/$$time{year}"); } ## @method object format_rfc($timestamp) # This function returns the RFC 822 formatted date - useful for rss where this is required for validation # @param timestamp (Enter explanation for param here) # @return Date sub format_rfc { my ($self, $params) = @_; my @required = qw( timestamp ); RWDE::DB::Record->check_params({ required => \@required, supplied => $params }); my $select = 'to_char(?::TIMESTAMP WITH TIME ZONE, ?)'; my @query_params = ($$params{timestamp}, 'Dy, DD Mon YYYY HH12:MI:SS TZ'); return $self->fetch_single({ select => $select, query_params => \@query_params }); } ## @method object format_human($timestamp) # This function returns an arbitrary human readable date for use on display pages # @param timestamp (Enter explanation for param here) # @return (Enter explanation for return value--(Enter explanation for return value here)--here) sub format_human { my ($self, $params) = @_; my @required = qw( timestamp ); RWDE::DB::Record->check_params({ required => \@required, supplied => $params }); my $select = 'to_char(?::TIMESTAMP WITH TIME ZONE, ?)'; my @query_params = ($$params{timestamp}, 'YYYY-MM-DD HH12:MI:SS TZ'); return $self->fetch_single({ select => $select, query_params => \@query_params }); } sub extract_dow { my ($self, $params) = @_; my @required = qw( timestamp ); RWDE::DB::Record->check_params({ required => \@required, supplied => $params }); my $select = 'EXTRACT(DOW FROM ?::timestamp)'; my @query_params = ($$params{timestamp}); return $self->fetch_single({ select => $select, query_params => \@query_params }); } #Take a timestamp from the database and make it look nice for #humans to read. mostly for Postgres which tacks on a numeric timezone. sub db_format_timestamp { my ($self, $db_timestamp) = @_; return substr $db_timestamp, 0, 19; } 1;