2018년 5월 14일 월요일

[PHP예제] 071 마감일을 구하고 싶을 때




 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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>마감일을 구하고 싶을 때</title>
    <link href="style.css" rel="stylesheet">
</head>
<body>
<div>
<?php
date_default_timezone_set('Asia/Seoul');

$cutOffDay = 25;
$date = mktime(0, 0, 0, 10, 27, 2013);

echo "<p>마감일:" . $cutOffDay . "일</p>";
echo "<p>계산 기준일:" . date('Y/m/d', $date) . "</p>";

$ret = getCutOffDate($cutOffDay, $date);
if( $ret !== false )
{
  echo "<p>결과:" . date('Y/m/d', $ret) . "</p>";
}
else
{
  echo "<p>잘못된 마감일입니다.</p>";
}

// getCutOffDate() 함수
// 제1인수에는 마감일을 지정함. 1에서 31의 숫자를 지정함
// 제2인수에는 계산 기준일의 타임스탬프를 지정함
// 생략했을 경우는 현재 일시의 마감일을 계산함

function getCutOffDate($cutOffDay, $timestamp = false)
{
  // 타임스탬프를 생략할 때는 현재의 일시를 계산 기준일로 함
  if( $timestamp === false )
  {
    $timestamp = time();
  }

  // 지정한 마감일이 1에서 31의 범위에서 지정되었는지 확인함
  if( $cutOffDay < 1 || $cutOffDay > 31 )
  {
    return false;
  }

  // 계산 기준일의 타임스탬프로부터 년, 월, 일, 말일을 구함
  $date = getdate($timestamp);
  $year = $date['year'];
  $month = $date['mon'];
  $day = $date['mday'];
  $endOfMonth = (int) date('t', $timestamp);

  // 말일이 지정 마감일보다 앞이면 이번 달 말일을 마감일로 반환함
  // 말일로 지정한 마감일은 모두 숫자이므로
  // min() 함수를 사용해 한 줄로 값을 설정하고 대입함
  $fixedCutOffDay = min($endOfMonth, $cutOffDay);

  // 계산 기준일이 마감일을 지나는 경우 다음 달의 말일을 마감일로 반환함
  if( $day > $fixedButOffDay )
  {
    $month++; // 월을 가산함

    // 지정 마감일과 다음 달의 말일을 비교해 작은 쪽을 마감일로 지정함
    $endOfNextMonth = (int) date('t', mktime(0, 0, 0, $month, 1, $year));
    $fixedButOffDay = min($endOfNextMonth, $cutOffDay);
  }

  // 마감일의 타임스탬프를 반환함
  return mktime(0, 0, 0, $month, $fixedCutOffDay, $year);
}
?>
</div>
</body>
</html>



댓글 없음:

댓글 쓰기