uint64_t transformToTimestamp(uint64_t year,
uint64_t month, uint64_t day,
uint64_t hour, uint64_t min,
uint64_t sec, uint64_t mil)
{
uint64_t ret;
static uint64_t daySum[] = {0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334};
ret = ((year - 1) * 365 + (year - 1) / 4 - (year - 1) / 100 + (year - 1) / 400) * 24 * 3600;
ret += daySum[month - 1] * 24 * 3600;
if (month > 2 && (((year & 3) == 0 && year % 100 != 0) || year % 400 == 0))
ret += 24 * 3600;
ret += ((day - 1) * 24 + hour) * 3600 + min * 60 + sec;
return ret * 1000 + mil;
}
//获取时间戳函数
uint64_t get_timestamp()
{
struct timeval curr_tv;
time_t curr_secs;
time_t curr_ms;
struct tm curr_tm;
// 获取Linux时间戳
gettimeofday(&curr_tv, NULL);
// timeval -> time_t
curr_secs = curr_tv.tv_sec;
curr_ms = curr_tv.tv_usec / 1000;
// 日志文件需要的时间戳格式
localtime_r(&curr_secs, &curr_tm);
uint64_t startTime = transformToTimestamp(curr_tm.tm_year + 1900,
curr_tm.tm_mon + 1,
curr_tm.tm_mday,
curr_tm.tm_hour,
curr_tm.tm_min,
curr_tm.tm_sec,
curr_ms);
return startTime;
}
void transformToDate(time64 timeStamp ,time64 **dateArry)
{
time64 low ,high ,mid ,t;
time64 year ,month ,day ,hour ,minute ,second ,milliSecond;
time64 daySum[] = {0 ,31 ,59 ,90 ,120 ,151 ,181 ,212 ,243 ,273 ,304 ,334 ,365};
time64 milOfDay = 24 * 3600 * 1000;
time64 milOfHour = 3600 * 1000;
if(timeStamp > 315537897599999) {
timeStamp = 315537897599999;
}
low = 1;
high = 9999;
while(low <= high)
{
mid = (low+high)>>1;
t = ((mid-1) * 365 + (mid-1)/4 - (mid-1)/100 + (mid-1)/400) * milOfDay;
if(t == timeStamp)
{
low = mid + 1;
break;
}
else if(t < timeStamp)
low = mid + 1;
else
high = mid - 1;
}
year = low-1;
timeStamp -= ((year-1) * 365 + (year-1)/4 - (year-1)/100 + (year-1)/400) * milOfDay;
int isLeapYear = ((year&3) == 0 && year%100!=0) || year%400 == 0;
for(month = 1 ;(daySum[month] + ((isLeapYear && month > 1) ? 1 : 0)) * milOfDay <= timeStamp && month < 13 ;month ++) {
if(isLeapYear && month > 1)
++daySum[month];
}
timeStamp -= daySum[month-1] * milOfDay;
day = timeStamp / milOfDay;
timeStamp -= day * milOfDay;
hour = timeStamp / milOfHour;
timeStamp -= hour * milOfHour;
minute = timeStamp / 60000;
timeStamp -= minute * 60000;
second = timeStamp / 1000;
milliSecond = timeStamp % 1000;
*dateArry[0] = year;
*dateArry[1] = month;
*dateArry[2] = day;
*dateArry[3] = hour;
*dateArry[4] = minute;
*dateArry[5] = second;
*dateArry[6] = milliSecond;
}
void transformToDateString(time64 timeStamp ,char *dateString)
{
time64 year ,month ,day ,hour ,minute ,second ,milliSecond;
time64 *intp[] = {&year ,&month ,&day ,&hour ,&minute ,&second ,&milliSecond };
transformToDate(timeStamp ,intp);
sprintf(dateString ,"%.4d-%.2d-%.2d %.2d:%.2d:%.2d:%.3d" ,
year ,month ,day+1 ,hour ,minute ,second ,milliSecond );
}