Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Задача с датами

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (2): [1] 2 »   

> Без описания
Bio man
Отправлено: 29 Декабря, 2012 - 20:28:36
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Есть 2 даты, от и до. Это интервал между 2 временными точками.
Задача посчитать дни между датами.
Если от и до в пределах 1 месяца то тут проблем нет.
Но если интервал в пределах года? Или интервал может включать разные года, например, 2012.12.12 - 2013.01.01

На выходе нужно получить массив вида
array[year][month][day]

Нужно учесть сколько дней в месяце и какой год (для февраля)

Кто осилит?
 
 Top
EuGen Администратор
Отправлено: 29 Декабря, 2012 - 20:30:39
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Bio man пишет:
Задача посчитать дни между датами.

- почему же тогда на выходе массив?
Имеется ли ввиду:
PHP:
скопировать код в буфер обмена
  1. $sFrom   = '2012.12.12';
  2. $sTill   = '2013.01.01';
  3. $iResult = floor(abs(strtotime($sTill)-strtotime($sFrom))/(60*60*24));
  4. //var_dump($iResult);

?


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Bio man
Отправлено: 29 Декабря, 2012 - 20:40:13
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Например from = 2012.12.29
to = 2013.02.01

и на выходе должно быть
PHP:
скопировать код в буфер обмена
  1. array(2012 => array(12 => array(29, 30, 31)),
  2. 2013 => array(1 => array(1-31), 2 => array(1)))


Но все это желательно на JS

(Отредактировано автором: 29 Декабря, 2012 - 20:41:12)

 
 Top
DeepVarvar Супермодератор
Отправлено: 29 Декабря, 2012 - 20:55:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Объект Date все это умеет делать.
Посморите: http://javascript[dot]ru/Date

Или берите jquery-календарь - там все есть сразу и можно задавать форматы дат.
 
 Top
armancho7777777 Супермодератор
Отправлено: 29 Декабря, 2012 - 20:58:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 4526
Дата рег-ции: Февр. 2011  
Откуда: Москва


Помог: 221 раз(а)




Bio man, можно узнать первоначальную задачу ?
 
 Top
EuGen Администратор
Отправлено: 29 Декабря, 2012 - 21:03:45
Post Id


Профессионал


Покинул форум
Сообщений всего: 9095
Дата рег-ции: Июнь 2007  
Откуда: Berlin


Помог: 707 раз(а)




Верно, я не заметил названия раздела. Тогда советы выше подойдут.


-----
Есть в мире две бесконечные вещи - это Вселенная и человеческая глупость. Но насчет первой .. я не уверен.
 
 Top
Саныч
Отправлено: 29 Декабря, 2012 - 21:59:05
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Bio man, если я конечно правильно понял суть задания...
CODE (javascript):
скопировать код в буфер обмена
  1. var from = '2012.12.29'.split('.'),
  2.         to = '2013.02.01'.split('.'),
  3.         result = {};
  4.  
  5. from = new Date(from[0], --from[1], from[2]);
  6. to = new Date(to[0], --to[1], to[2]);
  7.  
  8. for (var D, M, Y, first = true; from <= to; from.setDate(from.getDate() + 1)) {
  9.         D = from.getDate().toString();
  10.         M = (from.getMonth() + 1).toString();
  11.         Y = from.getFullYear().toString();
  12.        
  13.         if (first || (M === '1' && D === '1'))
  14.                 result[Y] = {};
  15.                
  16.         if (first || D === '1')
  17.                 result[Y][M] = [];
  18.                
  19.         first = false;
  20.        
  21.         result[Y][M].push(D);
  22. }
  23.  


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Bio man
Отправлено: 30 Декабря, 2012 - 13:42:34
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Саныч то что надо! Работает отлично. Спасибо огромное.
 
 Top
Bio man
Отправлено: 02 Января, 2013 - 14:13:38
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Саныч,
CODE (javascript):
скопировать код в буфер обмена
  1. var from = new Date(f*1000);
  2. var to = new Date(t*1000);
  3. var result = [];
  4.  
  5. for (var D, M, Y, first = true; from <= to; from.setDate(from.getDate() + 1))
  6. {
  7.         D = from.getDate().toString();
  8.         M = (from.getMonth() + 1).toString();
  9.         Y = from.getFullYear().toString();
  10.  
  11.         if(first || (M === '1' && D === '1'))
  12.                 result[Y] = {};
  13.  
  14.         if(first || D === '1')
  15.                 result[Y][M] = [];
  16.  
  17.         first = false;
  18.  
  19.         result[Y][M].push(D);
  20. }


Если дата заканчивается 1 январем то это 1 января не попадает в массив... Есть дата, заканчивается 7 январем, с ней все ок.
И если заканчивается 2 январем то в массив попадает только 1 января!
В чем может быть проблема?
(Добавление)
Что то странное. Изменил на 7 января, и последней день - 6 января!
Этот код выплняется в цикле, и для 1ой записи записывает на день меньше а последующие записи обрабатываются нормально!
 
 Top
Саныч
Отправлено: 02 Января, 2013 - 14:36:59
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Bio man, вот только что пробовал:
CODE (javascript):
скопировать код в буфер обмена
  1. var from = new Date(2012, 11, 30);
  2. var to = new Date(2013, 0, 1);
  3. var result = [];
  4.  
  5. for (var D, M, Y, first = true; from <= to; from.setDate(from.getDate() + 1)) {
  6.         // ничего не менял...
  7. }
  8. // ниже, для проверки...
  9. window.onload = function() {
  10.         (function each(obj, left) {
  11.                 for (var i in obj) {
  12.                         var p = document.createElement('p');
  13.                         p.innerHTML = i + ' = ' + obj[i];
  14.                         p.style.marginLeft = left + 'px';
  15.                         document.body.appendChild(p);
  16.                         if (typeof obj[i] === 'object')
  17.                                 each(obj[i], left + 20);
  18.                 }
  19.         })(result, 0);
  20. }
Вывод:
Спойлер (Отобразить)

Для
CODE (javascript):
скопировать код в буфер обмена
  1. var from = new Date(2012, 11, 30);
  2. var to = new Date(2013, 0, 7);
Вывод:
Спойлер (Отобразить)
Короче нормально все работает.

CODE (javascript):
скопировать код в буфер обмена
  1. var from = new Date(f*1000);
  2. var to = new Date(t*1000);
Смотри что в f и t передаешь. Подозреваяю, что там не тот timestamp...

(Отредактировано автором: 02 Января, 2013 - 14:37:19)



-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Bio man
Отправлено: 02 Января, 2013 - 14:38:44
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




тот. напрямую с БД.
в БД FROM_UNIXTIME(`ts`.`date_to`) выводит 2013-01-07 13:44:38
 
 Top
Саныч
Отправлено: 02 Января, 2013 - 14:40:40
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Покажи, что в исходном коде страницы.


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Bio man
Отправлено: 02 Января, 2013 - 14:44:15
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




Саныч, маленько теряюсь, что именно показать... работаю с backbone.js.
Вот ф-ция модели
CODE (javascript):
скопировать код в буфер обмена
  1. _buildDays: function(f, t)
  2. {
  3.         var from = new Date(f*1000);
  4.         var to = new Date(t*1000);
  5.         var result = [];
  6.  
  7.         for (var D, M, Y, first = true; from <= to; from.setDate(from.getDate() + 1))
  8.         {
  9.                 D = from.getDate().toString();
  10.                 M = (from.getMonth() + 1).toString();
  11.                 Y = from.getFullYear().toString();
  12.  
  13.                 if(first || (M === '1' && D === '1'))
  14.                         result[Y] = {};
  15.  
  16.                 if(first || D === '1')
  17.                         result[Y][M] = [];
  18.  
  19.                 first = false;
  20.  
  21.                 result[Y][M].push(D);
  22.         }
  23.         console.log(result);
  24.         return result;
  25. }

вызывается тут
CODE (javascript):
скопировать код в буфер обмена
  1. parse: function(response)
  2. {
  3.         if(!_.isUndefined(response.result))
  4.         {
  5.                 this.lastQuery = response.result;
  6.                 delete response.result;
  7.         }
  8.         if(!_.isUndefined(response.date_from) && !_.isUndefined(response.date_to))
  9.         {
  10.                 response.days = this._buildDays(response.date_from, response.date_to);
  11.                 delete response.date_from;
  12.                 delete response.date_to;
  13.         }
  14.  
  15.         _.each(response, function(val, key){
  16.                 if(_.isString(val))
  17.                         response[key] = _.escape(val);
  18.         });
  19.         return response;
  20. }
 
 Top
Саныч
Отправлено: 02 Января, 2013 - 14:50:21
Post Id



Участник


Покинул форум
Сообщений всего: 1365
Дата рег-ции: Июль 2010  
Откуда: Украина, Запорожье


Помог: 62 раз(а)




Ок, понял, тогда вот так напиши временно
CODE (javascript):
скопировать код в буфер обмена
  1. _buildDays: function(f, t)
  2. {
  3.         alert(f);
  4.         alert(t);
  5.         var from = new Date(f*1000);
  6.         var to = new Date(t*1000);
Меня интересуют именно значения f и t, которые передаются в метод...


-----
Все возражают против того, что я гений, хотя никто еще так меня не назвал. - Орсон Уэллс
 
 Top
Bio man
Отправлено: 02 Января, 2013 - 14:54:27
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2751
Дата рег-ции: Июль 2010  
Откуда: Даугавпилс, Латвия


Помог: 52 раз(а)




для 1 записи
f=1354999078
t=1357559078

для 2
f=1355999078
t=1357559078

вторая запись обрабатывается как надо, а вот с 1 проблемы

(Отредактировано автором: 02 Января, 2013 - 14:54:52)

 
 Top
Страниц (2): [1] 2 »
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« JavaScript & VBScript »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB