timestamp.inc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //AbyssMorgan
  2. //%d:%02d:%02d:%02d (day hour minute second)
  3. #define SecToTimeDay(%0) ((%0) / 86400),(((%0) % 86400) / 3600),((((%0) % 86400) % 3600) / 60),((((%0) % 86400) % 3600) % 60)
  4. #define MSToTimeDay(%0) SecToTimeDay((%0)/1000)
  5. //%02d:%02d:%02d (hour minute second)
  6. #define SecToTime(%0) ((%0) / 3600),(((%0) % 3600) / 60),(((%0) % 3600) % 60)
  7. #define MSToTime(%0) SecToTime((%0)/1000)
  8. //%02d:%02d (minute second)
  9. #define SecToTimeMini(%0) ((%0) / 60),((%0) % 60)
  10. #define MSToTimeMini(%0) SecToTimeMini((%0)/1000)
  11. static stock const
  12. SECONDS_PER_MINUTE = 60,
  13. SECONDS_PER_HOUR = 3600,
  14. SECONDS_PER_DAY = 86400,
  15. SECONDS_PER_YEAR = 31556952, // based on 365.2425 days per year
  16. monthdays[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
  17. weekdays[7][10] = {"Saturday", "Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday"};
  18. stock stamp2datetime(sec1970, &year, &month, &day, &hour, &minute, &second, gmh = 0, gmm = 0) {
  19. new days, seconds;
  20. for(year = 1970; ; year += 1) {
  21. days = (365 + (!(year & 0x03) ? 1 : 0)); // Will fail for 2100
  22. seconds = days * SECONDS_PER_DAY;
  23. if(seconds > sec1970)
  24. break;
  25. sec1970 -= seconds;
  26. }
  27. for(month = 1; ; month += 1) {
  28. days = monthdays[month - 1];
  29. seconds = days * SECONDS_PER_DAY;
  30. if(seconds > sec1970)
  31. break;
  32. sec1970 -= seconds;
  33. }
  34. for(day = 1; sec1970 >= SECONDS_PER_DAY; day += 1)
  35. sec1970 -= SECONDS_PER_DAY;
  36. for(hour = gmh; sec1970 >= SECONDS_PER_HOUR; hour += 1)
  37. sec1970 -= SECONDS_PER_HOUR;
  38. for(minute = gmm; sec1970 >= SECONDS_PER_MINUTE; minute += 1)
  39. sec1970 -= SECONDS_PER_MINUTE;
  40. second = sec1970;
  41. }
  42. stock datetime2stamp(&sec1970, year, month, day, hour, minute, second, gmh = 0, gmm = 0) {
  43. for(new y = 1970; y < year; y++)
  44. day += (365 + (!(y & 0x03) ? 1 : 0));
  45. for(new m = 1; m < month; m++)
  46. day += monthdays[m - 1];
  47. if(!(year & 0x03) && month > 2)
  48. day += 1;
  49. day -= 1;
  50. sec1970 += (day * SECONDS_PER_DAY);
  51. sec1970 += ((hour + gmh) * SECONDS_PER_HOUR);
  52. sec1970 += ((minute + gmm) * SECONDS_PER_MINUTE);
  53. sec1970 += second;
  54. return sec1970;
  55. }
  56. stock weekday(day, month, year) {
  57. if (month <= 2) {
  58. month += 12;
  59. --year;
  60. }
  61. new j = year % 100;
  62. new e = year / 100;
  63. return ((day + (month+1)*26/10 + j + j/4 + e/4 - 2*e) % 7);
  64. }
  65. stock SecondsInTime(&sec1970, year, month, day, hour, minute, second) {
  66. sec1970 += (year * SECONDS_PER_YEAR);
  67. sec1970 += (month * SECONDS_PER_DAY * 30);
  68. sec1970 += (day * SECONDS_PER_DAY);
  69. sec1970 += (hour * SECONDS_PER_HOUR);
  70. sec1970 += (minute * SECONDS_PER_MINUTE);
  71. sec1970 += second;
  72. //sec1970 += (y * 31556952) + (m * 2592000) + (d * 86400) + (h * 3600) + (i * 60) + s;
  73. }
  74. stock TimeInSeconds(sec1970, &year, &month, &day, &hour, &minute, &second) {
  75. #define MINUTES_IN_HOUR 60
  76. #define HOURS_IN_DAY 24
  77. #define DAYS_IN_WEEK 7
  78. #define DAYS_IN_MONTH 30
  79. #define DAYS_IN_YEAR 365.2425
  80. second = sec1970 % SECONDS_PER_MINUTE;
  81. sec1970 /= SECONDS_PER_MINUTE;
  82. minute = sec1970 % MINUTES_IN_HOUR;
  83. sec1970 /= MINUTES_IN_HOUR;
  84. hour = sec1970 % HOURS_IN_DAY;
  85. sec1970 /= HOURS_IN_DAY;
  86. day = sec1970 % DAYS_IN_WEEK;
  87. sec1970 /= DAYS_IN_WEEK;
  88. //week = sec1970 & WEEKS_IN_MONTH;
  89. month = sec1970 / WEEKS_IN_MONTH;
  90. year = floatround(sec1970 / DAYS_IN_YEAR, floatround_floor);
  91. /*seconds = sec1970 % SECONDS_PER_MINUTE;
  92. minutes = sec1970 / SECONDS_PER_MINUTE % MINUTES_IN_HOUR;
  93. hours = sec1970 / SECONDS_PER_MINUTE / MINUTES_IN_HOUR % HOURS_IN_DAY;
  94. days = sec1970 / SECONDS_PER_MINUTE / MINUTES_IN_HOUR / HOURS_IN_DAY;*/
  95. }