𝗠𝘆 𝗔𝗣𝗜 𝗕𝗿𝗼𝗸𝗲 𝗘𝘃𝗲𝗿𝘆 𝗝𝗮𝗻𝘂𝗮𝗿𝘆 𝟭𝘀𝘁

माझे API दर १ जानेवारीला बिघडत होते.

माझे API १ जानेवारीला बरोबर 00:00 UTC ला बिघडले.

ते वापरकर्त्यांच्या मध्यरात्री बिघडले नाही. ते UTC मध्यरात्री बिघडले. टोकियोमधील वापरकर्त्यांना त्यांच्या वेळेनुसार सकाळी ९ पासून चुकीचा डेटा दिसू लागला.

टेस्ट्स पास झाल्या होत्या. स्टेजिंग एन्व्हायरनमेंट (staging environment) व्यवस्थित काम करत होते. ही त्रुटी फक्त प्रोडक्शनमध्ये (production) होती कारण प्रोडक्शन सर्व्हर स्टेजिंगपेक्षा वेगळा टाइमझोन (timezone) वापरत होता.

समस्या या लॉजिकमध्ये (logic) होती:

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 }
    }
  });
}

जेव्हा तुम्ही "2026-01-01" सारखी वेळ नसलेली तारीख पास करता, तेव्हा सिस्टम स्थानिक टाइमझोन (local timezone) वापरते.

आमचा स्टेजिंग सर्व्हर UTC वापरत होता. आमचा प्रोडक्शन सर्व्हर US-East वापरत होता. यामुळे प्रत्येक डेट क्वेरीमध्ये (date query) पाच तासांचा फरक (offset) निर्माण झाला.

प्रत्येक क्वेरीमध्ये आमचा पाच तासांचा डेटा गहाळ झाला. आकडेवारी इतकी जवळच्या दिसत होती की वर्षभर कोणाचेही लक्ष गेले नाही.

उपाय सोपा होता. स्ट्रिंगला वेळ जोडून UTC फोर्स करा:

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 }
    }
  });
}

कोडमधील बदल काही सेकंदात झाला. पण सिस्टममधील सुधारणा करण्यासाठी एक आठवडा लागला. आम्ही या चार गोष्टी केल्या:

• CI मध्ये टाइमझोन अझर्शन (timezone assertion) जोडले जेणेकरून एन्व्हायरनमेंट UTC मध्येच राहील. • सर्व Dockerfiles मध्ये TZ=UTC सेट केले जेणेकरून प्रत्येक कंटेनर एकसमान राहील. • डिप्लॉय स्क्रिप्टमध्ये (deploy script) टाइमझोन चेक जोडला. • टाइमझोन माहिती नसलेले कोणतेही Date constructor फ्लॅग करण्यासाठी लिन्टर रूल (linter rule) लिहिला.

टाइमझोन बग्स (bugs) धोकादायक असतात. ते तुमची सिस्टम क्रॅश करत नाहीत. ते चुकीचा डेटा तयार करतात जो योग्य वाटतो. तुमच्या वापरकर्त्यांना एरर पेज (error page) दिसणार नाही. त्यांना चुकीचे आकडे दिसतील आणि ते त्यावर विश्वास ठेवतील.

या तीन नियमांचे पालन करा:

  • सिस्टम टाइमझोनवर कधीही विश्वास ठेवू नका. नेहमी TZ=UTC सेट करा.
  • टाइमझोनशिवाय तारखा पार्स (parse) करू नका.
  • तुमचा CI टाइमझोन प्रोडक्शनशी जुळतो असे कधीही गृहीत धरू नका.

Source: https://dev.to/kollittle/my-api-broke-every-january-1st-the-timezone-bug-i-should-have-caught-in-code-review-51hb