SELECT UNIX_TIMESTAMP('2050-01-01');
![[C++] Problema Year 2038 si Buffurile Permanente in Metin2 - Mesaj 1 - Imagine 1 [C++] Problema Year 2038 si Buffurile Permanente in Metin2 - Mesaj 1 - Imagine 1](https://upload.wikimedia.org/wikipedia/commons/e/e9/Year_2038_problem.gif)
Ce este Year 2038 Problem?
Problema anului 2038 (Year 2038 Problem) este o limitare a funcției UNIX_TIMESTAMP, care stochează timpul ca un număr întreg pe 4 bytes (32-bit). Deoarece acest timestamp este măsurat în secunde de la 1 ianuarie 1970, valoarea maximă pe care o poate reține un număr întreg semnat pe 4 bytes este 2147483647, care corespunde datei 03:14:08 UTC pe 19 ianuarie 2038.
După această dată, timestamp-ul va depăși limita maximă și va cauza erori, deoarece va reveni la o valoare negativă, generând un comportament imprevizibil în baze de date și sisteme care se bazează pe această metodă de stocare a timpului.
Impactul asupra Buffurilor Permanente în Metin2
În Metin2, diverse buffuri și permisiuni sunt gestionate prin UNIX_TIMESTAMP, chiar dacă coloanele în baza de date sunt deja de tip DATETIME. Funcția UNIX_TIMESTAMP este utilizată pentru a calcula numărul de secunde rămase până la o anumită dată, însă, din cauza limitării la 32 de biți, orice dată mai mare decât 19 ianuarie 2038 va returna 0 sau o valoare incorectă.
Printre buffurile afectate se numără:
- UNIX_TIMESTAMP(silver_expire),
- UNIX_TIMESTAMP(gold_expire),
- UNIX_TIMESTAMP(safebox_expire),
- UNIX_TIMESTAMP(autoloot_expire),
- UNIX_TIMESTAMP(fish_mind_expire),
- UNIX_TIMESTAMP(marriage_fast_expire),
- UNIX_TIMESTAMP(money_drop_rate_expire),
Soluții posibile
Pentru a evita această problemă, există câteva soluții viabile:
- Utilizarea unei date care nu depășește limita
- Schimba funcția UNIX_TIMESTAMP cu TO_SECONDS (nu am testato)