자바스크립트에서 유닉스 타임스탬프(유닉스 타임스탬프는 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자리 미만으로 떨어지는 몇 년 전 시간을 다루게 되면 원래의 함수는 오류를 내게 된다.
함수는 생각할 거리를 많이 준다.
올바른 코드 활용법을 알려 주시는 아즈키 님께 감사! ^^
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 코드.
ㅋㅋ 앞으론 아즈키 선배라고 부르도록 하죠. ^^ 감사!
자바스크립트가 자바 보다 더 힘들다 생각합니다.
글쎄요, 그렇게 말하는 건 좀 어폐가 있다고 봅니다. 자바스크립트도 하나의 언어고, 자바도 하나의 언어라고 생각하는 게 출발이라고 봐요.
타임스탬프 구하는 법 찾다가 들리게 되었네요. 감사합니다.
네 감사합니다
세상은 넓고 공부할 것은 많군요 +_+
감사히 배워갑니다
그렇죠? ^^;;