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

,

유닉스 타임스탬프는 1970년 1월 1일 0시(GMT 기준)부터 지금까지 시각을 초로 환산한 놈이다. 각종 시간 수치의 기본형으로 활용하기 편하다. GMT 기준으로 시간대 상관없이 유일한 숫자를 가지기 때문이다. 다양한 형태로 변환하기도 편하다.

다음 함수를 참고하면 된다.

fetchUnixTimestamp = function() {
	return Math.floor((new Date()).getTime() / 1000);
}

// 사용: unixTimestamp = fetchUnixTimestamp();

유닉스 타임스탬프가 10자리라는 가정은 잘못된 가정

자바스크립트에서 유닉스 타임스탬프를 구하려면 Date 객체의 getTime() 메서드를 사용하면 된다. 그런데 이렇게 해서 받는 숫자는 밀리초 단위로 돼 있다. 2023년 현재의 시각을 구하면 13자리의 숫자를 돌려 준다. 초 단위로 바꾸면 10자리다.

그런데 염두에 둬야 하는 함정이 있다. 처음에 인터넷 어딘가에서 발견한 함수는 이 유닉스 타임스탬프 밀리초 13자리 숫자를 문자열로 바꾼 후 앞의 10자리를 끊는 형태였다. 아래 코드다.

parseInt(new Date().getTime().toString().substring(0, 10));

이 코드는 Date 객체가 리턴하는 유닉스 타임스탬프 밀리초가 13자리이므로 초를 얻으려면 앞의 10자리를 끊어서 사용하면 된다는 전제 하에 짜여져 있다. 나도 맨 처음엔 위 코드를 사용하고 소개했다.

그런데 아즈키님이 댓글로 문제를 지적해 주셨다. 위 코드는 과거 날짜, 즉 밀리초의 자릿수가 13자리 미만이었던 날짜에 대해서 틀린 결과를 내놓는다는 것이다.

실제로 유닉스 타임스탬프 밀리초가 13자리인 날짜의 범위는 2001년 9월 9일 오전 10시 46분 40초(1000000000초)부터 2286년 11월 21일 오전 2시 46분 39초(9999999999초)까지다. 이 범위를 넘어서면 유닉스 타임스탬프 밀리초는 12자리 이하 혹은 14자리 이상이 된다. 그러면 앞자리 10자리를 끊는 게 아니라 9자리 혹은 11자리를 끊어야 밀리초를 초로 바꿀 수 있게 된다. 원래 함수는 전제 자체가 틀렸던 것이다.

결론적으로 밀리초를 초로 바꾸는 가장 좋은 방법은 1000으로 나눈 뒤 내림하는 것이다. 지금 소개하고 있는 함수는 그렇게 구현한 것이다.

👇 카테고리 글 목록

,

대표글

“자바스크립트, 유닉스 타임스탬프 구하기(javascript unix timestamp)”에 대한 12개의 응답

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

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

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

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

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

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

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

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

    ps. 아래는 php 코드.

    1. ㅋㅋ 앞으론 아즈키 선배라고 부르도록 하죠. ^^ 감사!

  4. 자바스크립트가 자바 보다 더 힘들다 생각합니다.

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

  5. 타임스탬프 구하는 법 찾다가 들리게 되었네요. 감사합니다.

    1. 네 감사합니다

  6. 세상은 넓고 공부할 것은 많군요 +_+
    감사히 배워갑니다

    1. 그렇죠? ^^;;

댓글 남기기