본문 바로가기

Qt

Qt에서 시간 다루기: Unix Time, TimeZone, Embedded Device의 시간 전송

들어가며

며칠 동안 시간 동기화 기능을 개발했다.

시간 동기화란 PC의 시간과 Embedded장치의 시간을 일치시키는 기능이다.

 

기능을 구현하며 시간을 어떤 기준으로 저장하고, 전송하고, 표시하는지 고민하게 되었다.

Qt에서 제공하는 클래스(QDateTime, QDate, QTime Class)의 사용과 프로그래머가 알아야 하는 시간 개념에 대해 배운 내용을 기록해 보려 한다.

UTC 시간의 개념

시간을 다루기 위해 가장 먼저 이해해야 하는 개념은 UTC이다. 

UTC 란 전 세계가 사용하는 국제 표준 시간으로, 영국 그리니치 천문대를 기준으로 정한 시간이다.

UTC란 이름은 영어권에서는 Coordinated Universal Time, 프랑스어권에서는 Temps Universel Coordonné 가 된다.
따라서 국제 표준을 정할 때 중립적인 코드명으로 UTC를 선정했다. 허허...

우리나라의 표준시는 UTC+9(KST)를 사용한다.

즉, UTC 기준의 절대시간(UTC0)시간대(TimeZone) 오프셋을 더한다면, LocalTime을 계산할 수 있다.

ex) 절대시간이 2025-12-17, 12:00:00이고 한국에서 이 시간을 확인한다면 9시간을 더한 2025-12-17, 21:00:00을 표시한다.

OS가 시간을 저장하는 방법 (Unix Time)

운영체제는 시간을 사람이 읽기 쉬운 형태로 저장하지 않는다.

대신 대부분의 OS는 Unix Time 방식을 사용한다.

Unix Time이란 UTC 기준 1970년 1월 1일 00:00:00부터 경과한 초를 정수값으로 나타낸 것이다.

과거 32bit 시스템에서는 이 값을 4바이트 정수로 저장했고,

그 영향으로 현재까지도 "4바이트의 시간 값" 기반의 설계가 많이 남아 있다.

Unix Time에는 시간대(TimeZone) 정보가 포함되지 않는다.
오직 "절대 시간" 만을 의미하며 MilliSecond정보 또한 포함되지 않는다.

 

Qt에서의 시간 Class

Qt에서는 시간을 다루기 위해 아래와 같은 클래스들을 제공한다.

QDateTime 날짜와 시간 데이터, 시간대 정보를 포함
QDate 날짜값을 다룸
QTime 시간값을 다룸
QTimeZone 표준 시간대를 다룸

여기서 중요한 점은 QDate와 QTime은 표준 시간대 정보를 포함하지 않는다는 점이다.

예를 들어, 아래와 같은 코드를 작성한다면 두 시간 값이 다른 것을 예상할 수 있다.

QDateTime utcDateTime = QDateTime::currentDateTimeUtc();
QDateTime localDateTime = utcDateTime.toLocalTime();

QTime utcTime   = utcDateTime.time();
QTime localTime = localDateTime.time();

위 코드는 같은 순간의 시간을 다루고 있지만 QTime으로 추출한 값은 서로 다르게 나타난다.

따라서 시간정보를 DB 저장, IPC 통신, 장치 간 데이터 전송 할 경우에는

UTC 기준의 Unix Time을 사용하는 것이 일반적이다.

그림1. UTC 기준 4Byte 로 시간 정보 전송

Embedded 장치에서의 시간 송수신

그림 1. 을 보면 4바이트로 전송할 수 있는 정보는 "1970년... 0분 0초"를 가져올 뿐, 

송수신하는 데이터에 밀리초 정보와 시간대 정보는 포함되지 않았다는 점을 기억해야 한다.

시간대가 다른 환경을 고려한 설계

임베디드의 시스템의 특성상

장치를 설정하는 프로그램(Server)과 실제 장치(Device)가 동작하는 국가가 다른 경우도 많다.

 

내가 구현하는 시간 동기화 기능 역시 아래와 같은 UI를 채택했다.

임베디드 장치의 시간대/ 시간 설정 UI

이 때문에 단순히 Unix Time만 전송하는 방식으로는 충분하지 않았다.

 

TimeZone 정보 또는 MilliSecond 정보를 전송하기 위해서는

프로토콜 설계 단계에서부터 고려해야 한다.

한 프레임으로 Time, MiliSecond, TimeZone을 전송

결국 시간 동기화 기능은 시간을 어떤 기준으로 표현하고 공유할 것인가를 경정하는 문제에 가까웠다.

회고

시간동기화 기능을 개발하며, 서비스와 앱으로 권한을 나누고 프로토콜을 구현하고

이번 글을 마지막으로 시간 데이터 송수신 방식까지 함께 고민할 수 있었다.

2025.12.10 - [개발] - Service 기반 시스템 권한 기능 구현기 — JSON 프로토콜과 OS 추상화 설계

2025.12.11 - [개발] - Service 기반 시스템 권한 기능 구현기 — 권한 분리 환경에서 IPC구현과 QLocalSocket DACL 문제

 

특히 임베디드 장치를 개발하면서

OS가 다루는 TimeZone과 절대 시간(UTC) 개념에 대해 깊게 생각해 보았다.

어떤 시간 정보를 정의해야 하고, 어디까지 전송해야 하는지에 대한 기준이 명확해졌다.

 

또한 시간 관련 IPC를 설계하며

  • 요청과 응답을 작게 쪼개 재사용성을 높이는 방법
  • 시간 관련 데이터를 하나의 단위로 묶어 처리하는 방법

을 고민하면서,

추상화의 깊이를 어디까지 가져가야 하는지에 대해서도 많은 생각을 하게 되었다.

 

이번 작업을 통해

우리 회사에서 생산하는 Embedded Device에 대한 시스템 전반의 시간 개념을 정립할 수 있었다.