forked from pt209223/librs
-
Notifications
You must be signed in to change notification settings - Fork 1
/
Time.h
123 lines (98 loc) · 3.25 KB
/
Time.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
/**
* @brief Uzyteczne funkcje zwiazane z pomiarem czasu.
* @author Piotr Truszkowski
*/
#ifndef __TIME_H__
#define __TIME_H__
#include <stdint.h>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <sys/time.h>
#include "Exception.h"
class Time {
public:
static const size_t stamp_length = 19;
// @brief: konwersja milisekund do timeval
static timeval msec2timeval(int msec) throw()
{
timeval tv;
tv.tv_sec = msec/1000;
tv.tv_usec = (msec%1000)*1000;
return tv;
}
// @brief: aktualny czas w sekundach
static uint32_t in_sec(void) throw()
{
timeval tv;
gettimeofday(&tv, 0);
return tv.tv_sec;
}
// @brief: aktualny czas w milisekundach
static uint64_t in_msec(void) throw()
{
timeval tv;
gettimeofday(&tv, 0);
return ((uint64_t)tv.tv_sec)*1000ULL + ((uint64_t)tv.tv_usec)/1000ULL;
}
// @brief: aktualny czas w mikrosekundach
static uint64_t in_usec(void) throw()
{
timeval tv;
gettimeofday(&tv, 0);
return ((uint64_t)tv.tv_sec)*1000000ULL + ((uint64_t)tv.tv_usec);
}
// @brief: stempel czasowy (uwaga na zmiennej statycznej)
static const char *stamp(void) throw()
{
static char buf[stamp_length+1];
return stamp(buf);
}
// @brief: stempel czasowy
static const char *stamp(char *buf) throw()
{
time_t t = time(0);
struct tm lt;
if (localtime_r(&t, <) == NULL)
throw EInternal("localtime");
int sn = snprintf(buf, stamp_length+1, "%4d-%.2d-%.2d %.2d:%.2d:%.2d",
lt.tm_year+1900, lt.tm_mon+1, lt.tm_mday,
lt.tm_hour, lt.tm_min, lt.tm_sec);
if (sn != (int)stamp_length) throw EInternal("snprintf");
return buf;
}
// @brief: konwersja stempla czasowego do liczby sekund
static uint32_t stamp2secs(const char *stamp) throw()
{
tm lt;
char *c = NULL;
// "YYYY-" Liczba lat po 1900roku
lt.tm_year = strtol(stamp + 0, &c, 10) - 1900;
if (c != stamp + 4 || (*c) != '-') return -1;
// "MM-" Liczba miesiecy 0-11
lt.tm_mon = strtol(stamp + 5, &c, 10) - 1;
if (c != stamp + 7 || (*c) != '-' || lt.tm_mon < 0 || lt.tm_mon >= 12) return -1;
// "DD " Liczba dni 1-31
lt.tm_mday = strtol(stamp + 8, &c, 10);
if (c != stamp + 10 || (*c) != ' ' || lt.tm_mday <= 0 || lt.tm_mday > 31) return -1;
// "hh:" Liczba godzin 0-23
lt.tm_hour = strtol(stamp + 11, &c, 10);
if (c != stamp + 13 || (*c) != ':' || lt.tm_hour < 0 || lt.tm_hour >= 24) return -1;
// "mm:" Liczba minut 0-59
lt.tm_min = strtol(stamp + 14, &c, 10);
if (c != stamp + 16 || (*c) != ':' || lt.tm_min < 0 || lt.tm_min >= 60) return -1;
// "ss" Liczba sekund 0-59
if (stamp[17] < '0' || stamp[17] > '9' || stamp[18] < '0' || stamp[18] > '9') return -1;
lt.tm_sec = (stamp[17]-'0')*10 + (stamp[17]-'0'); // "ss"
if (lt.tm_sec < 0 || lt.tm_sec >= 60) return -1;
lt.tm_isdst = -1;
return (uint32_t)mktime(<);
}
private:
// nie udostepniamy konstruktorow obiektu,
// uzywamy tylko statycznych funkcji
Time(void) { }
Time(const Time &) { }
~Time(void) { }
};
#endif