1 /**
2 * Proleptic Gregorian calendar: timestamp
3 *
4 * Copyright: Maxim Freck, 2016–2017.
5 * Authors: Maxim Freck <maxim@freck.pp.ru>
6 * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
7 */
8 module pgc.timestamp;
9
10 public import pgc.date;
11 public import pgc.exception;
12 public import pgc.time;
13
14 alias Timestamp = ulong;
15
16 /***********************************
17 * Returns: Timestamp ulong for a given date and time
18 *
19 * Params:
20 * date = Date uint
21 * time = Time uint
22 *
23 * See_Also: `pgc.date.mkDate`, `pgc.time.mkTime`
24 */
25 pure nothrow Timestamp mkTimestamp(Date date, Time time) @safe @nogc
26 {
27 return ( (cast(ulong)(date) << 32) | time );
28 }
29
30 /***********************************
31 * Returns: Date uint for a given timestamp
32 *
33 * Params:
34 * stamp = timestamp
35 */
36 pure nothrow Date date(Timestamp stamp) @safe @nogc
37 {
38 return cast(Date)(stamp >> 32);
39 }
40
41 /***********************************
42 * Returns: Time uint for a given timestamp
43 *
44 * Params:
45 * stamp = timestamp
46 */
47 pure nothrow Time time(Timestamp stamp) @safe @nogc
48 {
49 return cast(Time)(stamp);
50 }
51
52 version(Posix) {
53 import core.sys.posix.sys.time: gettimeofday, gmtime, localtime, timeval;
54
55 /***********************************
56 * Returns: the current timestamp in UTC
57 */
58 Timestamp ThisMomentUTC()
59 {
60 timeval time;
61 gettimeofday(&time, null);
62 auto tm = gmtime(&time.tv_sec);
63 return mkTimestamp(
64 mkDate(tm.tm_mday, tm.tm_mon+1, tm.tm_year+1900),
65 mkTime(tm.tm_hour, tm.tm_min, tm.tm_sec, cast(int)(time.tv_usec/31))
66 );
67 }
68
69 /***********************************
70 * Returns: the current timestamp in a local time zone
71 */
72 Timestamp ThisMomentLocal()
73 {
74 timeval time;
75 gettimeofday(&time, null);
76 auto tm = localtime(&time.tv_sec);
77 return mkTimestamp(
78 mkDate(tm.tm_mday, tm.tm_mon+1, tm.tm_year+1900),
79 mkTime(tm.tm_hour, tm.tm_min, tm.tm_sec, cast(int)(time.tv_usec/31))
80 );
81 }
82 }
83
84 version(Windows) {
85 import core.sys.windows.windows: GetLocalTime, GetSystemTime, SYSTEMTIME;
86
87 /***********************************
88 * Returns: the current timestamp in UTC
89 */
90 Timestamp thisMomentUTC()
91 {
92 SYSTEMTIME time;
93 GetSystemTime(&time);
94 return mkTimestamp(
95 mkDate(time.wDay, time.wMonth, time.wYear),
96 mkTime(time.wHour, time.wMinute, time.wSecond, time.wMilliseconds*32)
97 );
98 }
99
100 /***********************************
101 * Returns: the current timestamp in a local time zone
102 */
103 Timestamp thisMomentLocal()
104 {
105 SYSTEMTIME time;
106 GetLocalTime(&time);
107 return mkTimestamp(
108 mkDate(time.wDay, time.wMonth, time.wYear),
109 mkTime(time.wHour, time.wMinute, time.wSecond, time.wMilliseconds*32)
110 );
111 }
112 }