PHP 에서 날짜를 다루는데는 주로 date(), strtotime(), mktime() 의 세가지 함수를 사용 합니다. 각각의 사용법과 몇가지 응용에 대해서 알아보도록 하겠습니다.

1. date() 함수.

string date ( string $format [, int $timestamp ] )

정수형으로 주어지는 timestamp나, timestamp가 주어지지 않았을 경우에는 현재 로컬 시간을 사용하여, 주어진 포맷 문자열에 따라 형식화한 문자열을 반환합니다. 즉 timestamp는 선택적이고, 기본값은 time()의 값입니다. 지원되지 않는 포맷 문자는 그대로 출력됩니다.

<?php
$dateString = date("Y-m-d", time());
echo $dateString;
?>

결과)
2017-01-10

2. strtotime() 함수.

int strtotime ( string $time [, int $now = time() ] )

주어진 날짜 형식의 문자열을 1970년 1월 1일 0시 부서 시작하는 유닉스 타임스탬프로 변환합니다. 두번째 인자가 주어지면 주어진 타임스탬프를 기준으로 계산되어 집니다. 날짜가 주어지지 않고 변화량만 주어지면 로컬 타임이 사용됩니다.  +1 day, +1 week 등이 사용될 수 있고, 음수값도 사용됩니다.

<?php
$timestamp = strtotime("+1 week");
echo date("Y-m-d", $timestamp), "<br/>";

$timestamp = strtotime("2016-12-01 +1 week");
echo date("Y-m-d", $timestamp), "<br/>";
?>

결과)
2017-01-17
2016-12-08

3. mktime() 함수.

int mktime ([ int $hour = date("H") [, int $minute = date("i") [, int $second = date("s") [, int $month = date("n") [, int $day = date("j") [, int $year = date("Y") [, int $is_dst = -1 ]]]]]]] )

인자로 주어진 값(시,분,초,월,일,년)에 대응하는 타임스탬프를 반환합니다.

<?php
$timestamp = mktime(0, 0, 0, 1, 1, 2017);
echo date('Y-m-d', $timestamp);
?>

결과)
2017-01-01

4. 사용 예제 입니다.

- 특정월의 마지막 날짜를 구하는 방법입니다.

방법은 date함수의 포맷문자열 't'를 사용합니다. 't'는 주어진 월의 일수를 구하는 형식 문자 입니다.

$lastDay = date('t', strtotime("2017-01-01"));

타임스탬프는 mktime 으로 구할수도 있습니다.

$lastDay = date('t', mktime(0, 0, 0, 1, 1, 2017));

mktime함수의 인자는 순서대로 시간, 분, 초, 월, 일, 년도 입니다.

- 특정 날짜의 요일을 구하는 방법 입니다.

$day = "2017-01-10";

date 함수의 'w' 포맷 문자는 0부터 6까지의 숫자값을 반환합니다. 순서대로 일~토 를 나타냅니다.

$weekString = array("일", "월", "화", "수", "목", "금", "토");
echo($weekString[date('w', strtotime($day))]);

- 하루전 날짜를 구하는 방법 입니다.

$day = "2017-01-10"; 의 하루전 날짜인 "2017-01-09" 를 문자열로 구하려고 합니다.

$beforeDay = date("Y-m-d", strtotime($day." -1 day"));

날짜 뒤에 "+1 day", "+1 month", "+1 year", "+1 week" 등의 문자열을 붙여서 날짜를 계산할 수 있습니다.

5. date 함수에서 사용할 수있는  포맷문자열 입니다.

--- 일 ---
d  :  일, 앞에 0이 붙는 2 숫자  [ 01에서 31 ]
D  :  요일 글자 표현, 3 문자 [ Mon에서 Sun ]
j  :  앞에 0이 붙지 않는 일 [ 1에서 31 ]
l  :  (소문자 'L') 요일의 완전한 글자 표현 [ Sunday에서 Saturday ]
N  :  요일의 ISO-8601 숫자 표현 (PHP 5.1.0에서 추가) [ 1(월요일)에서 7(일요일) ]
S  :  일 영어 접미사, 2 문자 [ st, nd, rd, th. j와 같이 사용하기 좋음. ]
w  :  요일 숫자 표현 [ 0(일요일)에서 6(토요일) ]
z  :  해당 연도 일차 [ (0에서 시작) 0에서 365 ]

