Files
butcem/src/shared/dates.ts
T
2026-11-05 02:57:58 +03:00

52 lines
1.8 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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);
}