htime.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #ifndef HV_TIME_H_
  2. #define HV_TIME_H_
  3. #include "hexport.h"
  4. #include "hplatform.h"
  5. BEGIN_EXTERN_C
  6. #define SECONDS_PER_HOUR 3600
  7. #define SECONDS_PER_DAY 86400 // 24*3600
  8. #define SECONDS_PER_WEEK 604800 // 7*24*3600
  9. #define IS_LEAP_YEAR(year) (((year)%4 == 0 && (year)%100 != 0) || (year)%100 == 0)
  10. typedef struct datetime_s {
  11. int year;
  12. int month;
  13. int day;
  14. int hour;
  15. int min;
  16. int sec;
  17. int ms;
  18. } datetime_t;
  19. #ifdef _MSC_VER
  20. /* @see winsock2.h
  21. // Structure used in select() call, taken from the BSD file sys/time.h
  22. struct timeval {
  23. long tv_sec;
  24. long tv_usec;
  25. };
  26. */
  27. struct timezone {
  28. int tz_minuteswest; /* of Greenwich */
  29. int tz_dsttime; /* type of dst correction to apply */
  30. };
  31. #include <sys/timeb.h>
  32. static inline int gettimeofday(struct timeval *tv, struct timezone *tz) {
  33. struct _timeb tb;
  34. _ftime(&tb);
  35. if (tv) {
  36. tv->tv_sec = (long)tb.time;
  37. tv->tv_usec = tb.millitm * 1000;
  38. }
  39. if (tz) {
  40. tz->tz_minuteswest = tb.timezone;
  41. tz->tz_dsttime = tb.dstflag;
  42. }
  43. return 0;
  44. }
  45. #endif
  46. // sleep(s), msleep(ms), usleep(us)
  47. #ifdef OS_WIN
  48. static inline void sleep(unsigned int s) {
  49. Sleep(s * 1000);
  50. }
  51. static inline void msleep(unsigned int ms) {
  52. Sleep(ms);
  53. }
  54. static inline void usleep(unsigned int us) {
  55. Sleep(us / 1000);
  56. }
  57. #else
  58. static inline void msleep(unsigned int ms) {
  59. usleep(ms * 1000);
  60. }
  61. #endif
  62. // ms
  63. HV_EXPORT unsigned int gettick();
  64. static inline unsigned long long gettimeofday_ms() {
  65. struct timeval tv;
  66. gettimeofday(&tv, NULL);
  67. return tv.tv_sec * (unsigned long long)1000 + tv.tv_usec/1000;
  68. }
  69. // us
  70. HV_EXPORT unsigned long long gethrtime_us();
  71. HV_EXPORT datetime_t datetime_now();
  72. HV_EXPORT time_t datetime_mktime(datetime_t* dt);
  73. HV_EXPORT datetime_t* datetime_past(datetime_t* dt, int days DEFAULT(1));
  74. HV_EXPORT datetime_t* datetime_future(datetime_t* dt, int days DEFAULT(1));
  75. #define TIME_FMT "%02d:%02d:%02d"
  76. #define TIME_FMT_BUFLEN 12
  77. HV_EXPORT char* duration_fmt(int sec, char* buf);
  78. #define DATETIME_FMT "%04d-%02d-%02d %02d:%02d:%02d"
  79. #define DATETIME_FMT_BUFLEN 24
  80. HV_EXPORT char* datetime_fmt(datetime_t* dt, char* buf);
  81. #define GMTIME_FMT "%.3s, %02d %.3s %04d %02d:%02d:%02d GMT"
  82. #define GMTIME_FMT_BUFLEN 30
  83. HV_EXPORT char* gmtime_fmt(time_t time, char* buf);
  84. HV_EXPORT int days_of_month(int month, int year);
  85. HV_EXPORT int month_atoi(const char* month);
  86. HV_EXPORT const char* month_itoa(int month);
  87. HV_EXPORT int weekday_atoi(const char* weekday);
  88. HV_EXPORT const char* weekday_itoa(int weekday);
  89. HV_EXPORT datetime_t hv_compile_datetime();
  90. /*
  91. * minute hour day week month action
  92. * 0~59 0~23 1~31 0~6 1~12
  93. * 30 -1 -1 -1 -1 cron.hourly
  94. * 30 1 -1 -1 -1 cron.daily
  95. * 30 1 15 -1 -1 cron.monthly
  96. * 30 1 -1 0 -1 cron.weekly
  97. * 30 1 1 -1 10 cron.yearly
  98. */
  99. HV_EXPORT time_t cron_next_timeout(int minute, int hour, int day, int week, int month);
  100. END_EXTERN_C
  101. #endif // HV_TIME_H_