feat(shared): para, miktar ve İstanbul günü yardımcıları

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-05 02:57:58 +03:00
parent 7fda139199
commit eaf80c6bb4
6 changed files with 374 additions and 0 deletions
+51
View File
@@ -0,0 +1,51 @@
import { TIME_ZONE } from "./format";
/**
* İstanbul günü yardımcıları. Veritabanında UTC saklanır; gün sınırları İstanbul'a göredir.
* Türkiye 2016'dan beri sabit UTC+3 kullanır; yine de dönüşüm Intl ile yapılır (kural değişirse
* yalnızca ofset hesabı güncellenir).
*/
const ymdFmt = new Intl.DateTimeFormat("en-CA", {
timeZone: TIME_ZONE,
year: "numeric",
month: "2-digit",
day: "2-digit",
});
/** Bir anın İstanbul'daki takvim günü: "2026-11-05". */
export function toIstanbulYmd(date: Date | string | number): string {
return ymdFmt.format(new Date(date));
}
/** Bugünün İstanbul günü. */
export function todayIstanbul(now: Date = new Date()): string {
return toIstanbulYmd(now);
}
/** İstanbul'un verilen andaki UTC ofseti (dakika; +180). */
function istanbulOffsetMinutes(at: Date): number {
const parts = new Intl.DateTimeFormat("en-US", {
timeZone: TIME_ZONE,
hourCycle: "h23",
year: "numeric",
month: "2-digit",
day: "2-digit",
hour: "2-digit",
minute: "2-digit",
}).formatToParts(at);
const get = (t: string) => Number(parts.find((p) => p.type === t)?.value);
const asUtc = Date.UTC(get("year"), get("month") - 1, get("day"), get("hour"), get("minute"));
return Math.round((asUtc - at.getTime()) / 60_000);
}
/** "2026-11-05" → o günün İstanbul'daki başlangıç anı (UTC Date). Geçersizse null. */
export function istanbulDayStart(ymd: string): Date | null {
const m = /^(\d{4})-(\d{2})-(\d{2})$/.exec(ymd);
if (!m) return null;
const [y, mo, d] = [Number(m[1]), Number(m[2]), Number(m[3])];
const guess = new Date(Date.UTC(y, mo - 1, d));
if (guess.getUTCFullYear() !== y || guess.getUTCMonth() !== mo - 1 || guess.getUTCDate() !== d)
return null;
return new Date(guess.getTime() - istanbulOffsetMinutes(guess) * 60_000);
}