root/trunk/lib/SGL/Date.php

Revision 2162, 16.0 kB (checked in by demian, 1 year ago)

applied rm-style german date patch, fixes #1027

  • Property svn:eol-style set to native
Line 
1 <?php
2 /* Reminder: always indent with 4 spaces (no tabs). */
3 // +---------------------------------------------------------------------------+
4 // | Copyright (c) 2006, Demian Turner                                         |
5 // | All rights reserved.                                                      |
6 // |                                                                           |
7 // | Redistribution and use in source and binary forms, with or without        |
8 // | modification, are permitted provided that the following conditions        |
9 // | are met:                                                                  |
10 // |                                                                           |
11 // | o Redistributions of source code must retain the above copyright          |
12 // |   notice, this list of conditions and the following disclaimer.           |
13 // | o Redistributions in binary form must reproduce the above copyright       |
14 // |   notice, this list of conditions and the following disclaimer in the     |
15 // |   documentation and/or other materials provided with the distribution.    |
16 // | o The names of the authors may not be used to endorse or promote          |
17 // |   products derived from this software without specific prior written      |
18 // |   permission.                                                             |
19 // |                                                                           |
20 // | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS       |
21 // | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT         |
22 // | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR     |
23 // | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT      |
24 // | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,     |
25 // | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT          |
26 // | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,     |
27 // | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY     |
28 // | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT       |
29 // | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE     |
30 // | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.      |
31 // |                                                                           |
32 // +---------------------------------------------------------------------------+
33 // | Seagull 0.6                                                               |
34 // +---------------------------------------------------------------------------+
35 // | Date.php                                                                  |
36 // +---------------------------------------------------------------------------+
37 // | Author:   Demian Turner <demian@phpkitchen.com>                           |
38 // +---------------------------------------------------------------------------+
39
40 /**
41  * Provides various date formatting methods.
42  *
43  * @package SGL
44  * @author  Demian Turner <demian@phpkitchen.com>
45  * @version $Revision: 1.14 $
46  */
47 class SGL_Date
48 {
49     /**
50      * Returns current time in YYYY-MM-DD HH:MM:SS format.
51      *
52      * GMT format is best for logging system events, otherwise locale offset
53      * will be most helpful to users.
54      *
55      * @access public
56      * @static
57      * @param boolean $gmt       is time GMT or locale offset
58      * @return string $instance  formatted current time
59      * @todo factor out Cache and Lang methods into their own objects
60      */
61     function getTime($gmt = false)
62     {
63         //  no logMessage allowed here
64         static $instance;
65         if (!isset($instance)) {
66             $instance = ($gmt)  ? gmstrftime("%Y-%m-%d %H:%M:%S", time())
67                                 : strftime("%Y-%m-%d %H:%M:%S", time());
68         }
69         return $instance;
70     }
71
72     /**
73      * Converts date array into MySQL datetime format.
74      *
75      * @access  public
76      * @param   array   $aDate
77      * @return  string  MySQL datetime format
78      * @see     publisher::ArticleMgr::process/edit
79      */
80     function arrayToString($aDate)
81     {
82         SGL::logMessage(null, PEAR_LOG_DEBUG);
83         if (is_array($aDate)) {
84             $month  = $aDate['month'];
85             $day    = $aDate['day'];
86             $year   = $aDate['year'];
87             $hour   = (array_key_exists('hour',$aDate))? $aDate['hour'] : '00';
88             $minute = (array_key_exists('minute',$aDate))? $aDate['minute'] : '00';
89             $second = (array_key_exists('second',$aDate))? $aDate['second'] : '00';
90
91             if (empty($month) && empty($year) && empty($day)) {
92                 return null;
93             } else {
94                 return $year . '-' . $month . '-' . $day .' ' . $hour . ':' . $minute . ':' . $second;
95             }
96         }
97     }
98
99     /**
100      * Converts date into date array.
101      *
102      * @access  public
103      * @param   string  $sDate date (may be in the ISO, TIMESTAMP or UNIXTIME format) format
104      * @return  array   $aDate
105      * @see     publisher::ArticleMgr::process/edit
106      */
107     function stringToArray($sDate)
108     {
109         SGL::logMessage(null, PEAR_LOG_DEBUG);
110         if (is_scalar($sDate)) {
111             require_once 'Date.php';
112             $date = & new Date($sDate);
113             $aDate =      array('day'    => $date->getDay(),
114                                 'month'  => $date->getMonth(),
115                                 'year'   => $date->getYear(),
116                                 'hour'   => $date->getHour(),
117                                 'minute' => $date->getMinute(),
118                                 'second' => $date->getSecond());
119             return $aDate;
120         }
121     }
122
123     /**
124      * Converts date (may be in the ISO, TIMESTAMP or UNIXTIME format) into "Mar 31, 2003 18:29".
125      *
126      * @access  public
127      * @param   string  $date  Date (may be in the ISO, TIMESTAMP or UNIXTIME format) value
128      * @return  string  $formatted  user-friendly format (european)
129      */
130     function formatPretty($date)
131     {
132         if (is_string($date)) {
133             require_once 'Date.php';
134             $date = & new Date($date);
135             if ($_SESSION['aPrefs']['dateFormat'] == 'FR') {
136                 $output = $date->format('%d %B %Y, %H:%M');
137
138             } elseif ($_SESSION['aPrefs']['dateFormat'] == 'BR') {
139                 // Brazilian date format
140                 $output = $date->format('%d de %B de %Y %H:%M');
141
142             } elseif ($_SESSION['aPrefs']['dateFormat'] == 'DE') {
143                 // German date format
144                 $output = $date->format('%d. %B %Y %H:%M');
145
146             } else {
147                 //  else UK and US
148                 $output = $date->format('%B %d, %Y %H:%M');
149             }
150             return $output;
151         } else {
152             SGL::raiseError('no input date passed to SGL_Date::formatPretty incorrect type',
153                 SGL_ERROR_INVALIDARGS);
154         }
155     }
156
157     /**
158      * Converts date (may be in the ISO, TIMESTAMP or UNIXTIME format) into locale dependent form.
159      *
160      * @access  public
161      * @param   string  $input  date (may be in the ISO, TIMESTAMP or UNIXTIME format) value
162      * @return  string  $output user-friendly format (locale dependent)
163      */
164     function format($date)
165     {
166         if (is_string($date)) {
167             include_once 'Date.php';
168             $date = & new Date($date);
169             // Neither elegant nor efficient way of doing that
170             // (what if we have 30 formats/locales?).
171             // We should move that to a language/locale dependent file.
172             if ($_SESSION['aPrefs']['dateFormat'] == 'UK') {
173                 $output = $date->format('%d.%m.%Y');
174             } elseif ($_SESSION['aPrefs']['dateFormat'] == 'BR'
175                      || $_SESSION['aPrefs']['dateFormat'] == 'FR') {
176                 // Brazilian/French date format
177                 $output = $date->format('%d/%m/%Y');
178             } elseif ($_SESSION['aPrefs']['dateFormat'] == 'US') {
179                 $output = $date->format('%m.%d.%Y');
180             } elseif ($_SESSION['aPrefs']['dateFormat'] == 'DE') {
181                 $output = $date->format('%d.%m.%Y');
182             } else {
183                 //  else display ISO (international, unambiguous) format, YYYY-MM-DD
184                 $output = $date->format('%Y-%m-%d');
185             }
186             return $output;
187         } else {
188             SGL::raiseError('no input date passed to SGL_Date::format incorrect type',
189                 SGL_ERROR_INVALIDARGS);
190         }
191     }
192
193     /**
194      * Gets appropriate date format
195      *
196      * @access  public
197      * @return  string  $date template (e.g. "%d %B %Y, %H:%M" for FR date format)
198      */
199     function getDateFormat()
200     {
201         if ($_SESSION['aPrefs']['dateFormat'] == 'UK') {
202             $dateFormat = '%d %B %Y, %H:%M';
203         } elseif ($_SESSION['aPrefs']['dateFormat'] == 'BR'
204                  || $_SESSION['aPrefs']['dateFormat'] == 'FR') {
205             // Brazilian/French date format
206             $dateFormat = '%d %B %Y, %H:%M';
207         } elseif ($_SESSION['aPrefs']['dateFormat'] == 'US') {
208             $dateFormat = '%B %d, %Y %H:%M';
209         } elseif ($_SESSION['aPrefs']['dateFormat'] == 'DE') {
210             $dateFormat = '%d.%B.%Y %H:%M';
211         } else {
212             //  else display ISO (international, unambiguous) format, YYYY-MM-DD
213             $dateFormat = '%Y-%B-%d';
214         }
215         return $dateFormat;
216     }
217
218     /**
219      * Generates a select of day values.
220      *
221      * @access  public
222      * @param   string  $selected
223      * @return  string  $day_options    select day options
224      * @see     showDateSelector()
225      */
226     function getDayFormOptions($selected = '')
227     {
228         SGL::logMessage(null, PEAR_LOG_DEBUG);
229
230         $day_options = '';
231         for ($i = 1; $i <= 31; $i++) {
232             $day_options .= "\n<option value=\"" . sprintf('%02d', $i) . '" ';
233             if ($i == $selected) {
234                 $day_options .= 'selected="selected"';
235             }
236             $day_options .= '>' . sprintf('%02d', $i) . '</option>';
237         }
238         return $day_options;
239     }
240
241     /**
242      * Generates a select of month values.
243      *
244      * @access  public
245      * @param   string  $selected
246      * @return  string  $monthOptions  select month options
247      * @see     showDateSelector()
248      */
249     function getMonthFormOptions($selected = '')
250     {
251         SGL::logMessage(null, PEAR_LOG_DEBUG);
252
253         $aMonths = SGL_String::translate('aMonths');
254         $monthOptions = '';
255         if (empty($selected) && $selected != null) {
256             $selected = date('m', time());
257         }
258         foreach ($aMonths as $k => $v) {
259             $monthOptions .= "\n<option value=\"" . sprintf('%02d', $k) . '" ';
260             if ($k == $selected) {
261                 $monthOptions .= 'selected="selected"';
262             }
263             $monthOptions .= '>' . $v . '</option>';
264         }
265         return $monthOptions;
266     }
267
268     /**
269      * Generates a select of year values.
270      *
271      * @access  public
272      * @param   string  $selected
273      * @param   boolean $asc
274      * @param   int     $number         number of years to show
275      * @return  string  $year_options   select year options
276      * @see     showDateSelector()
277      */
278     function getYearFormOptions($selected = '', $asc = true, $totalYears = 5)
279     {
280         SGL::logMessage(null, PEAR_LOG_DEBUG);
281
282         $yearOptions = '';
283         $curYear = date('Y', time());
284         $startYear = $curYear;
285         if ($asc) {
286              for ($i = $startYear; $i <= $startYear + $totalYears; $i++) {
287                  $yearOptions .= "\n<option value=\"" . $i . '" ';
288                  if ($i == $selected) {
289                      $yearOptions .= 'selected="selected"';
290                  }
291                  $yearOptions .= '>' . $i . '</option>';
292              }
293         } else {
294              for ($i = $startYear; $i >= $startYear - ($totalYears - 1); $i--) {
295                  $yearOptions .= "\n<option value=\"" . $i . '" ';
296                  if ($i == $selected) {
297                      $yearOptions .= 'selected="selected"';
298                  }
299                  $yearOptions .= '>' . $i . '</option>';
300              }
301         }
302         return $yearOptions;
303     }
304
305     /**
306      * Generates a select of hour values.
307      *
308      * @access  public
309      * @param   string  $selected
310      * @return  string  $hour_options   select hour options
311      * @see     showDateSelector()
312      */
313     function getHourFormOptions($selected = '')
314     {
315         SGL::logMessage(null, PEAR_LOG_DEBUG);
316         $hour_options = '';
317
318         for ($i = 0; $i <= 23; $i++) {
319             $hval = sprintf("%02d"$i);
320             $hour_options .= "\n<option value=\"" . $hval . '" ';
321             if ($selected == $i && $selected !='' ) {
322                 $hour_options .= 'selected="selected"';
323             }
324             $hour_options .= '>' . $hval . '</option>';
325         }
326         return $hour_options;
327     }
328
329     /**
330      * Generates a select of minute/second values.
331      *
332      * @access  public
333      * @param   string  $selected
334      * @return  string  $minute_options select minute/second options
335      * @see     showDateSelector()
336      */
337     function getMinSecOptions($selected = '')
338     {
339         SGL::logMessage(null, PEAR_LOG_DEBUG);
340
341         $minute_options = '';
342
343         for ($i = 0; $i <= 59; $i++) {
344             $minute_options .= "\n<option value=\"" . sprintf("%02d"$i) . '" ';
345             if ($selected == $i && $selected !="" ) {
346                 $minute_options .= 'selected="selected"';
347             }
348             $minute_options .= '>' . sprintf("%02d"$i) . '</option>';
349         }
350         return $minute_options;
351     }
352
353     /**
354      * Generates date/time selector widget.
355      *
356      * usage:
357      * $timestamp=mktime();
358      * $day = date('d', $timestamp);
359      * $month = date('m', $timestamp);
360      * $year = date('Y', $timestamp);
361      * $hour = date('H', $timestamp);
362      * $minute = date('i', $timestamp);
363      * $second = date('s', $timestamp);
364      *
365      * $aDate = array(  'day' => $day,
366      *                  'month' => $month,
367      *                  'year' => $year,
368      *                  'hour' => $hour,
369      *                  'minute' => $minute,
370      *                  'second' => $second);
371      * print showDateSelector($aDate, 'myForm', false);
372      *
373      * @access  public
374      * @param   array   $aDate
375      * @param   string  $elementName name of the html element
376      * @param   boolean $bShowTime  toggle to display HH:MM:SS
377      * @param   bool    $asc
378      * @param   int     $years      number of years to show
379      * @return  string  $html       html for widget
380 */
381     function showDateSelector($aDate, $elementName, $bShowTime = true, $asc = true, $years = 5)
382     {
383         SGL::logMessage(null, PEAR_LOG_DEBUG);
384
385         $html = '';
386         $month_html = "\n<select name='" . $elementName . "[month]' id='".$elementName."_month' >" .
387             SGL_Date::getMonthFormOptions($aDate['month']) . '</select> / ';
388         $day_html = "\n<select name='" . $elementName . "[day]' id='".$elementName."_day'>" .
389             SGL_Date::getDayFormOptions($aDate['day']) . '</select> / ';
390         if ($_SESSION['aPrefs']['dateFormat'] == 'US') {
391             $html .= $month_html . $day_html;
392         } else {
393             $html .= $day_html . $month_html;
394         }
395         $html .= "\n<select name='" . $elementName . "[year]' id='".$elementName."_year'>" .
396             SGL_Date::getYearFormOptions($aDate['year'], $asc, $years) . '</select>';
397         if ($bShowTime) {
398             $html .= '   ';
399             $html .= SGL_String::translate('at time');
400             $html .= '   ';
401             $html .= "\n<select name='" . $elementName . "[hour]'  id='".$elementName."_hour'>" .
402                 SGL_Date::getHourFormOptions($aDate['hour']) . '</select> : ';
403             $html .= "\n<select name='" . $elementName . "[minute]' id='".$elementName."_minute'>" .
404                 SGL_Date::getMinSecOptions($aDate['minute']) . '</select> : ';
405             $html .= "\n<select name='" . $elementName . "[second]' id='".$elementName."_second'>" .
406                 SGL_Date::getMinSecOptions($aDate['second']) . '</select>';
407         }
408         return $html;
409     }
410 }
411 ?>
Note: See TracBrowser for help on using the browser.