| 달력, 월~일(일~월) 구간, 요일수 등 종합 |
|
|
 |
15년 전 |
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
▶ 월요일부터 일요일까지 구간별 출력
<?php
$y = 2010;
$m = 4;
sscanf(date('wt',mktime(0,0,0,$m,1,$y)),'%1d%2d',$w,$t); // 시작요일,전체일수
for ($i=$s=1,$e=(7-$w)%7+1,$l=ceil(($t+$w)/7);$i<=$l;$i++,$s=$e+1,$e=$i<$l?$s+6:$t)
{
printf('%d : %02d/%02d ~ %02d/%02d<br />'."\n",$i,$m,$s,$m,$e);
}
?>
▷ 실행 결과
1 : 04/01 ~ 04/04
2 : 04/05 ~ 04/11
3 : 04/12 ~ 04/18
4 : 04/19 ~ 04/25
5 : 04/26 ~ 04/30
▶ 일요일부터 월요일까지 구간별 출력
<?php
$y = 2010;
$m = 4;
sscanf(date('wt',mktime(0,0,0,$m,1,$y)),'%1d%2d',$w,$t);
for ($i=$s=1,$e=7-$w,$l=ceil(($t+$w)/7);$i<=$l;$i++,$s=$e+1,$e=$i<$l?$s+6:$t)
{
printf('%d : %02d/%02d ~ %02d/%02d<br />'."\n",$i,$m,$s,$m,$e);
}
?>
▷ 실행 결과
1 : 04/01 ~ 04/03
2 : 04/04 ~ 04/10
3 : 04/11 ~ 04/17
4 : 04/18 ~ 04/24
5 : 04/25 ~ 04/30
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
* 반복문 내 date(), mktime(), strtotime() 등의 함수 사용이 없어 속도가 매우 빠릅니다.
* 처음 요일값, 일수 구하는 부분 아래 코드로 바꾸면? 만년달력!
$mm=array(31,28,31,30,31,30,31,31,30,31,30,31);
if($y%4==0&&$y%100!=0||$y%400==0)$mm[1]++;
$a=($y-1)*365+(int)(($y-1)/4)-(int)(($y-1)/100)+(int)(($y-1)/400)+array_sum(array_slice($mm,0,$m-1))+1;
$w=$a%7;$t=$mm[$m-1];
‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥‥
* 예전의 장난성 코드 추가합니다.
<?php
$y = 2010;
$m = 4;
sscanf(date('wt',mktime(0,0,0,$m,1,$y)),'%1d%2d',$w,$t);
$c=$t;$l=ceil(($t+$w)/7); // 주차
for($i=1,$a=array();$i<=$t;$i++)$a[]=$i<10?'0'.$i:$i; // range(1,$t)
for($i=0;$i<$w;$i++){array_unshift($a,' ');$c++;} // 배열 앞 추가
for($i=0,$n=7*$l-$c;$i<$n;$i++)array_push($a,' '); // 배열 뒤 추가
$a=array_chunk($a,7); // 7개씩 나누기
?>
$a의 배열값은?
Array
(
[0] => Array
(
[0] =>
[1] =>
[2] =>
[3] =>
[4] => 01
[5] => 02
[6] => 03
)
[1] => Array
(
[0] => 04
[1] => 05
[2] => 06
[3] => 07
[4] => 08
[5] => 09
[6] => 10
)
[2] => Array
(
[0] => 11
[1] => 12
[2] => 13
[3] => 14
[4] => 15
[5] => 16
[6] => 17
)
[3] => Array
(
[0] => 18
[1] => 19
[2] => 20
[3] => 21
[4] => 22
[5] => 23
[6] => 24
)
[4] => Array
(
[0] => 25
[1] => 26
[2] => 27
[3] => 28
[4] => 29
[5] => 30
[6] =>
)
)
▷ 배열값이 이렇다보니 다양하게 활용이 가능합니다.
예를 들어 달력 출력은 아래처럼 하면 되죠.
- 코드
$cal = 'Su Mo Tu We Th Fr Sa'."\n";
foreach($a as $k=>$v)$cal.=implode(' ',$v)."\n";
echo '<xmp style="font-family:GulimChe;">'.$cal.'</xmp>';
- 실행 결과
Su Mo Tu We Th Fr Sa
01 02 03
04 05 06 07 08 09 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
(폰트가 고정폭이 아니라··· ㅠ_ㅠ)
(참고로 리눅스에서는 cal 명령 이용하면 편합니다. $cal = `cal`; // 사용법은 알아서···.)
스타일 적용으로 깔끔한 달력을 만들어보세요. '-');
▷ 지정한 요일이 며칠 있나?
- 코드
$dw = 4; // 목요일 (0:일~6:토)
$dc = 0;
foreach($a as $k=>$v) if(trim($v[$dw]))$dc++;
echo $dc;
- 실행결과
5
뭐 이런 식으로 활용하면 됩니다. 이상 끝.
────────────────────────────────────────
▶ 만년달력
$y : 년
$m : 월
$a : 각 달의 날수
$a[$m-1] : 해당 월의 날수
$b : 1년 1월 1일부터 지정한 날짜(년,월)까지의 날수
$w : 지정한 월의 1일 요일값 (0:일,1:월,~,5:금,6:토)
$l : 해당 월의 총 주 (반복 횟수)
$r : 반환값
for()내에서,
$s : 시작일
$e : 종료일
$o : 주별 임시
<?php
function calendar($y,$m)
{
$a=array(31,28,31,30,31,30,31,31,30,31,30,31);
if($y%4==0&&$y%100!=0||$y%400==0)$a[1]++;
$b=($y-1)*365+(int)(($y-1)/4)-(int)(($y-1)/100)+(int)(($y-1)/400)+1;
$b+=array_sum(array_slice($a,0,$m-1));$w=$b%7;$l=ceil(($a[$m-1]+$w)/7);
$r=str_pad(sprintf('%04d년%02d일',$y,$m),20,' ',STR_PAD_BOTH)."\n";
$r.='일 월 화 수 목 금 토'."\n".str_repeat(' ',$w); // 공백3칸
for ($i=$s=1,$e=7-$w;$i<=$l;$i++,$s=$e+1,$e=$i<$l?$s+6:$a[$m-1])
{
for($j=$s,$o='';$j<=$e;$j++)$o.=sprintf('%02d ',$j);
$r.=rtrim($o);if($i<$l)$r.="\n";
}
return $r;
}
echo '<xmp style="font-family:GulimChe;">'.calendar(2010,4).'</xmp>';
?>
▷ 실행 결과
2010년04일
일 월 화 수 목 금 토
01 02 03
04 05 06 07 08 09 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30
(고정폭 글꼴이 아니라 대충 조정)
▷ 참고
위에도 적었었지만 Linux 등에서는 아래처럼 달력을 구할 수 있습니다.
<?php
$calendar = `cal 4 2010`;
echo '<xmp style="font-family:GulimChe;">'.$calendar.'</xmp>';
?>
April 2010
Su Mo Tu We Th Fr Sa
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
────────────────────────────────────────
▶ 지정한 날짜 사이에 지정한 요일이 며칠 있는가?
<?php
function get_wc($s,$e,$w)
{
$y=date('w',$t=strtotime($s));$g=(strtotime($e)-$t)/86400+1;
for($i=$c=0,$n=$y;$i<$g;$i++,$n=++$n%7)if($w==$n)$c++;
return $c;
}
echo get_wc('2010-04-01','2010-04-30',0).'<br />'; // 4
echo get_wc('2010-04-01','2010-04-30',4).'<br />'; // 5
?> |
|
추천 : 902 |
추천
목록
|
|