웹마스터 팁

우왓! 조만간 10강이 눈앞이군요. +_+
지금 7강까지 윈도우즈 도움말 형식으로 만들어 두었는데, 기초편이 7강까지라 우선 링크해볼까....하는 생각도 가지고 있습니다만, 윈도우즈 도움말도 만들기가 워낙에 어려운데다가 처음 만들어보는 거라 허접하기때문에.. 욕먹을 것 같아서 관둬버렸습니다. -_-;; 원하시는 분이 있다면 우선 개인적으로 드릴수도... 쿨럭~

사실, 시간에 관련된 개념이나 함수는 그다지 많지 않습니다. 다만, 몇가지 안되는 이것들을 잘 조합하는 법을 잘 모르시는 분이 많아서 질문답변란에서 심심치 않게 볼 수 있는 질문이 되어버렸습니다. ^^;; 그래서 오늘은 시간을 다루는 법에 대해서 강의를 하도록 하겠습니다. 에헴~

우선은 UNIXTIME(정확히는 UNIX Timestamp입니다) 이라는 시간체계를 알아둘 필요가 있습니다. UNIXTIME은 정수형 숫자인데, 1970년 1월 1일 0시 0분 0초 GMT 시간이후 지난 시간을 초로 환산한 것입니다. 머... 기준은 알아둘 필요가 없고, 다만 "초 단위"라는 것만 기억하시면 되겠습니다. 즉 UNIXTIME 으로 현재시간에서 1시간 뒤를 구하려면 UNIXTIME(현재시간) + 3600 을 하면 된다는 것이죠. UNIXTIME 에 대한 이해가 되시는지요?
PHP에서 현재의 UNIXTIME 값을 구하는 함수가 있는데 바로 time() 입니다. 간단하게 다음 소스를 실행해서 확인해볼 수 있습니다.

echo time();

제가 말했던 대로 숫자로 나타나죠? ^^ 그렇다고 이걸 가지고 다른 사람들한테 이게 현재시간이니까 알아서들 해석해라...라고 할 수는 없으니 이것을 사람이 읽기 편한 형태로 바꿔주는 함수가 있는데 그것이 바로 date() 함수입니다. date 함수의 정의는 다음과 같습니다.

string date ( string format [, int timestamp])

즉 반환되는 값은 string - 문자열형이며 format 으로 이 형태를 지정해주게 됩니다. 뒤쪽에 보면 대괄호로 둘러싸인 부분이 있는데 이 부분은 생략도 가능하다는 뜻입니다. 즉, date( "Y-m-d" ) 와 같은 사용도 가능하며 date( "Y-m-d", 1000000 ) 과 같은 형태도 사용가능하다는 의미입니다. 뒷부분을 생략하면 date의 기준은 현재 시각이 됩니다.
date( "Y-m-d" )과 date( "Y-m-d", time() ) 는 같은 의미라는 거죠. 저 Y-m-d가 무엇을 의미하는지 궁금하시죠? 이제부터 알려드립니다. ^^ format 은 말 그대로 date에서 어떤 식으로 날짜를 변환하는가에 대한 형식인데, format 의 파라미터 문자들은 다음과 같습니다.

a : am 과 pm 중 현재 시간에 맞는 것을 출력한다.
A : AM 과 PM 중 현재 시간에 맞는 것을 출력한다.
d : 일(day), 앞에 0이 붙은 2자리 숫자, 01부터 31까지
D : 요일 이름, 3글자의 영문자. Sun, Mon 등
F : 월 이름, 문자열. January, Febrary 등
g : 시, 0이 붙지 않는 12시간 형식, 1부터 12까지(a, A 등과 사용하지 않으면 시간 혼동의 우려 있음)
G : 시, 0이 붙지 않는 24시간 형식.
h : 시, 12시간 형식. 01부터 12까지
H : 시, 24시간 형식. 00부터 23까지
i : 분, 00부터 59까지
j : 앞에 0이 없는 일, 1부터 31까지(d 참고)
l (소문자 L) : 요일 이름, 문자열. Sunday 등
m : 월 숫자, 01부터 12까지
M : 월 이름, 3글자의 영문자. Jan, Feb 등
n : 월 숫자, 0이 붙지 않음. 1부터 12까지
O : 그리니치 시간(GMT기준)과의 차이, 예를 들면 +0200 (한국은 GMT+9 이므로 +0900쯤의 값이 나옴)
s : 초, 00부터 59까지
S : 날짜를 위한 영어의 서수 접미사. 예를 들면 "st", "nd" 등등(1st, 2nd 등으로 사용하는거 아시죠?)
t : 주어진 월의 일수 혹은 주어진 달의 마지막 일, 28부터 31까지
w : 요일 숫자, 0(일요일) 부터 6(토요일)
Y : 네자리 연도, 예) 1999
y : 두자리 연도, 예) 99
z : 해당 연도의 날짜수, 0부터 366까지

몇가지 빠진 것들이 있는데, 어떤 것인지는 스스로 알아서 공부해보도록 하세요. 자주 쓰이는 것들이 아니라서 빼두었으니 매뉴얼에서 찾아보고 이런 것들이 있었다...는 것 정도는 알고 넘어가시는 것이 좋습니다. 자... 그럼 만약에 "Year: 2003" 와 같이 출력하고 싶다면 어떻게 해야할까요? 보시면 Y,a,r 등이 파라미터 문자에 속해있어서 저대로 format string 에 썼다가는 각각 다른값으로 변해져서 나올 것이 뻔하죠. 그럴 경우에는 문자열 변수를 배울때 배웠던 이스케이프 문자 역슬래시 를 응용합니다.

echo date("Year");

e는 파라미터 문자에 속하지 않으므로 이스케이프 문자를 붙여주지 않아도 상관없습니다. 자자... 이제 기본기가 되었습니다. 다음은? 당연히 응용편으로 넘어갑니다.
24시간 전의 날짜는 어떻게 알 수 있을까요?

date("Y-m-d H:i:s", time() - 86400);

이해되시죠? 그럼 몇 가지 연습문제를 풀어보시고, 다음으로 넘어갑니다.

문제 1. 내일의 날짜를 "년-월-일 시:분:초" 형태로 출력하라.
문제 2. 오늘의 날짜에서 3일전의 날짜를 위와 같은 형태로 출력하라.

연습 문제를 다 푸셨나요? 그럼 다음은... mktime() 이라는 함수를 배워봅니다.
다행히 계산하려는 시간의 UNIXTIME 을 알고 있으면 좋겠지만, 만약 그렇지 않고 2000-3-12 의 형식에서 UNIXTIME 을 알아내야 할 때가 있는데 그 때 쓰이는 것이 바로 mktime 입니다. mktime의 함수 정의는 다음과 같습니다.

int mktime ( int hour, int minute, int second, int month, int day, int year [, int is_dst])

척 보면 이해가 되실 듯~ 저 중 생략가능한 is_dst 는 daylight saving time 의 약자로 일광절약시간인가 아닌가를 1과 0으로 나타내도록 하고 있습니다. 우리나라 정서와는 별로 맞지 않은 부분이죠. 아마도 쓸일이 거의 없을 것 같습니다. 제 강의를 보실 때마다 매뉴얼을 펴고 계시는 분이라면...(아주 바람직한 태도입니다) mktime() 함수 설명에 있는 Example 1 이 보이실 겁니다.
echo date ("Y-M-d", mktime (0,0,0,12,32,1997));
echo date ("Y-M-d", mktime (0,0,0,13,1,1997));
echo date ("Y-M-d", mktime (0,0,0,1,1,1998));
echo date ("Y-M-d", mktime (0,0,0,1,1,98));

보니까 이해가 팍팍 되시죠? 물론, 위의 소스 모두 잘 작동되는 소스들입니다. ^^;
다음으로 재미있는 것은 strtotime()인데 이것을 잘만 사용하면 시간관련 계산을 편하게 할 수 있습니다. 여태껏 배워왔던 것만 이용한다면 현재 날짜에서 3일을 더하라...라고 했을 때 86400*3 을 계산하거나 코딩하셨어야 할 겁니다. 그렇지만 이런 사용도 가능하죠.
strtotime("+3 days", time());

