Skip to Content
Go Back
안형우

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

📌 워드프레스, 답답한 빌더와 플러그인 대신 시원하게 커스터마징하기(강의) 2023-01-15
📌 아무도 말하지 않는 PHP의 좋은 점 2018-10-13
📌 유지보수하기 쉬운 CSS 전략(슬라이드) 2016-12-20
📌 워드프레스 테마에서 템플릿 파일 매칭 순서 2013-05-12
📌 [번역] CSS 코드 냄새 2013-01-01

자바스크립트, 유닉스 타임스탬프 구하기(javascript unix timestamp)

자바스크립트에서 유닉스 타임스탬프(유닉스 타임스탬프는 1970년 1월 1일 0시부터 지금까지 시각을 초로 환산한 놈이다. 각종 시간 수치의 기본형으로 활용하기 편하다. 다양한 놈으로 변환해 사용할 수 있기 때문이다.)를 구해야 할 일이 생겼다. php는 time() 함수를 사용하면 쉽게 구할 수 있다. 그런데 자바스크립트는 쉽게 구해 주는 게 없는 듯했다. 그래서 검색했더니 관련 내용이 나왔다.

http://tutorials.yaxay.com/showthread.php?t=45778에서 처음 접한 함수 모양은 아래에서 주석처리한 부분이다.

그런데 역시, 아즈키님이 댓글로 다른 의견을 주셨는데, 아주 배울만한 내용이다. 그래서 아즈키님이 알려 주신 내용으로 코드를 수정했다.

fetch_unix_timestamp = function()
{
	//return parseInt(new Date().getTime().toString().substring(0, 10));
	return Math.floor(new Date().getTime() / 1000);
}

timestamp = fetch_unix_timestamp();

코드 설명을 하겠다.

parseInt 는 정수가 아닌 놈을 정수로 바꾸는 함수다.

원래 코드에서는 new Date()로 오늘 날짜 정보를 담은 객체를 생성한 후 getTime() 함수로 Unix timestamp 밀리세컨드를 구한 것이다. 즉, unix timestamp를 1000분의 1초 단위로 구한 것. 그 후 toString 함수를 사용해 문자열로 바꿔 10자리를 끊었다. 이러면 맨 뒤의 세자리가 사라지니까 unix timestamp를 초단위로 구할 수 있게 된다.(현재 시간을 구하면 unix timestamp는 10자리의 숫자를 돌려 준다. 예컨대, 내가 지금 글을 쓰는 이 시각은 1270975817 다.) 자, toString으로 만든 후 10자리를 끊었으므로 이놈은 문자열 자료형이 된다.이놈을 정수로 바꾸기 위해 사용한 것으로 보인다.

아즈키님이 알려 준 새 코드는 이렇다.

new Date().getTime() / 1000

원리는 간단하다. subString을 사용해서 10자리를 끊으면 안 된다는 것이다. 현재 시각이 1270975817초이므로 아마 앞으로 8000000000초 미래까지는 유닉스 타임스탬프의 시각이 계속 10자리일 것이다. 그리고 과거 270000000초 전까지는 아마 10자리일 것이다.

자, 오류를 발견할 수 있다. 무슨 말이냐? 2001년 1월 14일의 유닉스 타임스탬프 수치를 보자. 밀리세컨드까지 구하면 979462925793이다. 아즈키 님이 준 코드를 사용하면 979462925이 나온다. 그런데 원래 코드를 사용하면 열 자리를 끊으므로 9794629257이 나온다.

즉, unxi timestamp 초가 10자리 미만으로 떨어지는 몇 년 전 시간을 다루게 되면 원래의 함수는 오류를 내게 된다.

함수는 생각할 거리를 많이 준다.

올바른 코드 활용법을 알려 주시는 아즈키 님께 감사! ^^

안녕하세요. 14년차 풀스택 웹개발자 안형우입니다. 이 블로그에서는 WordPress, PHP, CSS, 사용성, 리눅스 서버 등 풀스택 웹개발에서 마주하는 다양한 문제 상황과 해결책, 필요한 개념들을 다룹니다. 👉 소개


작업물

댓글 (12개)

  • substring(0, 10) 을 쓰는건 바람직하지 않다고 생각합니다.
    getTime() 이 1/1000 초의 UnixTime 을 구해주는 함수인데, 현시점에서 그 수치가 13자리라고 앞에 10자리를 짜르는건 문제가 있을 가능성이 있습니다.
    물론 정상적인 시간대를 사용한다는 가정하에서는 괜찮습니다만, 과거의 시간대를 사용하는 시스템에서 문제가 생길 수도 있겠죠. 혹은 14자리가 되는 아주 먼 미래에요.
    저라면 아래처럼 사용할 것 같네요.
    Math.floor(new Date().getTime() / 1000)

    • 아즈키님 댓글이 왜 없을까 생각하고 있었는데, 역시 프로그램 관련된 것을 올리니까 달아 주시는군요! ^^ 인용하고 코드 수정할게요! 감사해요.

  • 맨날 태클만 걸어서 죄송하네요 ^^;
    서로 정보를 공유하고 발전하자는 의미니까 좋게 봐주세요~ // 제가 커뮤니케이션에 좀 서툴..

    그리고 한가지;
    parseInt 의 경우 안전하게 사용할려면 두번째 인자에 진수를 적어주셔야되요(10진수만 있는건 아니니까요).
    이미 알고 계실지도 모르지만ㅋ 혹시 이해가 안되신다면 아래 코드를 실행시켜보시면 이해가 되실듯해요.

    parseInt(“7”); //7
    parseInt(“07”); //7
    parseInt(“8”); //8
    parseInt(“08”); //0
    parseInt(“08”, 10); //8

    • 배울만한 선배가 없는 상황에서 아즈키님은 마치 선배 같아요 ㅋㅋ 실수하면 지적해 주는 선배님. 앞으로도 잘 부탁드립니다. ^^
      parseInt는 자바스크립트에서만 그런 건가요, 아니면 PHP에서도 그런 건가요?

  • ㅎㅎ 저도 많이 배우고 있습니다. 선배라고 하실 것까지는 없으실 것 같은데요 ^^;; 오히려 태클쟁이에 가깝지요 -.-

    아 저는 javascript 쪽 말씀드린 것인데, 확인해보니 PHP 는 괜찮은 것 같네요(http://php.net/manual/pt_BR/function.intval.php).
    저도 또 하나 배워가네요. :] 앞으로 잘 부탁드려요. ^^;

    ps. 아래는 php 코드.

    • 글쎄요, 그렇게 말하는 건 좀 어폐가 있다고 봅니다. 자바스크립트도 하나의 언어고, 자바도 하나의 언어라고 생각하는 게 출발이라고 봐요.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다