Microsoft .NET/C#

[C#] DateTime vs DateTimeOffset, 서버 시간은 UTC로 관리하기

전자기린 2026. 11. 10. 01:04

서버에서 시간을 다루다 보면 9시간 차이(UTC/KST)로 하루가 밀리는 문제를 만납니다. 저장·전송은 UTC로, 표시만 현지 시간으로 하는 규칙입니다.

절차

  1. DateTime의 두 가지 Kind
  2. DateTimeOffset
  3. 저장 규칙
  4. 표시 규칙

 

1. DateTime의 Kind

var local = DateTime.Now;              // Kind = Local (서버 시간대 따름)
var utc   = DateTime.UtcNow;           // Kind = Utc
var none  = new DateTime(2026,1,1);    // Kind = Unspecified

DateTime.Now는 서버 시간대를 따릅니다. 한국 서버에서 개발하고 미국 서버에 배포하면 14시간 차이가 납니다.

2. DateTimeOffset

var now = DateTimeOffset.Now;          // 2026-11-10 01:00 +09:00
var utc = DateTimeOffset.UtcNow;       // 2026-11-09 16:00 +00:00

3. 저장 규칙: UTC로 저장

public class AuditLog
{
    public DateTime CreatedAtUtc { get; set; } = DateTime.UtcNow;
}

DB 컬럼은 datetime2 또는 SQL Server라면 datetimeoffset도 좋습니다. 이미 로컬 시간으로 저장된 데이터가 있다면 ToUniversalTime()을 써서 마이그레이션합니다.

4. 표시 규칙: 클라이언트에서 현지 시간으로

var local = utcValue.ToLocalTime();               // 서버가 사용자 대리일 때만
var kst = utcValue.AddHours(9);                   // 고정 시간대 서비스라면

API라면 ISO 8601 + Z 형식으로 내려가고, 화면에서 바꾸는 것이 정석입니다.

정리

  1. 저장·비교·계산은 DateTime.UtcNow
  2. 시간대 정보가 중요하면 DateTimeOffset
  3. 현지 표시는 프런트엔드에서