Ariweb Suite 0.1.1 기반: 공통 라이브러리(db·http·세션·작업 엔진·할당/예약·알림·감사·보관소), 포털 뼈대, Webmaker/AriMail 도입 소스와 manifest
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Fable 5.1
parent
9ca4cee341
commit
c7aea8d419
+25
@@ -0,0 +1,25 @@
|
||||
/**
|
||||
* lib/kst.mjs — 한국 표준시(KST, UTC+9) 월 경계 계산.
|
||||
*
|
||||
* 월간 사용량(웹 아웃바운드·메일 통수)은 "KST 월" 기준으로 집계·초기화한다(§13.3·§13.4·§17.2).
|
||||
* UTC 로 저장된 시각을 KST 월로 나누려면 9시간을 더해 날짜를 구하고, 월 시작을 다시 UTC 로 돌린다.
|
||||
* 테스트가 고정 시각으로 검증할 수 있게 모든 함수는 `at` 을 인자로 받는다(AriMail usage.test 의 월 경계 오류 재발 방지).
|
||||
*/
|
||||
const KST_OFFSET_MS = 9 * 3600 * 1000;
|
||||
|
||||
/** at 이 속한 KST 월의 시작(UTC ISO). 예: 2026-10-31T16:00:00Z(=11-01 01:00 KST) → 2026-10-31T15:00:00.000Z */
|
||||
export function monthStart(at = new Date()) {
|
||||
const k = new Date(new Date(at).getTime() + KST_OFFSET_MS);
|
||||
return new Date(Date.UTC(k.getUTCFullYear(), k.getUTCMonth(), 1) - KST_OFFSET_MS).toISOString();
|
||||
}
|
||||
/** 다음 KST 월 시작(UTC ISO) = 월간 사용량 초기화 시각 */
|
||||
export function nextMonthStart(at = new Date()) {
|
||||
const k = new Date(new Date(at).getTime() + KST_OFFSET_MS);
|
||||
return new Date(Date.UTC(k.getUTCFullYear(), k.getUTCMonth() + 1, 1) - KST_OFFSET_MS).toISOString();
|
||||
}
|
||||
/** KST 기준 YYYY-MM-DD */
|
||||
export function kstDate(at = new Date()) { return new Date(new Date(at).getTime() + KST_OFFSET_MS).toISOString().slice(0, 10); }
|
||||
/** KST 기준 YYYY-MM */
|
||||
export function kstMonth(at = new Date()) { return kstDate(at).slice(0, 7); }
|
||||
/** 화면 표시용 "YYYY-MM-DD HH:mm (KST)" */
|
||||
export function fmtKst(at) { if (!at) return ''; const k = new Date(new Date(at).getTime() + KST_OFFSET_MS); return k.toISOString().slice(0, 16).replace('T', ' ') + ' KST'; }
|
||||
Reference in New Issue
Block a user