--- 주 ---
W  :  ISO-8601 주차, 주는 월요일에 시작 (PHP 4.1.0에서 추가) [ 예시: 42 (그 해의 42번째 주) ]

---월 ---
F  :  January나 March 같은 월의 완전한 글자 표현 [ January에서 December ]
m  :  0이 붙는 월 숫자 표현 [ 01에서 12 ]
M  :  월의 축약 글자 표현, 3 문자 [ Jan에서 Dec ]
n  :  0이 붙지 않는 월 숫자 표현 [ 1에서 12 ]
t  :  주어진 월의 일 수 [ 28에서 31 ]

--- 연 ---
L  :  윤년 여부 [ 윤년엔 1, 그 외엔 0 ]
o  :  ISO-8601 연도. Y와 같지만, ISO 주차(W)가 전해나 다음해에 해당하면, 그 연도를 사용합니다. (PHP 5.1.0에서 추가) [ 예시: 1999나 2003 ]
Y  :  연도의 완전한 숫자 표현, 4 숫자 [ 예시: 1999나 2003 ]
y  :  도의 두 숫자 표현 [ 예시: 99나 03 ]

--- 시간 ---
a  :  오전과 오후의 소문자 [ am 또는 pm ]
A  :  오전과 오후의 대문자 [ AM 또는 PM ]
B  :  스와치 인터넷 시간 [ 000에서 999 ]
g  :  0이 붙지 않는 12시간 형식 시 [ 1에서 12 ]
G  :  0이 붙지 않는 24시간 형식 시 [ 0에서 23 ]
h  :  0이 붙는 12시간 형식 시 [ 01에서 12 ]
H  :  0이 붙는 24시간 형식 시 [ 00에서 23 ]
i  :  0이 붙는 분 [ 00에서 59 ]
s  :  초, 0이 붙음 [ 00에서 59 ]
u  :  마이크로초 (PHP 5.2.2에서 추가) [ 예시: 54321 ]

--- 시간대 ---
e  :  시간대 식별자 (PHP 5.1.0에서 추가) [ 예시: UTC, GMT, Atlantic/Azores ]
I  :  (대문자 i) 일광 절약 시간 여부  [ 일광 절약 시간이면 1, 아니면 0 ]
O  :  그리니치 시간(GMT)과 시차 [ 예시: +0200 ]
P  :  시와 분 사이에 콜론이 들어가는 그리니치 시간(GMT)과 차이 [ 예시: +02:00 ]
T  :  시간대 축약어 [ 예시: EST, MDT ... ]
Z  :  시간대 오프셋 초. UTC 서쪽은 항상 음수, UTC 동쪽은 항상 양수 [ -43200에서 50400 ]

--- 날짜/시간 표현 ---
c  :  ISO 8601 날짜 (PHP 5에서 추가) [ 2004-02-12T15:19:21+00:00 ]
r  :  ≫ RFC 2822 형식 날짜 [ 예시: Thu, 21 Dec 2000 16:01:07 +0200 ]
U  :  유닉스 에포치(January 1 1970 00:00:00 GMT)부터 초수 [ time() 참조 ]

 

출처: https://offbyone.tistory.com/38 [쉬고 싶은 개발자:티스토리]

자바스크립트로 form 태그의 input 검증(validation) 후에 수동으로 submit 처리하기
 
기본적으로 <form>태그를 사용하여 입력한 데이터를 웹서버로 전송할때 <input>태그의 type="submit"을 통해 전송버튼을 만들어 사용합니다.
input submit의 경우 form 안에 있는 모든 inputvalue를 전송하게 되는데, 이경우 각 input에 값이 입력되었는지 등의 여부를 검증(validation)할 수 없습니다.
따라서 이 경우 <input type="button">으로 버튼을 하나 만들고 onClick이벤트를 직접 핸들링하여, 버튼을 클릭했을 때 각 입력값을 검증한 후 수동으로 submit처리 해주어야 합니다.
 
예제
다음은 form의 입력값을 검증하고 수동으로 submit 처리하는 예제입니다. git링크
 

javascriptStudy/javascriptStudy/formValidation.html at master · dololak/javascriptStudy

