diff --git a/docs/changelog/6.x.x.txt b/docs/changelog/6.x.x.txt index 582d7635d..af98eb11d 100644 --- a/docs/changelog/6.x.x.txt +++ b/docs/changelog/6.x.x.txt @@ -1,7 +1,7 @@ 6.8.0 - - Switched Date::Manip to DateTime and Time::HiRes to DateTime::HiRes for - better performance and more functionality. See gotchas for details. - + - Switched Date::Manip to DateTime for better performance and more + functionality. See gotchas for details. In our benchmarks DateTime runs + about 13 times faster than Date::Manip. 6.7.7 diff --git a/docs/gotcha.txt b/docs/gotcha.txt index 26437a1aa..b78f14053 100644 --- a/docs/gotcha.txt +++ b/docs/gotcha.txt @@ -11,11 +11,17 @@ save you many hours of grief. -------------------------------------------------------------------- * Before upgrading you must install the following new Perl modules: DateTime - DateTime::HiRes + DateTime::Format::Strptime DateTime::Cron::Simple POE POE::Component::IKC::Server + * The API has changed. Check docs/migration.txt for details. + + * Due to the performance increase achieved by switching to DateTime we + no longer need date caching so the enableDateCache directive can + be removed from your config file. + 6.7.0 diff --git a/docs/migration.txt b/docs/migration.txt index 17876249d..2ed2fe0aa 100644 --- a/docs/migration.txt +++ b/docs/migration.txt @@ -481,3 +481,11 @@ by any WebGUI core package since 6.3 and wasn't really used much prior to that. If you were using it, just copy it's subs into your app. +5.22 DateTime API Changed Slightly + +In 6.8.0, as a result of migrating the DateTime API away from Date::Manip and +to DateTime we've eliminated the need for several utility functions, and +therefore removed them. This shouldn't affect almost anybody, but we're +mentioning it just in case you're using WebGUI::DateTime in an odd mannner. +They are: epochToDate, dateToEpoch, epochToArray, arrayToEpoch + diff --git a/etc/WebGUI.conf.original b/etc/WebGUI.conf.original index b2fa7a8d8..b90ba5d04 100644 --- a/etc/WebGUI.conf.original +++ b/etc/WebGUI.conf.original @@ -45,14 +45,6 @@ fileCacheSizeLimit=100000000 # memcached_servers = 10.0.0.6:11211 -# If you enable date caching you can speed up your sites a little -# bit. If you use a lot of events calendars, this is highly -# recommended. However, note that this will likely create -# several hundred megabytes of cache files that are shared -# between your various sites that have date caching enabled - -enableDateCache = 0 - # Set this to 1 to disable WebGUI's caching subsystems. This is # mainly useful for developers. diff --git a/lib/WebGUI/DateTime.pm b/lib/WebGUI/DateTime.pm index d1b068348..fc15a3274 100644 --- a/lib/WebGUI/DateTime.pm +++ b/lib/WebGUI/DateTime.pm @@ -14,7 +14,9 @@ package WebGUI::DateTime; =cut -use Date::Manip; +use DateTime; +use DateTime::Format::Strptime; +use DateTime::TimeZone; use Exporter; use strict; use WebGUI::International; @@ -39,9 +41,7 @@ This package provides easy to use date math functions, which are normally a comp use WebGUI::DateTime; $epoch = WebGUI::DateTime::addToDate($epoch, $years, $months, $days); $epoch = WebGUI::DateTime::addToTime($epoch, $hours, $minutes, $seconds); - $epoch = WebGUI::DateTime::arrayToEpoch(@date); ($startEpoch, $endEpoch) = WebGUI::DateTime::dayStartEnd($epoch); - @date = WebGUI::DateTime::epochToArray($epoch); $dateString = WebGUI::DateTime::epochToHuman($epoch, $formatString); $setString = WebGUI::DateTime::epochToSet($epoch); $day = WebGUI::DateTime::getDayName($dayInteger); @@ -50,6 +50,7 @@ This package provides easy to use date math functions, which are normally a comp $integer = WebGUI::DateTime::getFirstDayInMonthPosition($epoch); $month = WebGUI::DateTime::getMonthName($monthInteger); $seconds = WebGUI::DateTime::getSecondsFromEpoch($seconds); + $zones = WebGUI::DateTime::getTimeZones(); $epoch = WebGUI::DateTime::humanToEpoch($dateString); $seconds = WebGUI::DateTime::intervalToSeconds($interval, $units); @date = WebGUI::DateTime::localtime($epoch); @@ -66,33 +67,6 @@ These functions are available from this package: =cut -sub epochToDate { - my $secs = shift; - my ($cache, $value); - if ($session{config}{enableDateCache}) { - $cache = WebGUI::Cache->new(["epochToDate",$secs],"DateTime"); - $value = $cache->get; - } - return $value if ($value); - my $converted = &ParseDateString("epoch $secs"); - $cache->set($converted) if ($session{config}{enableDateCache}); - return $converted; -} - -sub dateToEpoch { - my $date = shift; - my ($cache, $value); - if ($session{config}{enableDateCache}) { - $cache = WebGUI::Cache->new(["dateToEpoch",$date],"DateTime"); - $value = $cache->get; - } - return $value if ($value); - my $converted = &UnixDate($date,"%s"); - $cache->set($converted) if ($session{config}{enableDateCache}); - return $converted; -} - - #------------------------------------------------------------------- @@ -119,13 +93,15 @@ The number of days to add to the epoch. =cut sub addToDate { - my ($date,$years,$months,$days,$newDate); - $date = &epochToDate(shift); - $years = shift || 0; - $months = shift || 0; - $days = shift || 0; - $newDate = DateCalc($date,"+$years:$months:0:$days:0:0:0"); - return &dateToEpoch($newDate); + my $date = DateTime->from_epoch( epoch =>shift); + my $years = shift || 0; + my $months = shift || 0; + my $days = shift || 0; + my $currentTimeZone = $date->time_zone->name; + $date->set_time_zone('UTC'); # do this to prevent date math errors due to daylight savings time shifts + $date->add(years=>$years, months=>$months, days=>$days); + $date->set_time_zone($currentTimeZone); + return $date->epoch; } #------------------------------------------------------------------- @@ -153,40 +129,14 @@ The number of seconds to add to the epoch. =cut sub addToTime { - my ($date,$hours,$mins,$secs,$newDate); - $date = &epochToDate(shift); - $hours = shift || 0; - $mins = shift || 0; - $secs = shift || 0; - $newDate = DateCalc($date,"+0:0:0:0:$hours:$mins:$secs"); - return &dateToEpoch($newDate); + my $date = DateTime->from_epoch( epoch =>shift); + my $hours = shift || 0; + my $mins = shift || 0; + my $secs = shift || 0; + $date->add(hours=>$hours, minutes=>$mins, seconds=>$secs); + return $date->epoch; } -#------------------------------------------------------------------- - -=head2 arrayToEpoch ( date ) - -Returns an epoch date. - -=head3 date - -An array of the format year, month, day, hour, min, sec. - -=cut - -sub arrayToEpoch { - my $year = shift || '0000'; - my $month = shift || '00'; - my $day = shift || '00'; - my $hour = shift || '00'; - my $min = shift || '00'; - my $sec = shift || '00'; - $min = "0$min" if (length($min) == 1); - $sec = "0$sec" if (length($sec) == 1); - return &dateToEpoch(&ParseDate("$year-$month-$day $hour:$min:$sec")); -} - - #------------------------------------------------------------------- =head2 dayStartEnd ( epoch ) @@ -200,35 +150,15 @@ The number of seconds since January 1, 1970. =cut sub dayStartEnd { - my ($year,$month,$day, $hour,$min,$sec, $start, $end); - ($year,$month,$day, $hour,$min,$sec) = epochToArray($_[0]); - $start = &arrayToEpoch($year,$month,$day,0,0,0); - $end = &arrayToEpoch($year,$month,$day,23,59,59); - return ($start, $end); -} - -#------------------------------------------------------------------- - -=head2 epochToArray ( epoch ) - -Returns a date array in the form of year, month, day, hour, min, sec. - -=head3 epoch - -An epoch date. - -=cut - -sub epochToArray { - my $epoch = shift; - my @date = &UnixDate(epochToDate($epoch),'%Y','%m','%d','%H','%M','%S'); - $date[0] = $date[0]+0; - $date[1] = $date[1]+0; - $date[2] = $date[2]+0; - $date[3] = $date[3]+0; - $date[4] = $date[4]+0; - $date[5] = $date[5]+0; - return @date; + my $dt = DateTime->from_epoch( epoch => shift); + my $end = $dt->clone; + $dt->set_hour(0); + $dt->set_minute(0); + $dt->set_second(0); + $end->set_hour(23); + $end->set_minute(59); + $end->set_second(59); + return ($dt->epoch, $end->epoch); } @@ -248,7 +178,7 @@ A string representing the output format for the date. Defaults to '%z %Z'. You c %% = % (percent) symbol. %c = The calendar month name. - %C = The calendar month name abbreviated to 3 characters and represented in English. + %C = The calendar month name abbreviated. %d = A two digit day. %D = A variable digit day. %h = A two digit hour (on a 12 hour clock). @@ -258,13 +188,12 @@ A string representing the output format for the date. Defaults to '%z %Z'. You c %m = A two digit month. %M = A variable digit month. %n = A two digit minute. - %o = Offset from local time represented as an integer. - %O = Offset from GMT represented in four digit form with a sign. Example: -0600 + %O = Offset from GMT/UTC represented in four digit form with a sign. Example: -0600 %p = A lower-case am/pm. %P = An upper-case AM/PM. %s = A two digit second. %w = Day of the week. - %W = Day of the week abbreviated to 3 characters and represented in English. + %W = Day of the week abbreviated. %y = A four digit year. %Y = A two digit year. %z = The current user's date format preference. @@ -273,85 +202,50 @@ A string representing the output format for the date. Defaults to '%z %Z'. You c =cut sub epochToHuman { - my ($offset, $temp, $hour12, $value, $output); - $offset = $session{user}{timeOffset} || 0; - $offset = $offset*3600; - $temp = int($_[0]) || WebGUI::DateTime::time(); - $temp = $temp+$offset; - my $dt = epochToDate($temp); - my ($year,$month,$day,$hour,$min,$sec) = epochToArray($temp); - $output = $_[1] || "%z %Z"; - #---GMT Offsets - if ($output =~ /\%O/) { - $temp = $session{user}{timeOffset}*100; - $temp = sprintf("%+05d",Date::Manip::UnixDate("now","%z")+$temp); - $output =~ s/\%O/$temp/g; - } - $temp = $session{user}{timeOffset}+0; - $output =~ s/\%o/$temp/g; - #---dealing with percent symbol - $output =~ s/\%\%/\%/g; + my $language = WebGUI::International::get($session{user}{language}); + my $locale = $language->{languageAbbreviation} || "en"; + $locale .= "_".$language->{locale} if ($language->{locale}); + my $dt = DateTime->from_epoch( epoch=>shift||time(), time_zone=>$session{user}{timeZone}, locale=>$locale ); + my $output = shift || "%z %Z"; + my $temp; #---date format preference $temp = $session{user}{dateFormat} || '%M/%D/%y'; $output =~ s/\%z/$temp/g; #---time format preference $temp = $session{user}{timeFormat} || '%H:%n %p'; $output =~ s/\%Z/$temp/g; - #---year stuff - $output =~ s/\%y/$year/g; - $value = substr($year,2,2); - $output =~ s/\%Y/$value/g; - #---month stuff - $value = sprintf("%02d",$month); - $output =~ s/\%m/$value/g; - $output =~ s/\%M/$month/g; - if ($output =~ /\%c/) { - $temp = getMonthName($month); - $output =~ s/\%c/$temp/g; + #--- convert WebGUI date formats to DateTime formats + my %conversion = ( + "c" => "B", + "C" => "b", + "d" => "d", + "D" => "e", + "h" => "I", + "H" => "l", + "j" => "H", + "J" => "k", + "m" => "m", + "M" => "_varmonth_", + "n" => "M", + "O" => "z", + "p" => "P", + "P" => "p", + "s" => "S", + "w" => "A", + "W" => "a", + "y" => "Y", + "Y" => "y" + ); + $output =~ s/\%(\w)/\~$1/g; + foreach my $key (keys %conversion) { + my $replacement = $conversion{$key}; + $output =~ s/\~$key/\%$replacement/g; } - if ($output =~ /\%C/) { - $temp = &UnixDate($dt,'%b'); - $output =~ s/\%C/$temp/g; - } - #---day stuff - $value = sprintf("%02d",$day); - $output =~ s/\%d/$value/g; - $output =~ s/\%D/$day/g; - if ($output =~ /\%w/) { - $temp = getDayName(&UnixDate($dt,'%w')); - $output =~ s/\%w/$temp/g; - } - if ($output =~ /%W/) { - $temp = &UnixDate($dt,'%a'); - $output =~ s/\%W/$temp/g; - } - #---hour stuff - $hour12 = $hour; - if ($hour12 > 12) { - $hour12 = $hour12 - 12; - } - if ($hour12 == 0) { - $hour12 = 12; - } - $value = sprintf("%02d",$hour12); - $output =~ s/\%h/$value/g; - $output =~ s/\%H/$hour12/g; - $value = sprintf("%02d",$hour); - $output =~ s/\%j/$value/g; - $output =~ s/\%J/$hour/g; - if ($hour > 11) { - $output =~ s/\%p/pm/g; - $output =~ s/\%P/PM/g; - } else { - $output =~ s/\%p/am/g; - $output =~ s/\%P/AM/g; - } - #---minute stuff - $value = sprintf("%02d",$min); - $output =~ s/\%n/$value/g; - #---second stuff - $value = sprintf("%02d",$sec); - $output =~ s/\%s/$value/g; + #--- %M + $output = $dt->strftime($output); + $temp = int($dt->month); + $output =~ s/\%_varmonth_/$temp/g; + #--- return return $output; } @@ -372,50 +266,12 @@ A boolean indicating that the time should be added to the output, thust turning =cut sub epochToSet { - if ($_[1]) { - return epochToHuman($_[0],"%y-%m-%d %j:%n:%s"); + my $dt = DateTime->from_epoch( epoch =>shift, time_zone=>$session{user}{timeZone}); + my $withTime = shift; + if ($withTime) { + return $dt->strftime("%Y-%m-%d %H:%M:%S"); } - return epochToHuman($_[0],"%y-%m-%d"); -} - -#------------------------------------------------------------------- - -=head2 getMonthName ( month ) - -Returns a string containing the calendar month name in the language of the current user. - -=head3 month - -An integer ranging from 1-12 representing the month. - -=cut - -sub getMonthName { - if ($_[0] == 1) { - return WebGUI::International::get(15); - } elsif ($_[0] == 2) { - return WebGUI::International::get(16); - } elsif ($_[0] == 3) { - return WebGUI::International::get(17); - } elsif ($_[0] == 4) { - return WebGUI::International::get(18); - } elsif ($_[0] == 5) { - return WebGUI::International::get(19); - } elsif ($_[0] == 6) { - return WebGUI::International::get(20); - } elsif ($_[0] == 7) { - return WebGUI::International::get(21); - } elsif ($_[0] == 8) { - return WebGUI::International::get(22); - } elsif ($_[0] == 9) { - return WebGUI::International::get(23); - } elsif ($_[0] == 10) { - return WebGUI::International::get(24); - } elsif ($_[0] == 11) { - return WebGUI::International::get(25); - } elsif ($_[0] == 12) { - return WebGUI::International::get(26); - } + return $dt->strftime("%Y-%m-%d"); } #------------------------------------------------------------------- @@ -433,19 +289,19 @@ An integer ranging from 1-7 representing the day of the week (Sunday is 1 and Sa sub getDayName { my $day = $_[0]; if ($day == 7) { - return WebGUI::International::get(27); + return WebGUI::International::get('sunday','DateTime'); } elsif ($day == 1) { - return WebGUI::International::get(28); + return WebGUI::International::get('monday','DateTime'); } elsif ($day == 2) { - return WebGUI::International::get(29); + return WebGUI::International::get('tuesday','DateTime'); } elsif ($day == 3) { - return WebGUI::International::get(30); + return WebGUI::International::get('wednesday','DateTime'); } elsif ($day == 4) { - return WebGUI::International::get(31); + return WebGUI::International::get('thursday','DateTime'); } elsif ($day == 5) { - return WebGUI::International::get(32); + return WebGUI::International::get('friday','DateTime'); } elsif ($day == 6) { - return WebGUI::International::get(33); + return WebGUI::International::get('saturday','DateTime'); } } @@ -462,9 +318,9 @@ An epoch date. =cut sub getDaysInMonth { - my $epoch = shift; - my @date = WebGUI::DateTime::epochToArray($epoch); - return &Date_DaysInMonth($date[1], $date[0]); + my $dt = DateTime->from_epoch( epoch =>shift); + my $last = DateTime->last_day_of_month(year=>$dt->year, month=>$dt->month); + return $last->day; } @@ -485,20 +341,18 @@ An epoch date. =cut sub getDaysInInterval { - my $start = &epochToDate(shift); - my $end = &epochToDate(shift); - my $err; - my $delta = &DateCalc($start,$end,\$err); - return &Delta_Format($delta,0,'%dh'); + my $start = DateTime->from_epoch( epoch =>shift); + my $end = DateTime->from_epoch( epoch =>shift); + my $duration = $end - $start; + return $duration->delta_days; } - #------------------------------------------------------------------- =head2 getFirstDayInMonthPosition ( epoch) { -Returns the position (1 - 7) of the first day in the month. +Returns the position (1 - 7) of the first day in the month. 1 is Monday. =head3 epoch @@ -507,19 +361,52 @@ An epoch date. =cut sub getFirstDayInMonthPosition { - my $epoch = shift; - my @date = WebGUI::DateTime::epochToArray($epoch); - my $firstDayInFirstWeek = &UnixDate("$date[0]-$date[1]-01",'%w'); - unless ($session{user}{firstDayOfWeek}) { #american format - $firstDayInFirstWeek++; - if ($firstDayInFirstWeek > 7) { - $firstDayInFirstWeek = 1; - } - } - return $firstDayInFirstWeek; + my $dt = DateTime->from_epoch( epoch => shift ); + $dt->set_day(1); + return $dt->day_of_week; } +#------------------------------------------------------------------- + +=head2 getMonthName ( month ) + +Returns a string containing the calendar month name in the language of the current user. + +=head3 month + +An integer ranging from 1-12 representing the month. + +=cut + +sub getMonthName { + if ($_[0] == 1) { + return WebGUI::International::get('january','DateTime'); + } elsif ($_[0] == 2) { + return WebGUI::International::get('february','DateTime'); + } elsif ($_[0] == 3) { + return WebGUI::International::get('march','DateTime'); + } elsif ($_[0] == 4) { + return WebGUI::International::get('april','DateTime'); + } elsif ($_[0] == 5) { + return WebGUI::International::get('may','DateTime'); + } elsif ($_[0] == 6) { + return WebGUI::International::get('june','DateTime'); + } elsif ($_[0] == 7) { + return WebGUI::International::get('july','DateTime'); + } elsif ($_[0] == 8) { + return WebGUI::International::get('august','DateTime'); + } elsif ($_[0] == 9) { + return WebGUI::International::get('september','DateTime'); + } elsif ($_[0] == 10) { + return WebGUI::International::get('october','DateTime'); + } elsif ($_[0] == 11) { + return WebGUI::International::get('november','DateTime'); + } elsif ($_[0] == 12) { + return WebGUI::International::get('december','DateTime'); + } +} + #------------------------------------------------------------------- =head2 getSecondsFromEpoch ( epoch ) @@ -533,10 +420,34 @@ The number of seconds since January 1, 1970 00:00:00. =cut sub getSecondsFromEpoch { - return timeToSeconds(epochToHuman($_[0],"%j:%n:%s")); + my $dt = DateTime->from_epoch( epoch => shift ); + my $start = $dt->clone; + $start->set_hour(0); + $start->set_minute(0); + $start->set_second(0); + my $duration = $dt - $start; + return $duration->delta_seconds; } +#------------------------------------------------------------------- + +=head2 getTimeZones ( ) + +Returns a hash reference containing name/value pairs both with the list of time zones. + +=cut + +sub getTimeZones { + my %zones; + foreach my $zone (@{DateTime::TimeZone::all_names()}) { + my $zoneLabel = $zone; + $zoneLabel =~ s/\_/ /g; + $zones{$zone} = $zoneLabel; + } + return \%zones; +} + #------------------------------------------------------------------- @@ -551,18 +462,11 @@ The human date string. YYYY-MM-DD HH:MM:SS =cut sub humanToEpoch { - my (@temp, $dateString, $timeString, $output, @date); - ($dateString,$timeString) = split(/ /,$_[0]); - @temp = split(/-/,$dateString); - $date[0] = int($temp[0]); - $date[1] = int($temp[1]); - $date[2] = int($temp[2]); - @temp = split(/:/,$timeString); - $date[3] = int($temp[0]); - $date[4] = int($temp[1]); - $date[5] = int($temp[2]); - $output = arrayToEpoch(@date); - return $output; + my ($dateString,$timeString) = split(/ /,shift); + my @date = split(/-/,$dateString); + my @time = split(/:/,$timeString); + my $dt = DateTime->new(year => $date[0], month=> $date[1], day=> $date[2], hour=> $time[0], minute => $time[1], second => $time[2]); + return $dt->epoch; } #------------------------------------------------------------------- @@ -582,20 +486,22 @@ A string which represents the units of the interval. The string must be 'years', =cut sub intervalToSeconds { - if ($_[1] eq "years") { - return ($_[0]*31536000); - } elsif ($_[1] eq "months") { - return ($_[0]*2592000); - } elsif ($_[1] eq "weeks") { - return ($_[0]*604800); - } elsif ($_[1] eq "days") { - return ($_[0]*86400); - } elsif ($_[1] eq "hours") { - return ($_[0]*3600); - } elsif ($_[1] eq "minutes") { - return ($_[0]*60); + my $interval = shift; + my $units = shift; + if ($units eq "years") { + return ($interval*31536000); + } elsif ($units eq "months") { + return ($interval*2592000); + } elsif ($units eq "weeks") { + return ($interval*604800); + } elsif ($units eq "days") { + return ($interval*86400); + } elsif ($units eq "hours") { + return ($interval*3600); + } elsif ($units eq "minutes") { + return ($interval*60); } else { - return $_[0]; + return $interval; } } @@ -612,16 +518,8 @@ The number of seconds since January 1, 1970. Defaults to now. =cut sub localtime { - my $epoch = shift || &dateToEpoch(&ParseDate("today")); - my $date = &epochToDate($epoch); - my ($year, $month, $day, $hour, $min, $sec) = epochToArray($epoch); - if ($epoch) { - ($year, $month, $day, $hour, $min, $sec) = epochToArray($epoch); - } - my $doy = &UnixDate($date,'%j'); - my $dow = &UnixDate($date,'%w'); - my @temp = localtime($epoch); - return ($year, $month, $day, $hour, $min, $sec, $doy, $dow, $temp[8]); + my $dt = DateTime->from_epoch( epoch => shift || time() ); + return ( $dt->year, $dt->month, $dt->day, $dt->hour, $dt->minute, $dt->second, $dt->day_of_year, $dt->day_of_week, $dt->is_dst ); } #------------------------------------------------------------------- @@ -640,12 +538,10 @@ An epoch datestamp corresponding to the last month. =cut sub monthCount { - my $start = &epochToDate(shift); - my $end = &epochToDate(shift); - my $err; - my $delta = &DateCalc($start,$end,\$err,1); - my $count = 1+&Delta_Format($delta,0,'%Mv')+&Delta_Format($delta,0,'%yv')*12; - return $count; + my $start = DateTime->from_epoch( epoch => shift ); + my $end = DateTime->from_epoch( epoch => shift ); + my $duration = $end - $start; + return $duration->delta_months; } @@ -662,11 +558,15 @@ The number of seconds since January 1, 1970. =cut sub monthStartEnd { - my ($year,$month,$day, $hour,$min,$sec, $start, $end); - ($year,$month,$day, $hour,$min,$sec) = epochToArray($_[0]); - $start = &arrayToEpoch($year,$month,1,0,0,0) + 0; - $end = &UnixDate(&DateCalc(&epochToDate($start), "+1 month"),'%s')-1; - return ($start, $end); + my $dt = DateTime->from_epoch( epoch => shift); + my $end = DateTime->last_day_of_month(year=>$dt->year, month=>$dt->month); + $dt->set_hour(0); + $dt->set_minute(0); + $dt->set_second(0); + $end->set_hour(23); + $end->set_minute(59); + $end->set_second(59); + return ($dt->epoch, $end->epoch); } #------------------------------------------------------------------- @@ -682,27 +582,28 @@ The number of seconds in the interval. =cut sub secondsToInterval { + my $seconds = shift; my ($interval, $units); - if ($_[0] >= 31536000) { - $interval = round($_[0]/31536000); + if ($seconds >= 31536000) { + $interval = round($seconds/31536000); $units = "years"; - } elsif ($_[0] >= 2592000) { - $interval = round($_[0]/2592000); + } elsif ($seconds >= 2592000) { + $interval = round($seconds/2592000); $units = "months"; - } elsif ($_[0] >= 604800) { - $interval = round($_[0]/604800); + } elsif ($seconds >= 604800) { + $interval = round($seconds/604800); $units = "weeks"; - } elsif ($_[0] >= 86400) { - $interval = round($_[0]/86400); + } elsif ($seconds >= 86400) { + $interval = round($seconds/86400); $units = "days"; - } elsif ($_[0] >= 3600) { - $interval = round($_[0]/3600); + } elsif ($seconds >= 3600) { + $interval = round($seconds/3600); $units = "hours"; - } elsif ($_[0] >= 60) { - $interval = round($_[0]/60); + } elsif ($seconds >= 60) { + $interval = round($seconds/60); $units = "minutes"; } else { - $interval = $_[0]; + $interval = $seconds; $units = "seconds"; } return ($interval, $units); @@ -721,7 +622,7 @@ A number of seconds. =cut sub secondsToTime { - my $seconds = $_[0]; + my $seconds = shift; my $timeString = sprintf("%02d",int($seconds / 3600)).":"; $seconds = $seconds % 3600; $timeString .= sprintf("%02d",int($seconds / 60)).":"; @@ -745,31 +646,13 @@ A string in the format of YYYY-MM-DD or YYYY-MM-DD HH:MM:SS. sub setToEpoch { my $set = shift; - my @now = epochToArray(WebGUI::DateTime::time()); - my ($date,$time) = split(/ /,$set); - my ($year, $month, $day) = split(/\-/,$date); - my ($hour, $minute, $second) = split(/\:/,$time); - if (int($year) < 3000 && int($year) > 1000) { - $year = int($year); - } else { - $year = $now[0]; - } - if (int($month) < 13 && int($month) > 0) { - $month = int($month); - } else { - $month = $now[1]++; - } - if (int($day) < 32 && int($day) > 0) { - $day = int($day); - } else { - $day = $now[2]; - } - my $epoch = arrayToEpoch($year,$month,$day,$hour,$minute,$second); - # in epochToSet we use epochToHuman, which includes the time - # offset of the user, so we need to remove that here. - my $offset = $session{user}{timeOffset} || 0; - $epoch -= $offset*3600; - return $epoch; + my $parser = DateTime::Format::Strptime->new( pattern => '%Y-%m-%d %H:%M:%S' ); + my $dt = $parser->parse_datetime($set); + # in epochToSet we apply the user's time zone, so now we have to remove it. + $dt->set_time_zone($session{user}{timeZone}); # assign the user's timezone + my $u = WebGUI::User->new(1); + $dt->set_time_zone($u->profileField("timeZone")); # convert to the visitor's or default time zone + return $dt->epoch; } #------------------------------------------------------------------- @@ -781,8 +664,7 @@ Returns an epoch date for now. =cut sub time { - #return dateToEpoch(&ParseDate("now")); - return time; + return time(); } #------------------------------------------------------------------- @@ -799,7 +681,7 @@ A string that looks similar to this: 15:05:32 sub timeToSeconds { my ($hour,$min,$sec) = split(/:/,$_[0]); - return ($hour*3600+$min*60+$sec); + return ($hour*60*60+$min*60+$sec); } diff --git a/lib/WebGUI/Form/SelectList.pm b/lib/WebGUI/Form/SelectList.pm index c18dd8a4a..5e9794449 100644 --- a/lib/WebGUI/Form/SelectList.pm +++ b/lib/WebGUI/Form/SelectList.pm @@ -22,7 +22,7 @@ use WebGUI::Session; =head1 NAME -Package WebGUI::Form::selectList +Package WebGUI::Form::SelectList =head1 DESCRIPTION diff --git a/lib/WebGUI/Operation/ProfileSettings.pm b/lib/WebGUI/Operation/ProfileSettings.pm index 31d0d2a97..cad0266d4 100644 --- a/lib/WebGUI/Operation/ProfileSettings.pm +++ b/lib/WebGUI/Operation/ProfileSettings.pm @@ -218,7 +218,7 @@ sub www_editProfileField { -hoverHelp=>WebGUI::International::get('486 description',"WebGUIProfile"), -value=>$data{dataType}, -defaultValue=>"text", - -types=>[qw(dateTime TimeField float zipcode text textarea HTMLArea url date email phone integer yesNo selectList radioList checkList)] + -types=>[qw(dateTime timeZone TimeField float zipcode text textarea HTMLArea url date email phone integer yesNo selectList radioList checkList)] ); $f->textarea( -name => "dataValues", diff --git a/lib/WebGUI/i18n/English.pm b/lib/WebGUI/i18n/English.pm index 46aa805b9..bd7f2e10e 100644 --- a/lib/WebGUI/i18n/English.pm +++ b/lib/WebGUI/i18n/English.pm @@ -6,8 +6,8 @@ use strict; our $LANGUAGE = { label => 'English', toolbar => 'metal', - languageAbbreviation => 'en', - locale => 'US' + languageAbbreviation => 'en', # used by plugins such as javascript helpers and third-party perl modules + locale => 'US' # same as above }; sub makeUrlCompliant { diff --git a/lib/WebGUI/i18n/English/WebGUI.pm b/lib/WebGUI/i18n/English/WebGUI.pm index e5249e16c..931766fa1 100644 --- a/lib/WebGUI/i18n/English/WebGUI.pm +++ b/lib/WebGUI/i18n/English/WebGUI.pm @@ -41,11 +41,6 @@ our $I18N = { lastUpdated => 1031514049 }, - '32' => { - message => q|Friday|, - lastUpdated => 1031514049 - }, - '443' => { message => q|Home Information|, lastUpdated => 1031514049 @@ -127,11 +122,6 @@ our $I18N = { lastUpdated => 1065356764 }, - '31' => { - message => q|Thursday|, - lastUpdated => 1031514049 - }, - '578' => { message => q|You have a pending message to approve.|, lastUpdated => 1031514049 @@ -167,11 +157,6 @@ our $I18N = { lastUpdated => 1031514049 }, - '29' => { - message => q|Tuesday|, - lastUpdated => 1031514049 - }, - '889' => { message => q|Style Sheets, Tabs|, lastUpdated => 1046067380 @@ -202,11 +187,6 @@ our $I18N = { lastUpdated => 1031514049 }, - '15' => { - message => q|January|, - lastUpdated => 1031514049 - }, - '527' => { message => q|Default Home Page|, lastUpdated => 1031514049 @@ -317,11 +297,6 @@ our $I18N = { lastUpdated => 1056151382 }, - '23' => { - message => q|September|, - lastUpdated => 1031514049 - }, - '364' => { message => q|Search|, lastUpdated => 1031514049 @@ -397,11 +372,6 @@ Be aware that any database links you create here will be available to all conten lastUpdated => 1035246389 }, - '21' => { - message => q|July|, - lastUpdated => 1031514049 - }, - '523' => { message => q|Notification|, lastUpdated => 1031514049 @@ -718,11 +688,6 @@ to add or remove user from their groups. lastUpdated => 1037583186 }, - '22' => { - message => q|August|, - lastUpdated => 1031514049 - }, - '42' => { message => q|Please Confirm|, lastUpdated => 1031514049 @@ -788,11 +753,6 @@ to add or remove user from their groups. lastUpdated => 1031514049 }, - '27' => { - message => q|Sunday|, - lastUpdated => 1031514049 - }, - '161' => { message => q|Submitted By|, lastUpdated => 1031514049 @@ -823,11 +783,6 @@ to add or remove user from their groups. lastUpdated => 1035864828 }, - '20' => { - message => q|June|, - lastUpdated => 1031514049 - }, - '1011' => { message => q|Code|, lastUpdated => 1060433339 @@ -938,11 +893,6 @@ That particular example will help you get good ranking on search engines. lastUpdated => 1031514049 }, - '17' => { - message => q|March|, - lastUpdated => 1031514049 - }, - '333' => { message => q|Work Country|, lastUpdated => 1031514049 @@ -1044,11 +994,6 @@ removed from the system after a set period of time. That period of time is set lastUpdated => 1031514049 }, - '33' => { - message => q|Saturday|, - lastUpdated => 1031514049 - }, - '660' => { message => q|Groups, Manage|, lastUpdated => 1031514049 @@ -1064,11 +1009,6 @@ removed from the system after a set period of time. That period of time is set lastUpdated => 1031514049 }, - '26' => { - message => q|December|, - lastUpdated => 1031514049 - }, - '977' => { message => q|Is secondary admin?|, lastUpdated => 1053803387 @@ -1417,11 +1357,6 @@ The Groups page displays all groups that you are allowed to edit. The form on t lastUpdated => 1057208065 }, - '28' => { - message => q|Monday|, - lastUpdated => 1031514049 - }, - '40' => { message => q|Vital Component|, lastUpdated => 1031514049 @@ -1602,11 +1537,6 @@ As with any delete operation, you are prompted to be sure you wish to proceed wi lastUpdated => 1033836642 }, - '16' => { - message => q|February|, - lastUpdated => 1031514049 - }, - '1069' => { message => q|Host To Use|, lastUpdated => 1066641432 @@ -1899,11 +1829,6 @@ This group could then be named "Employees in HMO 1", and would allow you to rest lastUpdated => 1053278089 }, - '24' => { - message => q|October|, - lastUpdated => 1031514049 - }, - '858' => { message => q|Alias|, lastUpdated => 1043879848 @@ -2437,11 +2362,6 @@ A list of links to the 10 nearest in the paginator relative to the current page. lastUpdated => 1031514049 }, - '25' => { - message => q|November|, - lastUpdated => 1031514049 - }, - '738' => { message => q|9 Guru|, lastUpdated => 1033836704 @@ -2664,11 +2584,6 @@ As with any delete operation, you are prompted to be sure you wish to proceed wi lastUpdated => 1031514049 }, - '18' => { - message => q|April|, - lastUpdated => 1031514049 - }, - '125' => { message => q|Company Name|, lastUpdated => 1031514049 @@ -3130,11 +3045,6 @@ that Asset and all Assets below it.

