1 # This file is part of NIT ( http://www.nitlanguage.org ).
3 # Copyright 2008 Floréal Morandat <morandat@lirmm.fr>
4 # Copyright 2014 Alexandre Terrasa <alexandre@moz-code.org>
6 # This file is free software, which comes along with NIT. This software is
7 # distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
8 # without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
9 # PARTICULAR PURPOSE. You can modify it is you want, provided this header
10 # is kept unaltered, and a notification of the changes is added.
11 # You are allowed to redistribute it and sell it, alone or is a part of
14 # Management of time and dates
25 # The number of seconds elapsed since January 1, 1970
27 # Uses the Unix function `time`.
28 fun get_time
: Int `{ return time(NULL); `}
30 # The number of milliseconds elapsed since January 1, 1970
32 # Returns `get_microtime
/ 1000`
33 fun get_millitime: Int do return get_microtime / 1000
35 # The number of microseconds elapsed since January 1, 1970
37 # Uses the Unix function `gettimeofday
`.
38 fun get_microtime: Int `{
40 gettimeofday
(&val
, NULL);
41 return val
.tv_sec
* 1000000 + val
.tv_usec
;
45 # Wait a specific number of second and nanoseconds
47 # Returns `true` if interrupted by a signal.
48 fun nanosleep(sec, nanosec: Int): Bool `{
49 const struct timespec req
= {sec, nanosec};
50 return nanosleep
(&req
, NULL);
55 # Sleep approximately `self` seconds
57 # Is not interrupted by signals.
60 long ns
= (self-s
) * 1000000000.0;
61 struct timespec req
= {s, ns};
63 while (nanosleep
(&req
, &req
)) { }
68 extern class TimeT `{time_t`}
70 # Returns Time since epoch from now.
71 new `{ return time(NULL); `}
73 # Returns Time since epoch from `i
` (expressed in seconds).
74 new from_i(i: Int) `{ return i; `}
76 # Update current time.
77 fun update
`{ time(&self); `}
79 # Convert `self` to a human readable String.
80 fun ctime: String import CString.to_s `{
81 return CString_to_s( ctime
(&self) );
84 # Difference in secondes from start (self if the end time)
85 fun difftime(start: TimeT): Float `{ return difftime(self, start); `}
87 redef fun to_s
do return ctime
.replace
("\n", "")
89 # Convert self to Int (expressed as seconds since epoch).
90 fun to_i
: Int `{ return (int)self; `}
94 extern class Tm `{struct tm *`}
96 # Create a new Time structure expressed in Coordinated Universal Time (UTC).
99 time_t t = time(NULL);
104 # Create a new Time structure expressed in UTC from `t`.
105 new gmtime_from_timet
(t
: TimeT) `{
111 # Create a new Time structure expressed in the local timezone.
114 time_t t = time(NULL);
119 # Create a new Time structure expressed in the local timezone from `t`.
120 new localtime_from_timet
(t
: TimeT) `{
126 # Convert `self` as a TimeT.
127 fun to_timet
: TimeT `{ return mktime(self); `}
129 # Seconds after the minute.
130 fun sec: Int `{ return self->tm_sec; `}
132 # Minutes after the hour.
133 fun min
: Int `{ return self->tm_min; `}
135 # hours since midnight.
136 fun hour: Int `{ return self->tm_hour; `}
139 fun mday
: Int `{ return self->tm_mday; `}
141 # Months since January.
142 fun mon: Int `{ return self->tm_mon; `}
145 fun year
: Int `{ return self->tm_year; `}
148 fun wday: Int `{ return self->tm_wday; `}
150 # Days since January 1st.
151 fun yday
: Int `{ return self->tm_yday; `}
153 # Is `self` in Daylight Saving Time.
154 fun is_dst: Bool `{ return self->tm_isdst; `}
156 # Convert `self` to a human readable String.
157 private fun asctime
: CString `{ return asctime(self); `}
159 # Convert `self` to a human readable String corresponding to `format
`.
160 # TODO document allowed format.
161 fun strftime(format: String): String import String.to_cstring, CString.to_s `{
162 char
* buf
, *c_format
;
164 buf
= (char
*)malloc
(100);
165 c_format
= String_to_cstring(format
);
167 strftime
(buf
, 100, c_format
, self);
168 String s
= CString_to_s(buf
);
173 redef fun to_s do return asctime.to_s.replace("\n", "")
176 # Date using the international format defined by ISO 8601.
180 # # By default ISODate at today.
181 # var date = new ISODate
182 # var tm = new Tm.localtime
183 # assert date.year == tm.year + 1900
184 # assert date.month == tm.mon + 1
185 # assert date.day == tm.mday
187 # # ISODate can be initialized from a String.
188 # date = new ISODate.from_string("1970-01-01T00:00:00Z")
189 # assert date.year == 1970
190 # assert date.month == 1
191 # assert date.day == 1
193 # # ISODate can be printed as String following the ISO format.
194 # assert date.to_s == "1970-01-01T00:00:00Z"
196 # Note that only the `YYYY-MM-DDTHH:MM:SSZ` is supported for now.
198 # See <http://www.w3.org/QA/Tips/iso-date>
203 var year: Int is noinit
205 # UTC months as Int (`1` for January).
206 var month: Int is noinit
208 # UTC days as Int (starting at `1`).
209 var day: Int is noinit
212 var hours: Int is noinit
214 # UTC minutes as Int.
215 var minutes: Int is noinit
217 # UTC seconds as Int.
218 var seconds: Int is noinit
220 # UTC timezone marker.
222 # Note that I don't know what will happen if you change this value...
226 var t = new Tm.localtime
235 # Init `self` from a ISODate formatted string.
236 init from_string(str: String) do
237 year = str.substring(0, 4).to_i
238 month = str.substring(5, 2).to_i
239 day = str.substring(8, 2).to_i
240 hours = str.substring(11, 2).to_i
241 minutes = str.substring(14, 2).to_i
242 seconds = str.substring(17, 2).to_i
243 timezone = str.substring(19, str.length)
247 var buff = new FlatBuffer
248 buff.append year.to_s
250 if month < 10 then buff.add '0'
251 buff.append month.to_s
253 if day < 10 then buff.add '0'
256 if hours < 10 then buff.add '0'
257 buff.append hours.to_s
259 if minutes < 10 then buff.add '0'
260 buff.append minutes.to_s
262 if seconds < 10 then buff.add '0'
263 buff.append seconds.to_s
265 return buff.write_to_string
268 redef type OTHER: ISODate
270 # TODO handle timezones
271 redef fun <(o) do return to_s < o.to_s