34 lines
1.3 KiB
TypeScript
34 lines
1.3 KiB
TypeScript
import type { CandleData } from '../services/backtestApi';
|
|
|
|
/**
|
|
* 차트 캔들 time 필드 → Unix ms.
|
|
* REST/내부에서 toISOString() 후 'Z'를 뺀 문자열은 UTC로 해석해야 Upbit WS·alignSec와 일치함.
|
|
*/
|
|
export function parseChartCandleTimeToUnixMs(c: CandleData | undefined): number {
|
|
if (!c || c.time == null || (typeof c.time === 'string' && c.time.trim() === '')) return 0;
|
|
const t = c.time as string | number;
|
|
if (typeof t === 'number') {
|
|
return t > 1e12 ? t : t * 1000;
|
|
}
|
|
const s = String(t).trim();
|
|
if (!s) return 0;
|
|
if (/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}/.test(s) && !/[zZ]|[+-]\d{2}:?\d{2}$/.test(s)) {
|
|
const ms = Date.parse(`${s}Z`);
|
|
if (Number.isFinite(ms)) return ms;
|
|
}
|
|
const ms = Date.parse(s);
|
|
return Number.isFinite(ms) ? ms : 0;
|
|
}
|
|
|
|
/** 단일 time 값 → Unix 초 (메인 buildCandleDataRaw / updateLastCandle / 보조지표 toUnix 공통) */
|
|
export function chartTimeValueToUnixSeconds(v: string | number | undefined | null): number | null {
|
|
if (v == null || v === '') return null;
|
|
if (typeof v === 'number') {
|
|
if (!isFinite(v)) return null;
|
|
return Math.floor(v >= 1e12 ? v / 1000 : v);
|
|
}
|
|
const ms = parseChartCandleTimeToUnixMs({ time: v } as CandleData);
|
|
if (!ms) return null;
|
|
return Math.floor(ms / 1000);
|
|
}
|