lastUpdated => 1031514049 }, - '19' => { - message => q|May|, - lastUpdated => 1031514049 - }, - '54' => { message => q|Create Account|, lastUpdated => 1031514049 @@ -3180,11 +3090,6 @@ that Asset and all Assets below it.

lastUpdated => 1031514049 }, - '30' => { - message => q|Wednesday|, - lastUpdated => 1031514049 - }, - '403' => { message => q|Prefer not to say.|, lastUpdated => 1031514049 diff --git a/sbin/preload.perl b/sbin/preload.perl index 77cfc1d94..df1ca55e5 100644 --- a/sbin/preload.perl +++ b/sbin/preload.perl @@ -44,22 +44,23 @@ use Net::SMTP (); use Log::Log4perl (); use Tie::IxHash (); use Tie::CPHash (); +use Time::HiRes (); use DateTime (); -use DateTime::HiRes (); +use DateTime::Format::Strptime (); +use DateTime::TimeZone (); use Image::Magick (); use Storable; use XML::Simple (); +use Compress::Zlib (); +use Archive::Tar (); +use IO::Zlib (); #### # less commonly used so you may not want them to load into memory ### -#use Compress::Zlib (); # used only by themes -#use Archive::Tar (); # used only by themes -#use IO::Zlib (); # used only by themes #use SOAP::Lite (); # used only by WS Client #use Net::LDAP (); # used only by LDAP authentication module #use XML::RSSLite (); # used only by syndicated content wobject -#use DBIx::FullTextSearch (); #used only by search engine #use HTML::Highlight (); # used only by search engine @@ -139,6 +140,7 @@ use WebGUI::i18n::English::Asset_Navigation (); #use WebGUI::i18n::English::AuthLDAP (); use WebGUI::i18n::English::AuthWebGUI (); use WebGUI::i18n::English::WebGUI (); +use WebGUI::i18n::English::DateTime (); use WebGUI::i18n::English::WebGUIProfile (); # you can significantly reduce your memory usage by preloading the plugins used on your sites, only the most commonly used ones are preloaded by default @@ -156,9 +158,7 @@ use WebGUI::Asset::Wobject::Collaboration (); # auth methods use WebGUI::Auth::WebGUI (); - -#use Net::LDAP (); # used by ldap authentication -use WebGUI::Auth::LDAP (); +#use WebGUI::Auth::LDAP (); # macros use WebGUI::Macro::AdminBar (); diff --git a/sbin/testEnvironment.pl b/sbin/testEnvironment.pl index ac1f86b61..5663bcba8 100644 --- a/sbin/testEnvironment.pl +++ b/sbin/testEnvironment.pl @@ -58,7 +58,8 @@ checkModule("Tie::CPHash",1.001); checkModule("XML::Simple",2.09); checkModule("SOAP::Lite",0.60); checkModule("DateTime",0.2901); -checkModule("DateTime::HiRes",0.01); +checkModule("Time::HiRes",1.38); +checkModule("DateTime::Format::Strptime"); checkModule("DateTime::Cron::Simple",0.2); checkModule("Image::Magick",5.47,1); checkModule("Log::Log4perl",0.51);