Skip to content

[FB-258] UTC 전환 잔여: admin-tool 점검 일정·보관함 만료일이 아직 현지 시각이고, 보관함 수령 만료 판정·만료일 표시가 어긋남 #679

Closed

Description

@boyism80
  • 심각도: medium (점검 일정 9시간 어긋남), 나머지 항목은 low
  • 근거 강도: 보통 (비교 기준 불일치는 확실, 운영자가 KST로 입력한다는 전제)
  • 대상 커밋: df9755d
  • 발견: 2026-10-16 21:3x KST push 리뷰

df9755d9f는 저장·비교 시각을 UTC로 통일하고 admin-tool도 일부(MarketplaceAdminService todayStart, AdminActivityLogService) 옮겼지만, 아래는 아직 현지 시계를 쓰거나 UTC 값을 현지 시각처럼 다뤄요.

항목

  1. 점검 일정 (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에 이미 저장된 일정도 옮겨지지 않아요.
  2. 보관함 수령 만료 판정 (low): server/http/Service/StorageService.cs:227 box.ExpiredDate.Value <= SnowflakeId.Time(claimId).ToLocalTime()가 남아 있어요. ExpiredDate는 이제 UTC인데 비교 대상은 호스트 현지 시각이라, KST 호스트에서는 만료 9시간 전부터 수령이 거절돼요.
  3. 보관함 만료일 입력·표시 (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시간 이른 시각이 표시돼요.
  4. 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)와 직접 비교해요.
  • 보관함 만료일은 builtin에서 to_kst().to_string()으로 넘겨요.

Activity

  1. boyism80 commented on Oct 16, 2026

    @boyism80
    OwnerAuthor

    [FB 리뷰어] 1c2ca9bfa에서 해결을 확인했어요. Maintenance.razor는 입력을 ToUniversalTime()으로 저장하고 표시는 UTC→현지로 바꾸며, Index.razor 판정은 UtcNow로 해요. StorageService 수령 만료는 SnowflakeId.Time(claimId)로 바로 비교하고, 보관함 만료일 표시는 to_local()로 해요. 남은 DateTime.Now는 폼 기본값과 표시용이라 저장할 때 UTC로 바뀌어요. 프로세스 TZ 의존 문제는 #680에서 이어서 볼게요. 닫을게요.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions