Joostina CMS / CMF v2.* API
  • Docs
  • Package
  • Class
  • Tree
  • Todo
Overview

Packages

  • Components
    • Acls
      • Models
        • Admin
        • Site
    • BlogCategory
      • Models
        • Admin
        • Site
    • Blogs
      • Controllers
        • Admin
        • Site
      • Helpers
      • Models
        • Admin
        • Site
    • Coder
      • Controllers
        • Admin
      • Models
        • Admin
    • Comments
      • Controllers
        • Admin
        • Site
      • Helpers
      • Models
        • Admin
        • Site
    • CommentsCounter
      • Models
        • Admin
        • Site
    • Mainpage
      • Controllers
        • Site
    • News
      • Controllers
        • Admin
        • Site
      • Helpers
      • Models
        • Admin
        • Site
    • Pages
      • Controllers
        • Admin
        • Site
      • Models
        • Site
    • Search
      • Controllers
        • Site
    • Site
      • Controllers
        • Admin
        • Site
    • Sitemap
      • Controllers
        • Admin
        • Site
      • Models
        • Admin
        • Site
    • Test
      • Controllers
        • Site
    • Torrents
      • Controllers
        • Site
    • Users
      • Controllers
        • Admin
        • Site
      • Models
        • Admin
        • Site
  • Compression
  • Core
    • Libraries
      • Arhive
      • Array
      • Attached
      • Autoadmin
      • Autoloader
      • Benchmark
      • Breadcrumbs
      • Cache
      • Config
      • Cookie
      • Csrf
      • Database
        • Drivers
          • Interfaces
      • Datetime
      • Debug
      • Editor
      • Events
      • File
      • Filter
      • Flashmessage
      • Folder
      • Hit
      • Html
      • Image
      • Inflector
      • Inputfilter
      • Libraries
      • Mail
      • Module
      • Nestedset
      • Pager
      • Pages
      • Params
      • Randomizer
      • Request
      • RobotLoader
      • Route
      • Security
      • Session
      • Static
      • String
      • Text
      • Trash
      • Validate
  • Email
  • Extra
    • Libraries
      • Basket
  • Joostina
    • Controller
    • Core
    • Document
  • JSMin
  • Libraries
    • Extra
      • Basket
        • Models
          • Site
  • None
  • Plugins
    • Autoadmin
    • Editor
    • Sitemap
  • SimpleMail
  • Vendors
    • Libraries
      • Email

Classes

  • joosDateTime
  1: <?php defined('_JOOS_CORE') or exit();
  2: 
  3: /**
  4:  * Работа с датами и временем
  5:  *
  6:  * @version    1.0
  7:  * @package    Core\Libraries
  8:  * @subpackage Datetime
  9:  * @category   Libraries
 10:  * @author     Joostina Team <info@joostina.ru>
 11:  * @copyright  (C) 2007-2012 Joostina Team
 12:  * @license    MIT License http://www.opensource.org/licenses/mit-license.php
 13:  * Информация об авторах и лицензиях стороннего кода в составе Joostina CMS: docs/copyrights
 14:  *
 15:  * */
 16: class joosDateTime
 17: {
 18:     /**
 19:      * Правила локализации результата работы функции date
 20:      *
 21:      * @var array массив правил локализации
 22:      */
 23:     private static $date_translation = array('am' => 'дп', 'pm' => 'пп', 'AM' => 'ДП', 'PM' => 'ПП', 'Monday' => 'Понедельник', 'Mon' => 'Пн', 'Tuesday' => 'Вторник', 'Tue' => 'Вт', 'Wednesday' => 'Среда', 'Wed' => 'Ср', 'Thursday' => 'Четверг', 'Thu' => 'Чт', 'Friday' => 'Пятница', 'Fri' => 'Пт', 'Saturday' => 'Суббота', 'Sat' => 'Сб', 'Sunday' => 'Воскресенье', 'Sun' => 'Вс', 'January' => 'Января', 'Jan' => 'Янв', 'February' => 'Февраля', 'Feb' => 'Фев', 'March' => 'Марта', 'Mar' => 'Мар', 'April' => 'Апреля', 'Apr' => 'Апр', 'May' => 'Мая', 'June' => 'Июня', 'Jun' => 'Июн', 'July' => 'Июля', 'Jul' => 'Июл', 'August' => 'Августа', 'Aug' => 'Авг', 'September' => 'Сентября', 'Sep' => 'Сен', 'October' => 'Октября', 'Oct' => 'Окт', 'November' => 'Ноября', 'Nov' => 'Ноя', 'December' => 'Декабря', 'Dec' => 'Дек', 'st' => 'ое', 'nd' => 'ое', 'rd' => 'е', 'th' => 'ое');
 24: 
 25:     /**
 26:      * Минута
 27:      *
 28:      */
 29: 
 30:     const MINUTE = 60;
 31: 
 32:     /**
 33:      * Час
 34:      *
 35:      */
 36:     const HOUR = 3600;
 37: 
 38:     /**
 39:      * День
 40:      *
 41:      */
 42:     const DAY = 86400;
 43: 
 44:     /**
 45:      * Неделя
 46:      *
 47:      */
 48:     const WEEK = 604800;
 49: 
 50:     /**
 51:      * Месяц
 52:      *
 53:      */
 54:     const MONTH = 2629800;
 55: 
 56:     /**
 57:      * Год
 58:      *
 59:      */
 60:     const YEAR = 31557600;
 61: 
 62:     /**
 63:      * Реализации функции date с учетом локализации
 64:      * Функция имет синтаксис аналогичный оригинальной функции date
 65:      *
 66:      * @tutorial joosDateTime::russian_date('d-M-Y') => 30-Апр-2011
 67:      * @tutorial joosDateTime::russian_date('d F, l - h часов и i минут') => 30 Апреля, Суббота - 05 часов и 15 минут
 68:      * @tutorial joosDateTime::russian_date('d F Y года, l', strtotime('31-10-1983') ) => 31 Октября 1983 года, Понедельник
 69:      *
 70:      * @return string форматированная строка даты - времени
 71:      */
 72:     public static function russian_date()
 73:     {
 74:         if (func_num_args() > 1) {
 75:             $timestamp = func_get_arg(1);
 76: 
 77:             return strtr(date(func_get_arg(0), $timestamp), self::$date_translation);
 78:         } else {
 79:             return strtr(date(func_get_arg(0)), self::$date_translation);
 80:         }
 81:     }
 82: 
 83:     /**
 84:      * Получение локализованного названия месяца по его порядковому номеру
 85:      *
 86:      * @tutorial joosDateTime::month_name_from_index(1) => Январь
 87:      * @tutorial joosDateTime::month_name_from_index(1) => Октябрь
 88:      *
 89:      * @param int $month номер месяца, 1 - Январь, 2 -Февраль и т.д.
 90:      *
 91:      * @return string название месяца
 92:      */
 93:     public static function month_name_from_index($month)
 94:     {
 95:         $month = (int) $month;
 96: 
 97:         $all_month = array(
 98:             1 => 'Январь',
 99:             2 => 'Февраль',
100:             3 => 'Март',
101:             4 => 'Апрель',
102:             5 => 'Май',
103:             6 => 'Июнь',
104:             7 => 'Июль',
105:             8 => 'Август',
106:             9 => 'Сентябрь',
107:             10 => 'Октябрь',
108:             11 => 'Ноябрь',
109:             12 => 'Декабрь'
110:         );
111: 
112:         return $all_month[$month];
113:     }
114: 
115:     /**
116:      * Получение название дня недели по номеру дня
117:      * Значение адаптирванно под Русские реалии, 1 - понедельник, 7 - воскресение
118:      *
119:      * @tutorial joosDateTime::day_name_from_index(1) => Понедельник
120:      * @tutorial joosDateTime::day_name_from_index(5) => Пятница
121:      *
122:      * @param int $day_index номер дня, 1 - Понедельник, 2 - Вторник и т.д.
123:      *
124:      * @return string
125:      */
126:     public static function day_name_from_index($day_index)
127:     {
128:         $day_index = (int) $day_index;
129: 
130:         $day_name = array(
131:             1 => 'Понедельник',
132:             2 => 'Вторник',
133:             3 => 'Среда',
134:             4 => 'Четверг',
135:             5 => 'Пятница',
136:             6 => 'Суббота',
137:             7 => 'Воскресение'
138:         );
139: 
140:         return $day_name[$day_index];
141:     }
142: 
143:     /**
144:      * Форматирование и локализация даты.
145:      * Если не указан конкртеный формат $format, то используется общесистемное правило для форматирования дат JDATE_FORMAT
146:      *
147:      * @tutorial joosDateTime::format('1983-10-31 11:11:11') => 31 Октября 1983 г. 11:11
148:      * @tutorial joosDateTime::format('1983-10-31') => 31 Октября 1983 г. 00:00
149:      *
150:      * @param string      $date_time исходная строка даты, времени
151:      * @param string|bool $format    правила форматирования даты и времени, как в функции strtr
152:      *
153:      * @return string
154:      */
155:     public static function format($date_time, $format = false)
156:     {
157:         $format = $format ? $format : JDATE_FORMAT;
158:         $datetime = strftime($format, strtotime($date_time));
159: 
160:         return strtr($datetime, self::$date_translation);
161:     }
162: 
163:     /**
164:      * Получение текущего времени в виде локализованной отформатированной строки
165:      * Строка даты форматируется используя общесистемное правило для форматирования дат JDATE_FORMAT
166:      *
167:      * @tutorial joosDateTime::current() => 30 Апреля 2011 г. 04:35
168:      * @tutorial joosDateTime::current('%d %B %Y ') => 30 Апреля 2011
169:      * @tutorial joosDateTime::current( '%H:%M:%S' ) => 04:37:38
170:      * @tutorial joosDateTime::current('%d %h') => 30 Апр
171:      *
172:      * @param string|bool $format
173:      *
174:      * @return string
175:      */
176:     public static function current($format = false)
177:     {
178:         $format = $format ? $format : JDATE_FORMAT;
179:         $datetime = strftime($format, time());
180: 
181:         return strtr($datetime, self::$date_translation);
182:     }
183: 
184:     /**
185:      * Рассчет и прописное представление прошедшего времени
186:      *
187:      * @param int      $timestamp    первоначальный момент времени в секундах
188:      * @param int|bool $current_time конечный момент времени в секундах, по умолчанию - текущее время
189:      *
190:      * @return string логическое прописное обозначение времени
191:      */
192:     public static function time_ago($timestamp, $current_time = false)
193:     {
194:         $timestamp = (int) $timestamp;
195:         $current_time = $current_time ? $current_time : time();
196: 
197:         // считаем число секунд между собыьтиями
198:         $seconds_between = $current_time - $timestamp;
199: 
200:         // года
201:         $years_ago = floor($seconds_between / (365.242199 * 24 * 60 * 60));
202:         if ($years_ago > 1) {
203: 
204:             return sprintf('%s %s назад', $years_ago, joosText::declension($years_ago, array('год', 'года', 'лет')));
205:         }
206:         if ($years_ago == 1) {
207: 
208:             return 'год назад';
209:         }
210: 
211:         // месяцы
212:         $months_ago = floor($seconds_between / ((365.242199 / 12) * 24 * 60 * 60));
213:         if ($months_ago > 1) {
214: 
215:             return sprintf('%s %s назад', $months_ago, joosText::declension($months_ago, array('месяц', 'месяца', 'месяцев')));
216:         }
217:         if ($months_ago == 1) {
218: 
219:             return 'месяц назад';
220:         }
221: 
222:         // недели
223:         $weeks_ago = floor($seconds_between / (7 * 24 * 60 * 60));
224:         if ($weeks_ago > 1) {
225: 
226:             return sprintf('%s %s назад', $weeks_ago, joosText::declension($weeks_ago, array('неделя', 'недели', 'недель')));
227:         }
228:         if ($weeks_ago == 1) {
229: 
230:             return 'неделю назад';
231:         }
232: 
233:         // дней
234:         $days_ago = floor($seconds_between / (24 * 60 * 60));
235:         if ($days_ago > 1) {
236: 
237:             return sprintf('%s %s назад', $days_ago, joosText::declension($days_ago, array('день', 'дня', 'дней')));
238:         }
239:         if ($days_ago == 1) {
240: 
241:             return 'день назад';
242:         }
243: 
244:         // часов
245:         $hours_ago = floor($seconds_between / (60 * 60));
246:         if ($hours_ago > 1) {
247: 
248:             return sprintf('%s %s назад', $hours_ago, joosText::declension($hours_ago, array('час', 'часа', 'часов')));
249:         }
250:         if ($hours_ago == 1) {
251: 
252:             return 'час назад';
253:         }
254: 
255:         // минут
256:         $minutes_ago = floor($seconds_between / 60);
257:         if ($minutes_ago > 1) {
258: 
259:             return sprintf('%s %s назад', $minutes_ago, joosText::declension($minutes_ago, array('минуту', 'минуты', 'минут')));
260:         }
261:         if ($minutes_ago == 1) {
262: 
263:             return 'минуту назад';
264:         }
265: 
266:         // секунд
267:         $seconds_ago = floor($seconds_between);
268:         if ($seconds_ago > 1) {
269: 
270:             return sprintf('%s %s назад', $seconds_ago, joosText::declension($seconds_ago, array('секунда', 'секунд', 'секунды')));
271:         }
272:         if ($seconds_ago <= 1) {
273: 
274:             return 'секунда';
275:         }
276: 
277:         return 'Очень давно';
278:     }
279: 
280:     /**
281:      * Получение логического представление строки времени
282:      *
283:      * @param  int    $time число секунд для анализа
284:      * @return string
285:      */
286:     public static function time_string($time)
287:     {
288:         $time = (int) $time;
289: 
290:         // года
291:         $years = floor($time / (365.242199 * 24 * 60 * 60));
292:         if ($years > 1) {
293: 
294:             return sprintf('%s %s', $years, joosText::declension($years, array('год', 'года', 'лет')));
295:         }
296:         if ($years == 1) {
297: 
298:             return 'год';
299:         }
300: 
301:         // месяцы
302:         $months = floor($time / ((365.242199 / 12) * 24 * 60 * 60));
303:         if ($months > 1) {
304: 
305:             return sprintf('%s %s', $months, joosText::declension($months, array('месяц', 'месяца', 'месяцев')));
306:         }
307:         if ($months == 1) {
308: 
309:             return 'месяц';
310:         }
311: 
312:         // недели
313:         $weeks = floor($time / (7 * 24 * 60 * 60));
314:         if ($weeks > 1) {
315: 
316:             return sprintf('%s %s', $weeks, joosText::declension($weeks, array('неделя', 'недели', 'недель')));
317:         }
318:         if ($weeks == 1) {
319: 
320:             return 'неделю';
321:         }
322: 
323:         // дней
324:         $days = floor($time / (24 * 60 * 60));
325:         if ($days > 1) {
326: 
327:             return sprintf('%s %s', $days, joosText::declension($days, array('день', 'дня', 'дней')));
328:         }
329:         if ($days == 1) {
330: 
331:             return 'день';
332:         }
333: 
334:         // часов
335:         $hours = floor($time / (60 * 60));
336:         if ($hours > 1) {
337: 
338:             return sprintf('%s %s', $hours, joosText::declension($hours, array('час', 'часа', 'часов')));
339:         }
340:         if ($hours == 1) {
341: 
342:             return 'час';
343:         }
344: 
345:         // минут
346:         $minutes = floor($time / 60);
347:         if ($minutes > 1) {
348: 
349:             return sprintf('%s %s', $minutes, joosText::declension($minutes, array('минуту', 'минуты', 'минут')));
350:         }
351:         if ($minutes == 1) {
352: 
353:             return 'минута';
354:         }
355:     }
356: 
357:     public static function standard_date($fmt = 'DATE_RFC822', $time = '')
358:     {
359:         $formats = array(
360:             'DATE_ATOM' => '%Y-%m-%dT%H:%i:%s%Q',
361:             'DATE_COOKIE' => '%l, %d-%M-%y %H:%i:%s UTC',
362:             'DATE_ISO8601' => '%Y-%m-%dT%H:%i:%s%Q',
363:             'DATE_RFC822' => '%D, %d %M %y %H:%i:%s %O',
364:             'DATE_RFC850' => '%l, %d-%M-%y %H:%i:%s UTC',
365:             'DATE_RFC1036' => '%D, %d %M %y %H:%i:%s %O',
366:             'DATE_RFC1123' => '%D, %d %M %Y %H:%i:%s %O',
367:             'DATE_RSS' => '%D, %d %M %Y %H:%i:%s %O',
368:             'DATE_W3C' => '%Y-%m-%dT%H:%i:%s%Q'
369:         );
370: 
371:         if (!isset($formats[$fmt])) {
372: 
373:             return FALSE;
374:         }
375: 
376:         return self::russian_date($formats[$fmt], $time);
377:     }
378: 
379: }
380: 
Joostina CMS / CMF v2.* API API documentation generated by ApiGen 2.6.1 – Template adapted by @olvlv and Joostina Team