За последние 24 часа нас посетили 18362 программиста и 1634 робота. Сейчас ищут 1622 программиста ...

Конвертация XLS даты в формат Y.m.d

Тема в разделе "Решения, алгоритмы", создана пользователем Professor, 25 авг 2010.

  1. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    Всем привет !

    Недавно в проекте столкнулся с задачей - нужно было из XML даты (которая представляет собой число, равное количеству дней, прошедших с 1 января 1900 года) получить дату для записи в MySQL. Вот написал функцию, прошу комментировать, осуждать, советовать, в общем, нужны мнения:
    PHP:
    1. <?php
    2.     /**
    3.      * Converts XML format date to date of format Y.m.d  
    4.      *
    5.      * @access  private
    6.      * @param   int     Integer, wich represents number of days past from January 1st, 1900.     
    7.      * @return  string  Date of Y.m.d format
    8.      */
    9.     function _convertXML2SQLdate ($days)
    10.     {
    11.         $days = (int)$days;
    12.         // количество дней в феврале
    13.         $februaryDays = 28;
    14.        
    15.         // находим количество полных лет: делим на 1461 - количество дней в 4-х годах, с учётом високосного года
    16.         $y = floor ($days/1461)*4;
    17.         // находим остаток дней (с этих дней начнётся високосный год)
    18.         $rest = $days % 1461;
    19.         // если дней больше 366 - т.е. к нашим годам добавляется ещё и високосный год
    20.         if ($rest/366 > 1)
    21.         {
    22.             $y++;
    23.             $rest = $rest - 366;
    24.             // теперь уже идёт учёт не високосных лет
    25.             while ($rest > 365)
    26.             {
    27.                 $y++;
    28.                 $rest = $rest - 365;
    29.             }
    30.         } else
    31.         {
    32.             // в случае, если текущий год - високосный - увеличиваем количество дней в феврале на 1
    33.             $februaryDays++;
    34.         }
    35.        
    36.         // если количество оставшихся дней меньше или равно 31 - значит месяц - январь, и т.д....
    37.         // January
    38.         if ($rest <= 31)
    39.         {
    40.             $m = 1;
    41.             $d = $rest;
    42.             return 1900 + $y . "." . $m . "." . $d;
    43.         }
    44.         // February
    45.         if ($rest <= $februaryDays+31)
    46.         {
    47.             $m = 2;
    48.             $d = $rest - 31;
    49.             return 1900 + $y . "." . $m . "." . $d;
    50.         }
    51.         // March
    52.         if ($rest <= $februaryDays+62)
    53.         {
    54.             $m = 3;
    55.             $d = $rest - 31 - $februaryDays;
    56.             return 1900 + $y . "." . $m . "." . $d;
    57.         }
    58.         // April
    59.         if ($rest <= $februaryDays+92)
    60.         {
    61.             $m = 4;
    62.             $d = $rest - 62 - $februaryDays;
    63.             return 1900 + $y . "." . $m . "." . $d;
    64.         }
    65.         // May
    66.         if ($rest <= $februaryDays+123)
    67.         {
    68.             $m = 5;
    69.             $d = $rest - 92 - $februaryDays;
    70.             return 1900 + $y . "." . $m . "." . $d;
    71.         }
    72.         // June
    73.         if ($rest <= $februaryDays+153)
    74.         {
    75.             $m = 6;
    76.             $d = $rest - 123 - $februaryDays;
    77.             return 1900 + $y . "." . $m . "." . $d;
    78.         }
    79.         // July
    80.         if ($rest <= $februaryDays+184)
    81.         {
    82.             $m = 7;
    83.             $d = $rest - 153 - $februaryDays;
    84.             return 1900 + $y . "." . $m . "." . $d;
    85.         }
    86.         // August
    87.         if ($rest <= $februaryDays+215)
    88.         {
    89.             $m = 8;
    90.             $d = $rest - 184 - $februaryDays;
    91.             return 1900 + $y . "." . $m . "." . $d;
    92.         }
    93.         // September
    94.         if ($rest <= $februaryDays+245)
    95.         {
    96.             $m = 9;
    97.             $d = $rest - 215 - $februaryDays;
    98.             return 1900 + $y . "." . $m . "." . $d;
    99.         }
    100.         // October
    101.         if ($rest <= $februaryDays+276)
    102.         {
    103.             $m = 10;
    104.             $d = $rest - 245 - $februaryDays;
    105.             return 1900 + $y . "." . $m . "." . $d;
    106.         }
    107.         // November
    108.         if ($rest <= $februaryDays+306)
    109.         {
    110.             $m = 11;
    111.             $d = $rest - 276 - $februaryDays;
    112.             return 1900 + $y . "." . $m . "." . $d;
    113.         }
    114.         // December
    115.         if ($rest <= $februaryDays+337)
    116.         {
    117.             $m = 12;
    118.             $d = $rest - 306 - $februaryDays;
    119.             return 1900 + $y . "." . $m . "." . $d;
    120.         }
    121.     }
    122. ?>
     
  2. iliavlad

    iliavlad Активный пользователь

    С нами с:
    24 янв 2009
    Сообщения:
    1.689
    Симпатии:
    4
    PHP:
    1. <?php
    2. $datetime = new DateTime('1900-01-01 00:00:00');
    3. date_add($datetime, new DateInterval('P366D'));
    4. echo $datetime->format('Y-m-d H:i:s');
    5.  
    6. 1901-01-02 00:00:00
    7.  
     
  3. Professor

    Professor Активный пользователь

    С нами с:
    2 янв 2008
    Сообщения:
    121
    Симпатии:
    0
    Адрес:
    г. Одесса, Украина
    да, но это только для PHP >= 5.3.0, в моём случае не есть гуд - нужно что бы работало на 5.2.х