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
24 # Unix time: the number of seconds elapsed since January 1, 1970
25 fun get_time
: Int `{ return time(NULL); `}
28 # Wait a specific number of second and nanoseconds
29 fun nanosleep(sec, nanosec: Int) `{
30 const struct timespec req
= {sec, nanosec};
31 nanosleep
(&req
, NULL);
36 # Sleep approximately `self` seconds
39 long ns
= (self-s
) * 1000000000.0;
40 const struct timespec req
= {s, ns};
41 nanosleep
(&req
, NULL);
46 extern class TimeT `{time_t`}
48 # Returns Time since epoch from now.
49 new `{ return time(NULL); `}
51 # Returns Time since epoch from `i
` (expressed in seconds).
52 new from_i(i: Int) `{ return i; `}
54 # Update current time.
55 fun update
`{ time(&self); `}
57 # Convert `self` to a human readable String.
58 fun ctime: String import NativeString.to_s_with_copy `{
59 return NativeString_to_s_with_copy( ctime
(&self) );
62 # Difference in secondes from start (self if the end time)
63 fun difftime(start: TimeT): Float `{ return difftime(self, start); `}
65 redef fun to_s
do return ctime
.replace
("\n", "")
67 # Convert self to Int (expressed as seconds since epoch).
68 fun to_i
: Int `{ return (int)self; `}
72 extern class Tm `{struct tm *`}
74 # Create a new Time structure expressed in Coordinated Universal Time (UTC).
77 time_t t = time(NULL);
82 # Create a new Time structure expressed in UTC from `t`.
83 new gmtime_from_timet
(t
: TimeT) `{
89 # Create a new Time structure expressed in the local timezone.
92 time_t t = time(NULL);
97 # Create a new Time structure expressed in the local timezone from `t`.
98 new localtime_from_timet
(t
: TimeT) `{
104 # Convert `self` as a TimeT.
105 fun to_timet
: TimeT `{ return mktime(self); `}
107 # Seconds after the minute.
108 fun sec: Int `{ return self->tm_sec; `}
110 # Minutes after the hour.
111 fun min
: Int `{ return self->tm_min; `}
113 # hours since midnight.
114 fun hour: Int `{ return self->tm_hour; `}
117 fun mday
: Int `{ return self->tm_mday; `}
119 # Months since January.
120 fun mon: Int `{ return self->tm_mon; `}
123 fun year
: Int `{ return self->tm_year; `}
126 fun wday: Int `{ return self->tm_wday; `}
128 # Days since January 1st.
129 fun yday
: Int `{ return self->tm_yday; `}
131 # Is `self` in Daylight Saving Time.
132 fun is_dst: Bool `{ return self->tm_isdst; `}
134 # Convert `self` to a human readable String.
135 fun asctime
: String import NativeString.to_s_with_copy
`{
136 return NativeString_to_s_with_copy( asctime(self) );
139 # Convert `self` to a human readable String corresponding to `format`.
140 # TODO document allowed format.
141 fun strftime
(format
: String): String import String.to_cstring
, NativeString.to_s
`{
142 char* buf, *c_format;
144 buf = (char*)malloc(100);
145 c_format = String_to_cstring(format);
147 strftime(buf, 100, c_format, self);
148 String s = NativeString_to_s_with_copy(buf);
153 redef fun to_s
do return asctime
.replace
("\n", "")
156 # Date using the international format defined by ISO 8601.
160 # # By default ISODate at today.
161 # var date = new ISODate
162 # var tm = new Tm.localtime
163 # assert date.year == tm.year + 1900
164 # assert date.month == tm.mon + 1
165 # assert date.day == tm.mday
167 # # ISODate can be initialized from a String.
168 # date = new ISODate.from_string("1970-01-01T00:00:00Z")
169 # assert date.year == 1970
170 # assert date.month == 1
171 # assert date.day == 1
173 # # ISODate can be printed as String following the ISO format.
174 # assert date.to_s == "1970-01-01T00:00:00Z"
176 # Note that only the `YYYY-MM-DDTHH:MM:SSZ` is supported for now.
178 # See <http://www.w3.org/QA/Tips/iso-date>
183 var year
: Int is noinit
185 # UTC months as Int (`1` for January).
186 var month
: Int is noinit
188 # UTC days as Int (starting at `1`).
189 var day
: Int is noinit
192 var hours
: Int is noinit
194 # UTC minutes as Int.
195 var minutes
: Int is noinit
197 # UTC seconds as Int.
198 var seconds
: Int is noinit
200 # UTC timezone marker.
202 # Note that I don't know what will happen if you change this value...
206 var t
= new Tm.localtime
215 # Init `self` from a ISODate formatted string.
216 init from_string
(str
: String) do
217 year
= str
.substring
(0, 4).to_i
218 month
= str
.substring
(5, 2).to_i
219 day
= str
.substring
(8, 2).to_i
220 hours
= str
.substring
(11, 2).to_i
221 minutes
= str
.substring
(14, 2).to_i
222 seconds
= str
.substring
(17, 2).to_i
223 timezone
= str
.substring
(19, str
.length
)
227 var buff
= new FlatBuffer
228 buff
.append year
.to_s
230 if month
< 10 then buff
.add
'0'
231 buff
.append month
.to_s
233 if day
< 10 then buff
.add
'0'
236 if hours
< 10 then buff
.add
'0'
237 buff
.append hours
.to_s
239 if minutes
< 10 then buff
.add
'0'
240 buff
.append minutes
.to_s
242 if seconds
< 10 then buff
.add
'0'
243 buff
.append seconds
.to_s
245 return buff
.write_to_string
248 redef type OTHER: ISODate
250 # TODO handle timezones
251 redef fun <(o
) do return to_s
< o
.to_s