Contribute to dololak/javascriptStudy development by creating an account on GitHub.

github.com

 

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
    <title>로그인</title>
    <script type="text/javascript">
        function login(){
            var loginForm = document.loginForm;
            var userId = loginForm.userId.value;
            var password = loginForm.password.value;
            
            if(!userId || !password){
                alert("아이디와 비밀번호를 모두 입력해주세요.")
            }else{
                loginForm.submit();
            }
        }
    </script>
</head>
<body>
    <form name="loginForm" action="http://localhost/login"  method="post">
            계정 : <input type="text" name="userId"><br>
            비밀번호 : <input type="password" name="password"><br>
            <input type="hidden" name="loginType" value="admin">
            <input type="button" onclick="login()" value="로그인">
    </form>
</body>
</html>

form 태그의 로그인 button에 onClick 이벤트의 핸들러로 login() 함수를 연결해두었습니다. 로그인 버튼을 클릭하게 되면 <script>태그에 선언되어있는 login()함수가 핸들러로 호출됩니다.

<input type="button" onclick="login()" value="로그인">

핸들러로 사용한 login()함수입니다. document 객체를 이용해 loginForm을 조작합니다. DOM을 이용하면 name 속성을 통해 쉽게 접근할 수 있습니다. 
javascript에서는 값이 0, undefined, null, 공백인 경우 false로 처리하는 특성이 있기때문에 not을 의미하는 !연산자를 이용하여 입력 여부를 판단하였습니다.

function login(){
    var loginForm = document.loginForm;
    var userId = loginForm.userId.value;
    var password = loginForm.password.value;
    
    if(!userId || !password){
        alert("아이디와 비밀번호를 모두 입력해주세요.")
    }else{
        loginForm.submit();
    }
}

값이 하나라도 입력되지 않은 경우 alert()를 이용해 경고를 띄우고 모두 입력된 경우 form 객체의 submit()메서드를 실행합니다. 
submit()메서드는 이미 브라우저에 정의되어 있는 메서드로 실제 input type="submit"이 클릭 되었을 때 실행되는 메서드입니다.

테스트
값을 하나라도 입력하지 않고 로그인 버튼을 클릭하면 경고창이 나타납니다.

모두 입력한 경우에는 경고창이 나타나지 않고 submit()이 실행되고 action 속성에 정의된 경로로 HTTP 요청을 수행합니다.

예제이므로 웹서버가 준비되어 있지 않아 이후 내용은 별다른게 없습니다.

HTTP 요청 메시지를 분석해보면 입력한 내용들이 잘 전송된것을 볼 수 있습니다. 여기서 눈여겨 볼 점은 input type="hidden"으로 선언되어 있던 input의 value값 또한 전송이 된다는 점 입니다.

POST http://localhost/login HTTP/1.1
Host: localhost
Proxy-Connection: keep-alive
Content-Length: 44
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: null
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like  Gecko) Chrome/75.0.3770.142 Safari/537.36
Accept-Encoding: gzip, deflate, br
Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7
 
userId=dololak&password=1234&loginType=admin

 

출처 : https://dololak.tistory.com/728

'Programming > PHP' 카테고리의 다른 글

PHP 날짜 함수 사용하기 - date, strtotime, mktime  (1) 2024.06.14
D-Day 계산기  (0) 2016.05.25

<?
        //디데이 구하는 계산식 추가 - 20151127 gdkwon
        $days1 = intval((strtotime(date("Y-m-d",time())) - strtotime("2016-05-28")) / 86400);

        if($days1>0){
                $dmark = "+";
                $days2 = $days1;
        }else{
                $dmark = substr($days1,0,1);    //$days1의 부호
                $days2 = substr($days1,1);
        }

        $dslen = strlen($days2);                        //$days2의 길이


        if($days1==0){
                $dday = "D-day";
        }else if($dslen == 1){                          //$dslen이 한자리면 앞에 0을 붙임
                $dday = "D".$dmark."0".$days2;
        }else{
                $dday = "D".$dmark.$days2;
        }
?>

<head>
<meta name="viewport" content="user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, width=device-width" />
</head>
<p><h2><?=$dday?></h2></p>

[설명] strtotime("2016-05-28")) 항목에 d-day 의 날짜를 입력해준다.