|
|
|
| Добрый вечер.
как заполнить select временем с 06:00 до 02:00 с интервалом времени в 3 минуты?
не могу сообразить, с чего подступиться.
Как я понимаю, надо определить текущее время, но вот как с минутами быть не знаю, подскажите пожалуйста. | |
|
|
|
|
|
|
|
для: Slo_Nik
(11.06.2012 в 21:15)
| | Список что-ли? Это какого же он размера должен быть, да еще не ясно, 2:00 полдень, или другой день... | |
|
|
|
|
|
|
|
для: confirm
(11.06.2012 в 21:54)
| | да, список
>да еще не ясно, 2:00 полдень, или другой день...
извините, то с каких пор 2:00 полдень?
с 6:00 до 2:00, получается, что после полуночи захватить ещё два часа следующих суток | |
|
|
|
|
|
|
|
для: slo_nik
(11.06.2012 в 22:19)
| | >извините, то с каких пор 2:00 полдень?
С тех, что время может иметь как 24-х часовой формат, так и 12-и часовой - время до полудня, и после полудня.
Наверное не надо рассказывать насколько большим такой список будет, и трудно представить человека, у которого бы хватило терпения его прокрутить.
А можете прояснить что за задачу он будет решать, может быть иное решение возможно? | |
|
|
|
|
|
|
|
для: confirm
(11.06.2012 в 22:41)
| | Забавно.... А я не про тот SELECT подумал =)
> Наверное не надо рассказывать насколько большим такой список будет
Всего-то 400 элементов =) | |
|
|
|
|
|
|
|
для: Sfinks
(11.06.2012 в 22:44)
| | А 400 это мало? К тому же, нужно учитывать, что пользователь будет видеть практически монотонные данные, с интервалом в 3 минуты. Разве это удобно для выбора? | |
|
|
|
|
|
|
|
для: 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>';
|
но вот удобно ли в плане восприятия и выбора, у меня все-таки сомнения. | |
|
|
|
|
|
|
|
для: confirm
(11.06.2012 в 23:53)
| | насчёт удобства согласен.
это не моя задача, просто увидел, что один пипл ищет решение, вот и решил для общего развития найти решение, но сам не справился...
плохо...
ну да ладно, попробую Ваш вариант, проанализирую, что бы знать как с функциями даты работать.
вообще то правильно, слишком большой список получается... | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: confirm
(12.06.2012 в 07:49)
| | спасибо за подсказку, очень краткий код получился у Вас... Теперь пытаюсь понять, как и что...
убрал из date день-месяц-год, время нормально выводит. Вот второй вариант не совсем понятен.
Я понял так
$i = 360 (6 часов после полуночи)
$k = 1560 (20 часов от 6 утра отсчитываем)
в цикле всё так же как в Вашем варианте? | |
|
|
|
|
|
|
|
для: 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>';
|
| |
|
|
|
|
|
|
|
для: 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>
|
выводит только время в нужном диапазоне. | |
|
|
|
|
|
|
|
для: Slo_Nik
(12.06.2012 в 20:36)
| | К дате (текущей) все равно привязано, просто явно данным способом ее нет необходимости указывать.
Второй вариант как вариант, можно ведь и по второму сделать. Ну а если говорить о практическом применении, то я бы так не делал, очень уж неудобен такой список для восприятия. Если уж неймется, то хотя бы разделить список на группы по часам (optgroup), иначе либо крутить медленно всматриваясь во время, либо плюнуть на это занятие. )
Я бы применил календарное представление и использовал JS, может чуть позже опишу такой вариант.
PS. Фигурные скобки для одного оператора, это роскошь. :) | |
|
|
|
|
|
|
|
для: confirm
(12.06.2012 в 21:21)
| | я же говорю, что не себе, для практического применения спросил.
Просто для общего развития.
Ну а фигурные скобки по привычке ставлю | |
|
|
|
|
|
|
|
для: Slo_Nik
(12.06.2012 в 21:46)
| | Я понял что для тренировки ) Ну ради нее и разбейте на группы список. Я так думаю, будет более удобно в этом случае. | |
|
|
|
|
|
|
|
для: confirm
(12.06.2012 в 22:00)
| | вот только не понял с группами...
Вы имеете ввиду на первую половину дня и второю? | |
|
|
|
|
|
|
|
для: Slo_Nik
(12.06.2012 в 22:10)
| | Нет не это. Каждый часовой интервал поместить в группу, заголовком которого будет указываться начало часового интервала, например, 6 часов, 7 часов и т.д.. Так как такой заголовок отображается в списке жирным шрифтом, а элементы списка с отступом, то удобнее будет воспринимать такой длинный список, а значит и выбирать легче будет. | |
|
|
|
|
|
|
|
для: confirm
(12.06.2012 в 22:37)
| | а... Понял...
Спасибо за подсказки и код... Буду разбираться. | |
|
|
|
|
|
|
|
для: 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", это кнопка с иконкой календаря. | |
|
|
|
|
|
|
|
для: 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
|
Только не понял при чем тут текущее время. | |
|
|
|