Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: заполнить select интервалом времени
 
 автор: Slo_Nik   (11.06.2012 в 21:15)   письмо автору
 
 

Добрый вечер.
как заполнить select временем с 06:00 до 02:00 с интервалом времени в 3 минуты?
не могу сообразить, с чего подступиться.
Как я понимаю, надо определить текущее время, но вот как с минутами быть не знаю, подскажите пожалуйста.

  Ответить  
 
 автор: confirm   (11.06.2012 в 21:54)   письмо автору
 
   для: Slo_Nik   (11.06.2012 в 21:15)
 

Список что-ли? Это какого же он размера должен быть, да еще не ясно, 2:00 полдень, или другой день...

  Ответить  
 
 автор: slo_nik   (11.06.2012 в 22:19)   письмо автору
 
   для: confirm   (11.06.2012 в 21:54)
 

да, список
>да еще не ясно, 2:00 полдень, или другой день...
извините, то с каких пор 2:00 полдень?
с 6:00 до 2:00, получается, что после полуночи захватить ещё два часа следующих суток

  Ответить  
 
 автор: confirm   (11.06.2012 в 22:41)   письмо автору
 
   для: slo_nik   (11.06.2012 в 22:19)
 

>извините, то с каких пор 2:00 полдень?

С тех, что время может иметь как 24-х часовой формат, так и 12-и часовой - время до полудня, и после полудня.

Наверное не надо рассказывать насколько большим такой список будет, и трудно представить человека, у которого бы хватило терпения его прокрутить.
А можете прояснить что за задачу он будет решать, может быть иное решение возможно?

  Ответить  
 
 автор: Sfinks   (11.06.2012 в 22:44)   письмо автору
 
   для: confirm   (11.06.2012 в 22:41)
 

Забавно.... А я не про тот SELECT подумал =)

> Наверное не надо рассказывать насколько большим такой список будет
Всего-то 400 элементов =)

  Ответить  
 
 автор: confirm   (11.06.2012 в 22:48)   письмо автору
 
   для: Sfinks   (11.06.2012 в 22:44)
 

А 400 это мало? К тому же, нужно учитывать, что пользователь будет видеть практически монотонные данные, с интервалом в 3 минуты. Разве это удобно для выбора?

  Ответить  
 
 автор: confirm   (11.06.2012 в 23:53)   письмо автору
 
   для: slo_nik   (11.06.2012 в 22:19)
 

Построить легко:
<?
$s 
'<select>';
for(
$i strtotime('2012/06/11 06:00'), 
    
$k strtotime('2012/06/12 02:00'); 
    
$i <= $k$i += 180)
    
$s .= '<option>'.date('Y-m-d H:i'$i).'</option>';
echo 
$s.'</select>';

но вот удобно ли в плане восприятия и выбора, у меня все-таки сомнения.

  Ответить  
 
 автор: Slo_Nik   (12.06.2012 в 00:42)   письмо автору
 
   для: confirm   (11.06.2012 в 23:53)
 

насчёт удобства согласен.
это не моя задача, просто увидел, что один пипл ищет решение, вот и решил для общего развития найти решение, но сам не справился...
плохо...
ну да ладно, попробую Ваш вариант, проанализирую, что бы знать как с функциями даты работать.

вообще то правильно, слишком большой список получается...

  Ответить  
 
 автор: confirm   (12.06.2012 в 07:49)   письмо автору
 
   для: Slo_Nik   (12.06.2012 в 00:42)
 

Пример для того, чтобы показать откуда время взять, а на практике, чтобы не быть "привязанным" к дню текущему, лучше так:
<?
$s 
'<select>';
for(
$i mktime(6,0,0), 
    
$k strtotime('06:00 +20 hours'); 
    
$i <= $k$i += 180)
    
$s .= '<option>'.date('Y-m-d H:i'$i).'</option>';
echo 
$s.'</select>';

Если нужно только время ни с чем не связанное, то значит это может быть цикл от 360 по 1560 (количество минут), с шагом +3 и делением на 60.

А для выбора лучше два списка - часы и минуты, либо календарное представление часов, и такое же представление минут, но по выбору часов. В общем интерактивный выбор на JS.

  Ответить  
 
 автор: Slo_Nik   (12.06.2012 в 16:35)   письмо автору
 
   для: confirm   (12.06.2012 в 07:49)
 

спасибо за подсказку, очень краткий код получился у Вас... Теперь пытаюсь понять, как и что...

убрал из date день-месяц-год, время нормально выводит. Вот второй вариант не совсем понятен.
Я понял так
$i = 360 (6 часов после полуночи)
$k = 1560 (20 часов от 6 утра отсчитываем)
в цикле всё так же как в Вашем варианте?

  Ответить  
 
 автор: confirm   (12.06.2012 в 17:24)   письмо автору
 
   для: Slo_Nik   (12.06.2012 в 16:35)
 

Да 360 - это 6 часов, 1560 - 6+20 часов. А дальше нет - дальше нужно делить на 60, округляя в меньшую сторону, получая часы, и по модулю 60, получая минуты:
<?
$s 
'<select>';
for(
$i=360$i<=1560$i += 3
    
$s .= '<option>'.(floor($i/60)%24).':'
           
.($i%60 10 '0'.$i%60 $i%60).'</option>';
echo 
$s.'</select>';

  Ответить  
 
 автор: Slo_Nik   (12.06.2012 в 20:36)   письмо автору
 
   для: confirm   (12.06.2012 в 17:24)
 

ага, понятно, а я то пытался делить при вычислении в $i += 3...

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

<select name = 'listDataOne'>
<?php
for($i mktime(6,0,0), $k strtotime('6:00 + 20 hours'); $i $k$i += 180){
 echo 
"<option>".date('H:i'$i)."</option>";    
}
?>
</select>

выводит только время в нужном диапазоне.

  Ответить  
 
 автор: confirm   (12.06.2012 в 21:21)   письмо автору
 
   для: Slo_Nik   (12.06.2012 в 20:36)
 

К дате (текущей) все равно привязано, просто явно данным способом ее нет необходимости указывать.

Второй вариант как вариант, можно ведь и по второму сделать. Ну а если говорить о практическом применении, то я бы так не делал, очень уж неудобен такой список для восприятия. Если уж неймется, то хотя бы разделить список на группы по часам (optgroup), иначе либо крутить медленно всматриваясь во время, либо плюнуть на это занятие. )
Я бы применил календарное представление и использовал JS, может чуть позже опишу такой вариант.

PS. Фигурные скобки для одного оператора, это роскошь. :)

  Ответить  
 
 автор: Slo_Nik   (12.06.2012 в 21:46)   письмо автору
 
   для: confirm   (12.06.2012 в 21:21)
 

я же говорю, что не себе, для практического применения спросил.
Просто для общего развития.
Ну а фигурные скобки по привычке ставлю

  Ответить  
 
 автор: confirm   (12.06.2012 в 22:00)   письмо автору
 
   для: Slo_Nik   (12.06.2012 в 21:46)
 

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

  Ответить  
 
 автор: Slo_Nik   (12.06.2012 в 22:10)   письмо автору
 
   для: confirm   (12.06.2012 в 22:00)
 

вот только не понял с группами...
Вы имеете ввиду на первую половину дня и второю?

  Ответить  
 
 автор: confirm   (12.06.2012 в 22:37)   письмо автору
 
   для: Slo_Nik   (12.06.2012 в 22:10)
 

Нет не это. Каждый часовой интервал поместить в группу, заголовком которого будет указываться начало часового интервала, например, 6 часов, 7 часов и т.д.. Так как такой заголовок отображается в списке жирным шрифтом, а элементы списка с отступом, то удобнее будет воспринимать такой длинный список, а значит и выбирать легче будет.

  Ответить  
 
 автор: Slo_Nik   (12.06.2012 в 22:59)   письмо автору
 
   для: confirm   (12.06.2012 в 22:37)
 

а... Понял...
Спасибо за подсказки и код... Буду разбираться.

  Ответить  
 
 автор: confirm   (13.06.2012 в 01:39)   письмо автору
 
   для: Slo_Nik   (12.06.2012 в 22:59)
 

Ну вот еще, для разбора. ) Как я говорил, в случае такой надобности поступил бы так:
<style>
body {
  font: 10pt arial, sans-serif;  
}
input {
  display: inline-block;
  margin-right: 2px;
  border: 1px solid #777;
  width: 60px;
  height: 17px;
  padding-left: 4pt;
  float: left;
}
#bth {
  display: inline-block;
  border: 1px solid #777;
  background: #aaa;
  width: 19px;
  height: 19px;
  float: left;
}
.tm_box, .tm_box div .tm_box {
  display: none;
  position: relative;
  padding: 2px 0 0 2px;
  width: 111px;
  height: 111px;
  background: #fff;
  border: 1px solid #777;
}
.gray {background: #eee;}
.tm_box div .tm_box {
  height: 89px;
  top: -17px;
}
.tm_box div {
  display: block;
  text-align: right;
  padding: 1px;
  line-height: 17px;
  width: 17px;
  height: 17px;
  border: 1px solid #777;
  margin: 0 1px 1px 0;
  float: left;
  cursor: pointer;  
}
</style>
<script type="text/javascript" 
src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script> 
<script type="text/javascript">
var h, tms;
function showSelect(e) {
  $("#minutes").remove();
  var tm = '<div class="tm_box" id='+tms.id+'>';
  for(var i = tms.start; i<tms.end; i += tms.step)
      tm += '<div>'+(tms.prev && i<10 ? '0' : '')+i%tms.mod+'</div>';
  tm += '</div>';
  $(tm).appendTo($(e))
       .slideDown(300)
       .parent().off('click');
}
function startEvent() {
  $("#bth").on('click', function(){
     tms = {id:'hours',start:6,end:28,step:1,mod:25,prev:0}; 
     $("#time").val("");
     showSelect(this);
  });  
}
$(function(){
   startEvent();
   $("#hours div").live('click', 
      function(e) {
        e.stopImmediatePropagation();
        tms = {id:'minutes',start:0,end:60,step:3,mod:60,prev:1};
        if($(this).parent().attr("id")=="hours") {
           h = $(this).text();
           $(this).parent().addClass("gray");
           showSelect(this);
        } else {
           $("#time").val(h+":"+$(this).text());
           $("#hours").remove();
           startEvent(); 
        }      
     }
   );
});
</script>
<input id="time" />
<div id="bth"></div>

DIV "bth", это кнопка с иконкой календаря.

  Ответить  
 
 автор: Sfinks   (11.06.2012 в 22:29)   письмо автору
 
   для: Slo_Nik   (11.06.2012 в 21:15)
 

Если я правильно понял вопрос, то в MySQL я знаю тока такой способ:
SELECT time('2000-01-01 06:00:00' +INTERVAL ((w+x*4+y*16+z*80+1)*3) MINUTE)tm FROM
  (SELECT 0 w union SELECT 1 union SELECT 2 union SELECT 3)w,
  (SELECT 0 x union SELECT 1 union SELECT 2 union SELECT 3)x,
  (SELECT 0 y union SELECT 1 union SELECT 2 union SELECT 3 union SELECT 4)y,
  (SELECT 0 z union SELECT 1 union SELECT 2 union SELECT 3 union SELECT 4)z

Только не понял при чем тут текущее время.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования