Microsoft .NET/C#
[C#] DateTime vs DateTimeOffset, 서버 시간은 UTC로 관리하기
전자기린
2026. 11. 10. 01:04

서버에서 시간을 다루다 보면 9시간 차이(UTC/KST)로 하루가 밀리는 문제를 만납니다. 저장·전송은 UTC로, 표시만 현지 시간으로 하는 규칙입니다.
절차
- DateTime의 두 가지 Kind
- DateTimeOffset
- 저장 규칙
- 표시 규칙
1. DateTime의 Kind
var local = DateTime.Now; // Kind = Local (서버 시간대 따름)
var utc = DateTime.UtcNow; // Kind = Utc
var none = new DateTime(2026,1,1); // Kind = UnspecifiedDateTime.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 형식으로 내려가고, 화면에서 바꾸는 것이 정석입니다.
정리
- 저장·비교·계산은
DateTime.UtcNow - 시간대 정보가 중요하면
DateTimeOffset - 현지 표시는 프런트엔드에서