𝗔𝗣𝗜 Yangu Ilivunjika Kila Januari 1
API yangu ilivunjika saa 00:00 kamili za UTC mnamo Januari 1.
Haikuvunjika wakati wa usiku wa manane kwa watumiaji. Ilivunjika wakati wa usiku wa manane wa UTC. Watumiaji wa Tokyo waliona data iliyoharibika kuanzia saa 3 asubuhi kwa wakati wao.
Majaribio yalifanikiwa. Mazingira ya staging yalifanya kazi. Hitilafu hiyo ilikuwepo kwenye production pekee kwa sababu seva ya production ilitumia timezone tofauti na staging.
Tatizo lilikuwa kwenye mantiki hii:
function getDailyReport(date) {
const start = new Date(date).toISOString().split('T')[0];
const end = new Date(start + 'T23:59:59Z');
return db.reports.findMany({
where: {
createdAt: { gte: new Date(start), lt: end }
}
});
}
Unapopitisha tarehe kama "2026-01-01" bila muda, mfumo hutumia timezone ya eneo husika.
Seva yetu ya staging ilitumia UTC. Seva yetu ya production ilitumia US-East. Hii ilisababisha tofauti ya saa tano kwenye kila swali la tarehe (date query).
Tulipoteza saa tano za data kwenye kila swali. Namba zilikuwa karibu vya kutosha kiasi kwamba hakuna aliyegundua kwa mwaka mzima.
Suluhisho lilikuwa rahisi. Lazimisha UTC kwa kuongeza muda kwenye string:
function getDailyReport(date: string) {
const start = new Date(`${date}T00:00:00Z`);
const end = new Date(`${date}T23:59:59.999Z`);
return db.reports.findMany({
where: {
createdAt: { gte: start, lt: end }
}
});
}
Mabadiliko ya kodi yalichukua sekunde chache. Marekebisho ya mfumo yalichukua wiki moja. Tulifanya mambo haya manne:
• Tuliongeza uthibitisho wa timezone kwenye CI ili kuhakikisha mazingira yanabaki katika UTC. • Tuliset TZ=UTC kwenye Dockerfiles zote ili kuweka kila container kuwa sawa. • Tuliongeza ukaguzi wa timezone kwenye script ya ku-deploy. • Tulitunga sheria ya linter ili kuashiria kila Date constructor inayokosa taarifa za timezone.
Hitilafu za timezone ni hatari. Hazisababishi mfumo wako kuanguka. Zinazalisha data isiyo sahihi ambayo inaonekana kuwa sahihi. Watumiaji wako hawataona ukurasa wa hitilafu. Wataona namba zisizo sahihi na wataziamini.
Fuata sheria hizi tatu:
- Usiamini kamwe timezone ya mfumo. Kila wakati weka TZ=UTC.
- Usichanganue (parse) tarehe bila timezone.
- Usichukulie kamwe kuwa timezone ya CI yako inafanana na ya production.