Блог


Функции для работы с датами

Пока валю все в кучу, потом сделаю полную спецификацию и выложу цельную библиотеку.

 

Начнем с форматирования даты. Функция date() предоставляет возможность откартатировать дату как угодно, кучей вариантов. Еще можно настроить локаль и расширить эти возможности. Однако проще один раз написать функцию, которая будет с минимальными поползновениями выдавать нужные результаты.

 

Немного экскурса. В мире существуют три основных формата дат. Европейский, американский и азиатский. Американский формат - m.d.Y, то есть месяц, день, год. Нам он непривычен и кажется совершенно нелогичным. Однако подождите плеваться в сторону американцев. Дело в том, что они в основном говорят на английском языке. А английский построен на ассоциациях и логике. Так вот, грамотно говорить по английски - March 28, 2013.

То есть: марта 28, 2013-го года. Ну так сложилось. И соответственно цифрами они обозначают дату в том же порядке: 03.28.2013 

 

В Европе говорят не только по английски, а посему европейский формат более рационален. По увеличению - d.m.Y, день-месяц-год. Однако тут может возникнуть путаница. Какое это число: 01.03.2013? Первое марта или третье января? Без указания формата мы не можем сказать однозначно. Этим кстати на заре 90-х активно пользовались наши "бизнесмены", выигрывая в судах у американцев срывы сроков контрактов. 

 

А посему самым логичным является азиатский формат.

На уменьшение. Y-m-d, год-месяц-число. Тут не перепутаешь. Именно этим форматом пользуются программисты в системных расчетах дат. Но система системой, а юзеру, далекому от программирования, такой формат не всегда привычен и удобен. Вот для него, родимого, и все наши старания. 

 

Функция форматирования даты и времени. Я специально не стал добавлять американский стандарт числами, есть английский, и этого достаточно. Ну а остальное думаю будет понятно из примера:

1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 103
 104
 105
 106
 107
 108
 109
 110
 111
 112
 113
 114
 115
 116
 117
 118
 119
 120
 121
 122
 123
 124
 125
 126
 127
 128
 129
 130
 131
<?php


// Время без секунд
    
define('IRB_TIME',         1);
// Время с секундами 
    
define('IRB_FULL_TIME',    2);
// Месяц прописью (по умолчанию русский)
    
define('IRB_MONTH_STR',    4);
// Месяц прописью на английском
    
define('IRB_MONTH_STR_EN'8);
// Дата и время в стандарте RFC
    
define('IRB_DATE_RFC',    16);
////////////////////////////////////////////
    
echo 
'Текущая дата в европейском формате <br>'
// По умолчанию 
    
echo formatDate('NOW');
    
echo 
'<br><br>',   
'Текущая дата в европейском формате<br>
c минутами <br>'
;   
    echo 
formatDate('NOW'IRB_TIME);

echo 
'<br><br>',   
'Текущая дата в европейском формате<br>
c минутами и секундами <br>'
;   
    echo 
formatDate('NOW'IRB_FULL_TIME);
    
echo 
'<br><br>'
'Текущая дата прописью <br>';
    echo 
formatDate('NOW'IRB_MONTH_STR);
    
echo 
'<br><br>'
'Текущая дата прописью
с минутами <br>'
;
    echo 
formatDate('NOW'IRB_MONTH_STR IRB_TIME); 
    
echo 
'<br><br>'
'Текущая дата прописью
с минутами и секундами <br>'
;
    echo 
formatDate('NOW'IRB_MONTH_STR IRB_FULL_TIME); 
    
echo 
'<br><br>'
'Текущая дата прописью на английском <br>';
    echo 
formatDate('NOW'IRB_MONTH_STR_EN);
    
echo 
'<br><br>'
'Текущая дата прописью на английском
с минутами <br>'
;
    echo 
formatDate('NOW'IRB_MONTH_STR_EN IRB_TIME);
    
echo 
'<br><br>'
'Текущая дата прописью на английском <br>
с минутами и секундами <br>'
;
    echo 
formatDate('NOW'IRB_MONTH_STR_EN IRB_FULL_TIME);
    
echo 
'<br><br>'
'Любая дата прописью <br>'
//(обязательно в азиатском формате)
    
$date '2013-03-27';
    echo 
formatDate($dateIRB_MONTH_STR); 
    
echo 
'<br><br>',
'Текущая дата прописью <br>
на украинском языке <br>'
;     
// Языковой массив   
    
$month_ua = array(=> 'січня','лютого','березня',
                           
'квітня''травня''червня',
                           
'липня''серпня''вересня',
                           
'жовтня''листопада''грудня'
                      
);

// Языковой массив третьим параметром
    
echo formatDate('NOW'IRB_MONTH_STR$month_ua);
    
echo 
'<br><br>',
'Текущая дата прописью на украинском языке <br>
с минутами и секундами  <br>'
;     
    echo 
formatDate('NOW'IRB_MONTH_STR IRB_FULL_TIME$month_ua);    
    
echo 
'<br><br>'
'Текущая дата в стандарте RFC <br>';
    echo 
formatDate('NOW'IRB_DATE_RFC);      
    
////////////////////////////////////////
// Функция

    
function formatDate($date$format 0$lang '')  
    {
        if(
$date === 'NOW')
            
$date date('Y-m-d H:i:s');
        
        
$unix strtotime($date); 
        
        if(
$format == 16)
            
$date date('r'$unix); 
        else
        {   
            if(
$format >= && $format 8)
            {
                
$lang = empty($lang)?  
                array(
=> 'января','февраля','марта',
                           
'апреля''мая''июня',
                           
'июля''августа''сентября',
                           
'октября''ноября''декабря'
                            
) : $lang;
               
                if(
$format 2
                    
$date date('j ' 
                                
$lang[date('n'$unix)] 
                                .
' Y'$unix
                                
);
            }
            elseif(
$format >= 8)
                
$date date('F j, Y'$unix);
            else
                
$date date('d.m.Y'$unix);
                
            if(
$format >= && $format != && $format != 8)       
                
$date .= date(' H:i'$unix);
         
            if(
$format == || $format == || $format == 10)
                
$date .= date(':s'$unix);  
        }
        
        return 
$date
    } 
    

 

Вторая маленькая симпатичная функция позволяет сгенерировать интервал дат от начальной до конечной в виде массива. Полезно для всяческих сортировок или организации календаря к примеру. Функция проста в использовании: задаем аргументами начальную дату и конечную. Если конечной даты нет, будет считать до сегодня:

1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
<?php


// Задаем интервал дат.
    
var_dump(dateInterval('2013-02-05''2013-03-01'));
// С одним параметром будет считать от него до сегодня    
    
var_dump(dateInterval('2013-03-01'));
   
////////////////////////////////////////////
//  Функция
   
    
function dateInterval($start$end '')
    {
        
$start strtotime($start); 
        
$end   = empty($end) ? time() : strtotime($end);
      
        for(
$d $start$d <= $end $d strtotime('tomorrow'$d)) 
            
$interval[] = date('Y-m-d'$d);
        
        return 
$interval;
    }

 

 Продолжение следует.

 

nbsp;

Теги: PHP

Комментарии (2)

dateTime
25-05-2013
Просто оставлю это здесь
http://www.php.net/manual/ru/class.datetime.php
http://www.php.net/manual/ru/class.dateinterval.php
Skip
04-02-2016
Это все конечно хорошо. Но можно еще использовать lc_time_names = 'ru_RU'

 
Наверх