• [규칙 세우기]날짜 및 시간 관련 타입과 사용
    개발공부 2022. 11. 18. 23:57
    반응형

     

    컴퓨터가 시간을 처리하는 단위로 많이 사용하는 세 가지가 있고 각각이 의미는 다음과 같다.

    • 초, 세컨드 (seconds, s): 1 초
    • 밀리초, 밀리세컨드 (milliseconds, ms): 1/1000 초
    • 나노초, 나노세컨드 (nanoseconds, ns): 1/100,000,000 초

     

     

    MySQL

    데이터베이스의 저장 타입은 다섯 가지가 있다.

    • DATE : YYYY-MM-DD 형식으로 년-월-일 형태의 값을 저장
    • DATETIME : YYYY-MM-DD HH:MM:SS 형식으로 년-월-일 시:분:초 형태의 값을 저장
    • TIMESTAMP : 1970-01-01 00:00:00 UTC  부터 초수를 저장
    • TIME : HH:MM:SS 형식의 시간만 저장
    • YEAR : YY, YYYY 형식의 연도만 저장

    DATETIME, TIMESTAMP, TIME를 보면 MySql에서는 초 단위 아래의 컬럼을 저장하는 적당한 타입은 없다.

    TIMESTAMP(6) 등으로 설정을 해주면, 밀리초까지 저장할 수 있지만, 게시물이 언제 수정되었는지 확인하는 컬럼을 만드는 상황등에서는 특별한 경우가 아니면 사용하지 않는다.

     

    Protobuf

    protocol buffers well known types들 중에 날짜 타입은 하나 있다.

    Timestamp 형식으로 1970-01-01 00:00:00 UTC 부터 계산된 와 그 초와 다음 초 사이의 값을 저장하는 나노초를 가진다.

    Timestamp {
        int64 seconds = 1;
        int32 nanos = 2;
    }

    (사실상 int형이기 때문에 miliseconds를 잘못 넣어줄 경우도 있을 수 있음)

     

     

    Kotlin(Java)

    Java와 Kotlin에서 날짜와 시간 관련 타입은 굉장히 많지만, 다음 두 가지를 자주 사용한다.

     

    LocalTime: 주로 사용하며, LocalTime.of(2022, 10, 10)과 같이 간단하게 생성이 가능하여 서버내에서 시간값이 필요하지 않을 경우 많이 사용

    Instant: 다음 두 가지 타입을 다른 서버 혹은 DB로 전달 받거나 전달할 경우 사용

    • 1970-01-01 00:00:00 UTC 부터 계산 된 초 : Instant.now().epochSecond (long타입 )으로 생성 가능
    • 1970-01-01 00:00:00 UTC 부터 계산 된 밀리초 : Instant.now().toEpochMilli() (long타입)으로 생성 가능
    • now()를 찍은 순간 현재초와 다음초 사이를 0~999,999,999 (1억)으로 나누어 얼마나 지났는지 체크하는 나노초 : Instant.now().nano

     

    • 전달 받은 seconds값과 millisecondes값을 Instant로 변경
    const seconds: Long = 1668688924L
    const milliseconds: Long = 1668780069320L
    
    Instant.ofEpochSecond(seconds) // 2022-11-17T12:42:04Z
    Instant.ofEpochMilli(milliseconds) // 2022-11-18T14:01:09.320Z

     

    • ofEpochSecond() 메서드는 오버라이드 된 함수가 하나 더 있어, 나노초까지 주입할 수 있다.
    Instant.now().nano

     

    Javascript

    javascript는 Date 타입이 있다. 보통 Datepicker 컴포넌트를 사용해서 String 형태의 날짜(YYYY-MM-DD)값을 전달받는다. 전달 받은 날짜를 서버로 전달하기 위해 Date 타입으로 변경한다.

    const date = new Date('2022-05-25');
    date.getTime(); // getTime 메소드를 사용하여, milliseconds 반환

    javascript 라이브러리에서는 1970-01-01 00:00:00 UTC 부터 계산 된 밀리초 반환만 가능하다.

    직접 1000을 나누어 1970-01-01 00:00:00 UTC 부터 계산 된 초를 반환 할 수 있게 만들어주자

    const date = new Date('2022-05-25');
    date.getTime(); // getTime 메소드를 사용하여, milliseconds 반환
    
    const secondsSinceEpoch = date.round(now.getTime() / 1000)

     

     

    결론

     사용자의 화면으로 부터 전달받아 여러 서버를 거쳐 DB에 저장되기까지 날짜와 시간 타입 사용에 대한 약속이 필요하다.

    1. nano 혹은 milliseconds까지 사용할 필요가 있는가?
    2. 여러 서버를 거치는 타입은 number, long 등의 숫자 타입이다. 초인지, 밀리초인지, 타입을 확인할 수 있는 변수명이 있는가?
    반응형

    댓글

Designed by Tistory.