You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[FB-258] UTC 전환 잔여: admin-tool 점검 일정·보관함 만료일이 아직 현지 시각이고, 보관함 수령 만료 판정·만료일 표시가 어긋남 #679
df9755d9f는 저장·비교 시각을 UTC로 통일하고 admin-tool도 일부(MarketplaceAdminService todayStart, AdminActivityLogService) 옮겼지만, 아래는 아직 현지 시계를 쓰거나 UTC 값을 현지 시각처럼 다뤄요.
항목
점검 일정 (medium): server/http/Service/MaintenanceService.cs:45는 이제 DateTime.UtcNow로 점검 창을 판정해요. 그런데 일정을 만드는 server/admin-tool/Pages/Maintenance.razor는 datetime-local 입력값(운영자가 보는 KST)을 그대로 StartTime/EndTime에 넣고, 기본값·상태 표시도 DateTime.Now예요(209·281·381·394-395·428-430행, Index.razor:443). KST로 02:00~04:00을 입력하면 서비스는 UTC 02:00(KST 11:00)부터 점검으로 보고 로그인을 막아요. Redis에 이미 저장된 일정도 옮겨지지 않아요.
보관함 수령 만료 판정 (low): server/http/Service/StorageService.cs:227box.ExpiredDate.Value <= SnowflakeId.Time(claimId).ToLocalTime()가 남아 있어요. ExpiredDate는 이제 UTC인데 비교 대상은 호스트 현지 시각이라, KST 호스트에서는 만료 9시간 전부터 수령이 거절돼요.
보관함 만료일 입력·표시 (low): Items.razor:250,585 기본 만료일이 DateTime.Today.AddDays(30)(현지 날짜)로 저장돼요. 게임에서는 builtin/character.cpp:6885가 expire_date.to_string()(UTC)을 그대로 넘기고 scripts/lib/storage.lua:49-50이 "만료일"로 보여줘서, 커밋 설명의 '클라이언트에는 한국 시각'과 달리 9시간 이른 시각이 표시돼요.
admin-tool 기타 (low): Users.razor:693·UserDetail.razor:739가 character.UpdatedDate = DateTime.Now를 쓰고, UserDetailDisplay.cs:204는 Dapper가 읽은 Unspecified 값에 ToLocalTime()을 해서 컨테이너(UTC)에서는 UTC를, KST 호스트에서는 KST를 보여줘요(표시 기준이 호스트에 따라 달라짐).
수정 방향
admin-tool 입력은 KST로 받고 저장 전에 AddHours(-9)(또는 TimeZoneInfo "Asia/Seoul")로 UTC로 바꾸고, 표시는 AddHours(9)로 통일해요. DateTime.Now·DateTime.Today·ToLocalTime()을 admin-tool 전체에서 걷어내요(.razor 포함).
기존 Redis 점검 일정은 한 번 옮기거나 다시 등록해요.
StorageService.cs:227은 SnowflakeId.Time(claimId)(UTC)와 직접 비교해요.
Activity
fix: local time, logs, hash #659 #673 #674 #679
boyism80 commentedon Oct 16, 2026
[FB 리뷰어] 1c2ca9bfa에서 해결을 확인했어요. Maintenance.razor는 입력을
ToUniversalTime()으로 저장하고 표시는 UTC→현지로 바꾸며, Index.razor 판정은UtcNow로 해요. StorageService 수령 만료는SnowflakeId.Time(claimId)로 바로 비교하고, 보관함 만료일 표시는to_local()로 해요. 남은DateTime.Now는 폼 기본값과 표시용이라 저장할 때 UTC로 바뀌어요. 프로세스 TZ 의존 문제는 #680에서 이어서 볼게요. 닫을게요.