재미있죠? 그냥 문자를 써주는 것 만으로도 가능합니다. 매뉴얼에도 나와있듯이 다음의 사용도 가능합니다.
strtotime ("+1 week 2 days 4 hours 2 seconds");
strtotime ("next Thursday");
strtotime ("last Monday");

물론 영어가 좀 되야 편하겠지만, 안되도 저정도 연산은 편하게 하실 줄로 압니다. strtotime의 원래 기능은 문자열을 시간으로 바꾸어 주는 것인데, 문자열이라는게 "10 September 2000" 처럼 영문에 맞춰져 있는 것이라 토종(?) 프로그래머들이 사용할 일은 그다지 없어 보여서 생략하고 넘어갑니다. 보다 자세하게 함수의 기능을 알고 싶으시면 Manual을 찬찬히 살펴보시기 바랍니다.

그럼 날짜 계산에 대한 부분이 끝났죠? ^^;; 간단하게 계산하시라고 올렸는데, 어렵게 말하지는 않았는지 모르겠네요.
간단하게 몇가지 응용문제를 넣어봅니다. 많이 해보는 것이 프로그래밍 실력을 기르는 가장 바람직한 방법입니다. +_+ 제가 내드린 과제말고도 다른 과제를 스스로 만들어서 한번 해보세요. 웹관련 질답란에서 "날짜" 나 "시간" 으로 검색해서 올라온 질문들을 한번씩 풀어보는 것도 좋습니다. ^^;

예제) 2000-8-24 (제 여자친구랑 만난날...+_+ 그게 지금 왜나와! 퍽!) 부터 오늘까지 몇 일이 지났나 알아보는 예제입니다.
우선 2000-8-24 일의 UNIXTIME 형식을 구합니다.

mktime(0,0,0,8,24,2000);

그 다음은 오늘날짜에서(오늘이 더 크니까) 저 시간을 빼줍니다.

time() - mktime(0,0,0,8,24,2000);

그럼 오늘이 2000년 8월 24일에서 몇일이 지났는지 초단위로 구할 수 있습니다. 이걸 이제 일 단위로 변환시키는데 그러기 위해서는 초단위를 일단위로 변경해야합니다.

(time() - mktime(0,0,0,8,24,2000))/86400;

그렇지만 86400으로 나눈다고 해서 바로 일단위가 되는 것은 아닙니다. 현재의 시간이 2000년 8월 24일의 기준인 0시 0분 0초와 같으라는 법이 없기 때문에 오차가 생긴만큼 소숫점도 생겨버리게 됩니다. 이걸 과감하게 소숫점 뒷자리를 버리고 정수형태로 바꿔주는 거죠. 그럼 이제 최종적으로 몇일 인지 알 수 있게 되어서 최종 소스는 다음과 같습니다.
<?php
$days = floor( ( time() - mktime(0,0,0,8,24,2000) )/86400 ); //floor 함수는 "버림" 함수입니다. ceil()과 round() 에 대해서도 찾아보세요.
echo $days." 일";
?>

이해 하셨으리라고 보고 문제를 올립니다. 과제를 스스로의 힘으로 하나하나 해결해나가는 기쁨을 느껴보세요. ^^;;

문제 1. 2003-10-31일은 2002-3-7 과 몇 일 차이가 나는가?
문제 2. 2000년 2월은 몇일까지 있었는가?
문제 3. 2002년 5월 마지막 일의 요일은?
문제 4. 태어나서 오늘까지 매일 하루 세끼를 꼬박꼬박 먹는다고 했을때, 몇 그릇이나 드셨어요?


P.S//아직까지 욕이나 기타 악플성 글들이 없어서 좋다고 생각은 하지만 추천도 없는 것이... -_-;;
강의가 별로 인 것인가...