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

bash script에서 문자열을 맨앞이나 맨뒤에서 부터 잘라내 버리고 싶은 경우가 있다. 요놈들을 참조하면 원하는 만큼 매치된 문자열을 제거할 수 있다.

${string#substring} - 맨앞에서부터 가장 짧게 매치된 문자열을 지운다.
${string##substring} - 맨앞에서부터 가장 길게 매치된 문자열을 지운다.
${string%substring} - 맨뒤에서부터 가장 짧게 매치된 문자열을 지운다.
${string%%substring} - 맨뒤에서부터 가장 길게 매치된 문자열을 지운다.

간단한 예제로 앞에서 부터 짤라보자.

STR=ABC123abc123ABC
#   |--|            가장 짧은거 (#)
#   |--------|      가장 긴거 (##)

echo ${STR#A*1}     # 23abc123ABC
echo ${STR##A*1}    # 23ABC

이번엔 뒤에서 부터 짤라보자.

STR=ABC123abc123ABC
#              |--| 가장 짧은거 (%)
#        |--------| 가장 긴거 (%%)

echo ${STR%3*C}     # ABC123abc12
echo ${STR%%3*C}    # ABC12

맨앞이나 맨뒤에서부터 매칭되지 않으면 잘리지 않는다.

echo ${STR#a*c}     # ABC123abc123ABC
echo ${STR%%a*c}    # ABC123abc123ABC

출처 : https://blog.leocat.kr/notes/2018/01/18/shell-remove-substring

1. 자르기

[ 명령 ]
# echo "scale=2;1.16628996273/1" |bc -l

[ 결과 ]
1.16

여기에서 scale=2 부분이 소수점 두 자리까지 출력을 한다는 의미 입니다.

그리고 1.16628996273/1 는 계산 식인데, 숫자만으로 표현하면 처리가 되지 않으니

꼭 계산식으로 해야 해서 나누기 1을 해준 것입니다.

 

2. 반올림 하기

[ 명령 ]
# echo $(printf %.2f 1.16628996273)

[ 결과 ]
1.17

출처 : https://sysdocu.tistory.com/1526


bash 파일 내에 sed 명령어를 넣었는데, crontab 으로 실행했을 때 먹통이 되는 경우

예) a.sh

sed -i 's/find/repl/g' a.txt

이 경우는 a.txt 파일의 인코딩이 UTF-8 이고, crontab 실행 환경은 인코딩이 ko_KR.eucKR 인 등 서로의 인코딩이 맞지 않아 발생하는 문제임.

bash 내 인코딩 설정을 추가하면 됨.

예) a.sh (UTF-8 파일인 경우)

export LANG=ko_KR.UTF-8
sed -i 's/find/repl/g' a.txt


이렇게 하면 실행환경의 인코딩이 변경되어 정상 동작

출처 : https://tod2.tistory.com/175


1. 아파치 accesslog 중 특정 도메인을 추출한 파일 (domain.com.txt)의 해외 접속 기록만 확인

cat domain.com.txt | awk '$1 != "KR" {print $0}' 
(1번째 필드가 mod_geoip에 의해 출력되어야함, 로그포맷 변경 및 GeoIP와 GeoIP-devel 설치 필수)


쉘스크닙트를 작성하다 보면 특정 명령의 성공 유무가 궁금합니다.

이것은 해당 Process의 return 값하고 관계가 있을 수 있는데
C 프로그램의 main() 함수에서의 return 값 하고도 관계가 있습니다.
혹은 python 에서의 sys.exit(9) 같은 것과도 동일합니다.

모두 동일한데 0 이 리턴되면 정상이고 0이 리턴되지 않으면
오류로 간주합니다.

예를 들어

ls /etc | grep hosts

라는 명령을 실행하면

$ ls /etc | grep hosts
hosts
hosts.allow
hosts.deny


와 같은 결과가 나오고

$ echo $?
0

와 같이 이전 실행명령의 리턴값 ($?) 을 찍어보면 0 으로써 성공했다는 것이 나옵니다.

ls /etc 에 파일이나 폴더 목록을 보면서 hosts 라는 것이 있는 가를 grep 해본 결과입니다.

이제 host 대신 h_ost 라는 것을 대신 해 보면,

$ ls /etc | grep h_osts
$ echo $?
1


와 같이 0 이 아닌 값이 나옵니다.

이것을 기본적인 shell 스크립트로 만들어 본다면,

#!/bin/sh
ls /etc | grep h_osts
if [ $? -eq 0 ];then
    echo "CMD OK!"
else
    echo "CMD Failure!"
    exit 9
fi
echo "After CMD OK!"

위와 같이 만들 수 있습니다.

그런데 더 간단하게 보이는 방법으로서
명령을 실행하고 나서 쉘의 && || 논리 연산자를 이용하는 방법이 있습니다.

ls /etc | grep h_osts && echo "CMD OK!" || echo "CMD Failure!"

와 같이

CMD && 성공인경우의명령 || 실패인 경우의명령

과 같이 한줄로 표현 가능합니다. 물론 가독성을 위하여

ls /etc | grep h_osts \
    && echo "CMD OK!" \
    || echo "CMD Failure!"; exit 9
echo "After CMD OK!"

와 같이 줄 수 있습니다. (처음에는 적어도 그렇게 생각했지요) 

이것은 sh (bash 도 동일)의 논리 연산자의 실행 최적화와 관계 있는데요,

조건식 && 결과1 || 결과2

와 같은 구문이 있다고 하였을 때
조건식이 True 이면 && 다음 구문까지 확인하여 마저 True인가를 확인하지만 이미 True이기 때문에 && 다음의 결과1은 실행시키지만, || 다음의 결과2 구문은 실행시키지 않습니다.
조건식이 False 이면 그 반대로 || 다음의 결과2 구문만 실행합니다.

그런데 위의 명령을 수행하면 성공 하던 안하던 간에 무조건 exit 9으로 종료를 해 버렸습니다.


생각해보니 
명령1 && 명령2 || 명령3
이 하나의 명령이고 그것에 이어 (';') exit 9 명령이 수행되기 때문입니다.

여기서는 위의 명령3을 exit 9 까지 하나로 묶어 처리해야 합니다.

결론은,

ls /etc | grep h_osts \
    && echo "CMD OK!" \
    || echo "CMD Failure!"; exit 9; }
echo "After CMD OK!"

와 같이 해 주면 되는 것이었습니다.

어느 분께는 도움이 되셨기를...

[출처] http://egloos.zum.com/mcchae/v/11221790



그냥 echo 명령만 사용하면 자동으로 줄바꿈이 되는데, 전에 출력한 문자열을 지우고  새 문자열을 겹쳐 쓰고 싶다면 -n 옵션과 -e 옵션을 사용하자.

-n 옵션은 줄바꿈을 하지 않는 것이고, -e 옵션은 리턴(\r), 탭(\t) 등을 사용할 수 있게 해 주는 옵션이다.

echo "abc\tdef"
abc\tdef
echo -e "abc\tdef"
abc    def

전에 출력한 문자열을 지우고 그 자리에 새로운 문자열을 출력하려면, 첫번째 문자열을 출력할 때 -n 옵션으로 줄바꿈을 억제한 후에 다음 문자열을 출력할 때 -e 옵션으로 리턴(\r)을 출력해서 프롬프트를 줄 시작점으로 보내주면 된다. 아래의 예시를 참고하자.

echo -n "this is the first."
sleep 3
echo -e "\rthis is the 2nd.   "

첫번째 문자열 출력후 3초후에 두번째 문자열을 같은 줄에 겹쳐 쓰게 된다.

두번째 문자열이 첫번째보다 짧다면 이전 출력 뒷부분이 남을 것이므로 뒤쪽에 공백(space)을 충분히 주자.

shell script에서 진행 상황을 표시해 주고 싶을 때 요긴하게 사용할 수 있다.

아래는 위의 내용을 응용한 쉘스크립트 예제파일이다.

processing.sh


[출처] http://bahndal.egloos.com/406163



Linux Shell Script 에서 

한 줄 주석은 해당 라인의 앞에 #만 적으면 된다.

여러 줄 주석은 :<<'END' 부터 END 까지로 가능하다.

# 한 줄 주석

:<<'END'
여러줄
주석
END


#!/bin/bash                                                   #!/bin/bash

string='www.sysadm.kr';                                     string='www.sysadm.kr';


if [[ $string == *"sysadm"* ]]                            if [[ $string =~ .*sysadm.* ]]
then                                                           then
  echo "It's there!";                       또는              echo "True"
else                                                            else
echo "There is no String!"                                   echo "False"
fi                                                               fi