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

ஜனவரி 1-ம் தேதி சரியாக 00:00 UTC நேரத்தில் என் API செயலிழந்தது.

இது பயனர்களின் நள்ளிரவில் செயலிழக்கவில்லை. UTC நள்ளிரவில் செயலிழந்தது. டோக்கியோவில் உள்ள பயனர்கள் காலை 9 மணி முதல் தவறான தரவுகளைக் கண்டனர்.

சோதனைகள் (tests) வெற்றிகரமாக முடிந்தன. ஸ்டேஜிங் (staging) சூழல் சரியாகச் செயல்பட்டது. தயாரிப்பு (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) உருவாக்கியது.

ஒவ்வொரு தேடலிலும் ஐந்து மணிநேரத் தரவுகளை நாங்கள் இழந்தோம். அந்த எண்கள் ஓரளவிற்குச் சரியாகத் தெரிந்ததால், ஒரு முழு ஆண்டிற்குப் பிறகும் யாரும் இதைக் கவனிக்கவில்லை.

இதற்கான தீர்வு எளிமையானது. அந்தத் தொடருடன் (string) நேரத்தைச் சேர்ப்பதன் மூலம் 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 }
    }
  });
}

குறியீட்டு மாற்றம் (code change) சில வினாடிகளில் முடிந்தது. ஆனால் சிஸ்டத்தை சரிசெய்ய ஒரு வாரம் ஆனது. நாங்கள் இந்த நான்கு விஷயங்களைச் செய்தோம்:

• சூழல் (environment) UTC-லேயே இருப்பதை உறுதி செய்ய CI-இல் ஒரு timezone assertion-ஐச் சேர்த்தோம். • அனைத்து கன்டெய்னர்களும் (containers) ஒரே மாதிரியாக இருப்பதை உறுதி செய்ய அனைத்து Dockerfiles-களிலும் TZ=UTC என அமைத்தோம். • டெப்ளாய் ஸ்கிரிப்ட்டில் (deploy script) ஒரு timezone சரிபார்ப்பைச் சேர்த்தோம். • நேர மண்டலத் தகவல் இல்லாத எந்தவொரு Date constructor-ஐயும் கண்டறிய ஒரு linter விதியைப் (rule) எழுதினோம்.

நேர மண்டலப் பிழைகள் (Timezone bugs) ஆபத்தானவை. அவை உங்கள் சிஸ்டத்தை முடக்கிவிடாது (crash). மாறாக, சரியானதாகத் தோன்றும் தவறான தரவுகளை உருவாக்கும். உங்கள் பயனர்கள் பிழைப் பக்கத்தைப் (error page) பார்க்க மாட்டார்கள். அவர்கள் தவறான எண்களைப் பார்ப்பார்கள், மேலும் அவற்றை நம்புவார்கள்.

இந்த மூன்று விதிகளையும் பின்பற்றுங்கள்:

  • சிஸ்டத்தின் நேர மண்டலத்தை (system timezone) ஒருபோதும் நம்பாதீர்கள். எப்போதும் TZ=UTC என அமைக்கவும்.
  • நேர மண்டலங்கள் இல்லாமல் தேதிகளைப் பகுப்பாய்வு (parse) செய்யாதீர்கள்.
  • உங்கள் CI நேர மண்டலம் தயாரிப்புச் சூழலுடன் (production) ஒத்துப்போகும் என்று ஒருபோதும் assumptions எடுக்காதீர்கள்.

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