stdweb/webapi/
date.rs

1use webcore::value::Reference;
2use webcore::try_from::TryInto;
3
4/// [(JavaScript docs)](https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Date)
5/// https://www.ecma-international.org/ecma-262/6.0/#sec-date-constructor
6#[derive(Clone, Debug, PartialEq, Eq, ReferenceType)]
7#[reference(instance_of = "Date")]
8pub struct Date( Reference );
9
10impl Date {
11    /// Creates a JavaScript Date instance that represents a single moment in time.
12    /// Date objects are based on a time value that is the number of milliseconds since 1 January 1970 UTC.
13    ///
14    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
15    // https://www.ecma-international.org/ecma-262/6.0/#sec-date-constructor-date
16    pub fn new() -> Self {
17        js!(
18            return new Date();
19        ).try_into().unwrap()
20    }
21
22   
23    /// Creates a JavaScript Date instance that represents a single moment in time.
24    /// Date objects are based on a time value that is the number of milliseconds since 1 January 1970 UTC.
25    /// 
26    /// year is an integer value representing the year. Values from 0 to 99 map to the years 1900 to 1999.
27    /// month is an integer value representing the month, beginning with 0 for January to 11 for December
28    /// day is an integer value representing the day of the month (normally from 1 to 31)
29    /// hours an integer value representing the minute segment of a time
30    /// seconds an integer value representing the second segment of a time
31    /// milliseconds an integer value representing the millisecond segment of a time
32    ///
33    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
34    // https://www.ecma-international.org/ecma-262/6.0/#sec-date-year-month-date-hours-minutes-seconds-ms
35    pub fn from_datetime(year: i32, month: i32, day: i32, hours: i32, minutes: i32, seconds: i32, milliseconds: i32) -> Self {
36        js!(
37            return new Date(@{year}, @{month}, @{day}, @{hours}, @{minutes}, @{seconds}, @{milliseconds});
38        ).try_into().unwrap()
39    }
40
41    /// Creates a JavaScript Date instance that represents a single moment in time.
42    /// Date objects are based on a time value that is the number of milliseconds since 1 January 1970 UTC.
43    /// 
44    /// String value representing a date. The string should be in a format recognized by
45    /// the Date.parse() method (IETF-compliant RFC 2822 timestamps and also a version of ISO8601).
46    ///
47    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
48    // https://www.ecma-international.org/ecma-262/6.0/#sec-date-value
49    pub fn from_iso8601(date_string: &str) -> Self {
50        js!(
51            return new Date(@{date_string});
52        ).try_into().unwrap()
53    }
54    
55    /// Creates a JavaScript Date instance that represents a single moment in time.
56    /// Date objects are based on a time value that is the number of milliseconds since 1 January 1970 UTC.
57    /// 
58    /// Integer value representing the number of milliseconds since January 1, 1970, 00:00:00 UTC,
59    /// with leap seconds ignored (Unix Epoch; but consider that most Unix timestamp functions count in seconds).
60    ///
61    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
62    // https://www.ecma-international.org/ecma-262/6.0/#sec-date-value
63    pub fn from_time(now: f64) -> Self {
64        js!(
65            return new Date(@{now});
66        ).try_into().unwrap()
67    }
68
69    /// The Date.UTC() method accepts the same parameters as the longest form of the constructor, and
70    /// returns the number of milliseconds in a Date object since January 1, 1970, 00:00:00, universal time.
71    ///
72    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/UTC)
73    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.utc
74    pub fn utc(year: i32, month: i32, day: i32, hours: i32, minutes: i32, seconds: i32, milliseconds: i32) -> f64 {
75        js!(
76            return Date.UTC(@{year}, @{month}, @{day}, @{hours}, @{minutes}, @{seconds}, @{milliseconds});
77        ).try_into().unwrap()
78    }
79    
80    /// The Date.parse() method parses a string representation of a date, and returns the number of
81    /// milliseconds since January 1, 1970, 00:00:00 UTC or NaN if the string is unrecognized or, in
82    /// some cases, contains illegal date values (e.g. 2015-02-31).
83    ///
84    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date)
85    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.parse
86    pub fn parse(date_string: &str) -> f64 {
87        js!(
88            return Date.parse(@{date_string});
89        ).try_into().unwrap()
90    }
91
92    /// The Date.now() method returns the number of milliseconds elapsed since 1 January 1970 00:00:00 UTC.
93    ///
94    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/now)
95    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.now
96    pub fn now() -> f64 {
97        js!(
98            return Date.now();
99        ).try_into().unwrap()
100    }
101    
102    /// The getDate() method returns the day of the month for the specified date according to local time.
103    ///
104    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDate)
105    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getdate
106    pub fn get_date(&self) -> i32 {
107        js!(
108            return @{self}.getDate();
109        ).try_into().unwrap()
110    }
111
112    /// The getDay() method returns the day of the week for the specified date according to local time,
113    /// where 0 represents Sunday. For the day of the month see getDate().
114    ///
115    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay)
116    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getday
117    pub fn get_day(&self) -> i32 {
118        js!(
119            return @{self}.getDay();
120        ).try_into().unwrap()
121    }
122
123    /// The getFullYear() method returns the year of the specified date according to local time.
124    ///
125    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getDay)
126    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getfullyear
127    pub fn get_full_year(&self) -> i32 {
128        js!(
129            return @{self}.getFullYear();
130        ).try_into().unwrap()
131    }
132
133    /// The getHours() method returns the hour for the specified date, according to local time.
134    ///
135    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getHours)
136    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.gethours
137    pub fn get_hours(&self) -> i32 {
138        js!(
139            return @{self}.getHours();
140        ).try_into().unwrap()
141    }
142
143    /// The getMilliseconds() method returns the milliseconds in the specified date according to local time.
144    ///
145    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMilliseconds)
146    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getmilliseconds
147    pub fn get_milliseconds(&self) -> i32 {
148        js!(
149            return @{self}.getMilliseconds();
150        ).try_into().unwrap()
151    }
152
153    /// The getMinutes() method returns the minutes in the specified date according to local time.
154    ///
155    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMinutes)
156    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getminutes
157    pub fn get_minutes(&self) -> i32 {
158        js!(
159            return @{self}.getMinutes();
160        ).try_into().unwrap()
161    }
162
163    /// The getMonth() method returns the month in the specified date according to local time, as a
164    /// zero-based value (where zero indicates the first month of the year).
165    ///
166    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getMonth)
167    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getmonth
168    pub fn get_month(&self) -> i32 {
169        js!(
170            return @{self}.getMonth();
171        ).try_into().unwrap()
172    }
173
174    /// The getSeconds() method returns the seconds in the specified date according to local time.
175    ///
176    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getSeconds)
177    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getseconds
178    pub fn get_seconds(&self) -> i32 {
179        js!(
180            return @{self}.getSeconds();
181        ).try_into().unwrap()
182    }
183
184    /// The getTime() method returns the numeric value corresponding to the time for the specified
185    /// date according to universal time.
186    ///
187    /// getTime() always uses UTC for time representation. For example, a client browser in one timezone,
188    /// getTime() will be the same as a client browser in any other timezone.
189    ///
190    /// You can use this method to help assign a date and time to another Date object. This method is
191    /// functionally equivalent to the valueOf() method.
192    ///
193    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTime)
194    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.gettime
195    pub fn get_time(&self) -> f64 {
196        js!(
197            return @{self}.getTime();
198        ).try_into().unwrap()
199    }
200
201    /// The getTimezoneOffset() method returns the time zone difference, in minutes, from current locale (host system settings) to UTC.
202    ///
203    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getTimezoneOffset)
204    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.gettimezoneoffset
205    pub fn get_timezone_offset(&self) -> i32 {
206        js!(
207            return @{self}.getTimezoneOffset();
208        ).try_into().unwrap()
209    }
210    
211    /// The getUTCDate() method returns the day (date) of the month in the specified date according to
212    /// universal time.
213    ///
214    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDate)
215    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcdate
216    pub fn get_utc_date(&self) -> i32 {
217        js!(
218            return @{self}.getUTCDate();
219        ).try_into().unwrap()
220    }
221
222    /// The getUTCDay() method returns the day of the week in the specified date according to universal
223    /// time, where 0 represents Sunday.
224    ///
225    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCDay)
226    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcday
227    pub fn get_utc_day(&self) -> i32 {
228        js!(
229            return @{self}.getUTCDay();
230        ).try_into().unwrap()
231    }
232
233    /// The getUTCFullYear() method returns the year in the specified date according to universal time.
234    ///
235    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCFullYear)
236    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcfullyear
237    pub fn get_utc_full_year(&self) -> i32 {
238        js!(
239            return @{self}.getUTCFullYear();
240        ).try_into().unwrap()
241    }
242
243    /// The getUTCHours() method returns the hours in the specified date according to universal time.
244    ///
245    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCHours)
246    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutchours
247    pub fn get_utc_hours(&self) -> i32 {
248        js!(
249            return @{self}.getUTCHours();
250        ).try_into().unwrap()
251    }
252
253    /// The getUTCMilliseconds() method returns the milliseconds in the specified date according to
254    /// universal time.
255    ///
256    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMilliseconds)
257    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcmilliseconds
258    pub fn get_utc_milliseconds(&self) -> i32 {
259        js!(
260            return @{self}.getUTCMilliseconds();
261        ).try_into().unwrap()
262    }
263
264    /// The getUTCMinutes() method returns the minutes in the specified date according to universal time.
265    ///
266    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMinutes)
267    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcminutes
268    pub fn get_utc_minutes(&self) -> i32 {
269        js!(
270            return @{self}.getUTCMinutes();
271        ).try_into().unwrap()
272    }
273
274    /// The getUTCMonth() returns the month of the specified date according to universal time, as a
275    /// zero-based value (where zero indicates the first month of the year).
276    ///
277    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCMonth)
278    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcmonth
279    pub fn get_utc_month(&self) -> i32 {
280        js!(
281            return @{self}.getUTCMonth();
282        ).try_into().unwrap()
283    }
284    
285    /// The getUTCSeconds() method returns the seconds in the specified date according to universal time.
286    ///
287    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/getUTCSeconds)
288    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.getutcseconds
289    pub fn get_utc_seconds(&self) -> i32 {
290        js!(
291            return @{self}.getUTCSeconds();
292        ).try_into().unwrap()
293    }
294
295    /// The setDate() method sets the day of the Date object relative to the beginning of the currently set month.
296    ///
297    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setDate)
298    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setdate
299    pub fn set_date(&self, date: i32) {
300        js!{ @(no_return)
301            @{self}.setDate(@{date});
302        }
303    }
304
305    /// The setFullYear() method sets the full year for a specified date according to local time. Returns new timestamp.
306    ///
307    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setFullYear)
308    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setfullyear
309    pub fn set_full_year(&self, full_year: i32) {
310        js!{ @(no_return)
311            @{self}.setFullYear(@{full_year});
312        }
313    }
314
315    /// The setHours() method sets the hours for a specified date according to local time, and returns the number of milliseconds
316    /// since January 1, 1970 00:00:00 UTC until the time represented by the updated Date instance.
317    ///
318    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setHours)
319    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.sethours
320    pub fn set_hours(&self, hours: i32) {
321        js!{ @(no_return)
322            @{self}.setHours(@{hours});
323        }
324    }
325
326    /// The setMilliseconds() method sets the milliseconds for a specified date according to local time.
327    ///
328    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMilliseconds)
329    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setmilliseconds
330    pub fn set_milliseconds(&self, milliseconds: i32) {
331        js!{ @(no_return)
332            @{self}.setMilliseconds(@{milliseconds});
333        }
334    }
335
336    /// The setMinutes() method sets the minutes for a specified date according to local time.
337    ///
338    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMinutes)
339    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setminutes
340    pub fn set_minutes(&self, minutes: i32) {
341        js!{ @(no_return)
342            @{self}.setMinutes(@{minutes});
343        }
344    }
345
346    /// The setMonth() method sets the month for a specified date according to the currently set year.
347    ///
348    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setMonth)
349    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setmonth
350    pub fn set_month(&self, month: i32) {
351        js!{ @(no_return)
352            @{self}.setMonth(@{month});
353        }
354    }
355
356    /// The setSeconds() method sets the seconds for a specified date according to local time.
357    ///
358    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setSeconds)
359    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setseconds
360    pub fn set_seconds(&self, seconds: i32) {
361        js!{ @(no_return)
362            @{self}.setSeconds(@{seconds});
363        }
364    }
365
366    /// The setTime() method sets the Date object to the time represented by a number of milliseconds since
367    /// January 1, 1970, 00:00:00 UTC.
368    ///
369    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setTime)
370    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.settime
371    pub fn set_time(&self, time: f64) {
372        js!{ @(no_return)
373            @{self}.setTime(@{time});
374        }
375    }
376
377    /// The setUTCDate() method sets the day of the month for a specified date according to universal time.
378    ///
379    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCDate)
380    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutcdate
381    pub fn set_utc_date(&self, date: i32) {
382        js!{ @(no_return)
383            @{self}.setUTCDate(@{date});
384        }
385    }
386
387    /// The setUTCFullYear() method sets the full year for a specified date according to universal time.
388    ///
389    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCFullYear)
390    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutcfullyear
391    pub fn set_utc_full_year(&self, full_year: i32) {
392        js!{ @(no_return)
393            @{self}.setUTCFullYear(@{full_year});
394        }
395    }
396
397    /// The setUTCHours() method sets the hour for a specified date according to universal time, and returns the number
398    /// of milliseconds since  January 1, 1970 00:00:00 UTC until the time represented by the updated Date instance.
399    ///
400    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCHours)
401    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutchours
402    pub fn set_utc_hours(&self, hours: i32) {
403        js!{ @(no_return)
404            @{self}.setUTCHours(@{hours});
405        }
406    }
407
408    /// The setUTCMilliseconds() method sets the milliseconds for a specified date according to universal time.
409    ///
410    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMilliseconds)
411    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutcmilliseconds
412    pub fn set_utc_milliseconds(&self, milliseconds: i32) {
413        js!{ @(no_return)
414            @{self}.setUTCMilliseconds(@{milliseconds});
415        }
416    }
417
418    /// The setUTCMinutes() method sets the minutes for a specified date according to universal time.
419    ///
420    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMinutes)
421    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutcminutes
422    pub fn set_utc_minutes(&self, minutes: i32) {
423        js!{ @(no_return)
424            @{self}.setUTCMinutes(@{minutes});
425        }
426    }
427
428    /// The setUTCMonth() method sets the month for a specified date according to universal time.
429    ///
430    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCMonth)
431    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutcmonth
432    pub fn set_utc_month(&self, month: i32) {
433        js!{ @(no_return)
434            @{self}.setUTCMonth(@{month});
435        }
436    }
437
438    /// The setUTCSeconds() method sets the seconds for a specified date according to universal time.
439    ///
440    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/setUTCSeconds)
441    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.setutcseconds
442    pub fn set_utc_seconds(&self, seconds: i32) {
443        js!{ @(no_return)
444            @{self}.setUTCSeconds(@{seconds});
445        }
446    }
447
448    /// The toDateString() method returns the date portion of a Date object in human readable form in American English.
449    ///
450    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString)
451    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.todatestring
452    #[inline]
453    pub fn to_date_string(&self) -> String {
454        js!(
455            return @{self}.toDateString();
456        ).try_into().unwrap()
457    }
458
459    /// The toISOString() method returns a string in simplified extended ISO format (ISO 8601), which is always 24 or 27
460    /// characters long (YYYY-MM-DDTHH:mm:ss.sssZ or ±YYYYYY-MM-DDTHH:mm:ss.sssZ, respectively). The timezone is always zero
461    /// UTC offset, as denoted by the suffix "Z".
462    ///
463    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString)
464    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.toisostring
465    #[inline]
466    pub fn to_iso_string(&self) -> String {
467        js!(
468            return @{self}.toISOString();
469        ).try_into().unwrap()
470    }
471
472    /// The toJSON() method returns a string representation of the Date object.
473    ///
474    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toJSON)
475    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.tojson
476    #[inline]
477    pub fn to_json(&self) -> String {
478        js!(
479            return @{self}.toJSON();
480        ).try_into().unwrap()
481    }
482
483    /// The toString() method returns a string representing the specified Date object.
484    ///
485    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toString)
486    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.tostring
487    #[inline]
488    pub fn to_string(&self) -> String {
489        js!(
490            return @{self}.toString();
491        ).try_into().unwrap()
492    }
493
494    /// The toTimeString() method returns the time portion of a Date object in human readable form in American English.
495    ///
496    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toTimeString)
497    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.totimestring
498    #[inline]
499    pub fn to_time_string(&self) -> String {
500        js!(
501            return @{self}.toTimeString();
502        ).try_into().unwrap()
503    }
504
505    /// The toUTCString() method converts a date to a string, using the UTC time zone.
506    ///
507    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toUTCString)
508    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.toutcstring
509    #[inline]
510    pub fn to_utc_string(&self) -> String {
511        js!(
512            return @{self}.toUTCString();
513        ).try_into().unwrap()
514    }
515
516    /// The valueOf() method returns the primitive value of a Date object.
517    ///
518    /// [(JavaScript docs)](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/valueOf)
519    // https://www.ecma-international.org/ecma-262/6.0/#sec-date.prototype.valueof
520    pub fn value_of(&self) -> f64 {
521        js!(
522            return @{self}.valueOf();
523        ).try_into().unwrap()
524    }
525}
526
527#[cfg(test)]
528mod tests {
529    use super::*;
530
531    #[test]
532    fn test_date_now() {
533        let now = Date::now();
534        assert!( now > 0.0 );
535    }
536
537    #[test]
538    fn test_date_utc() {
539        let now = Date::utc(96, 1, 2, 3, 4, 5, 0);
540        assert_eq!(now, 823230245000.0);
541
542        let now = Date::utc(0, 0, 0, 0, 0, 0, 0);
543        assert_eq!(now, -2209075200000.0);
544    }
545
546    #[test]
547    fn test_date_parse() {
548        let now = Date::parse("01 Jan 1970 00:00:00 GMT");
549        assert_eq!(now, 0.0);
550
551        let now = Date::parse("04 Dec 1995 00:12:00 GMT");
552        assert_eq!(now, 818035920000.0);
553    }
554
555    #[test]
556    fn test_date_get_date() {
557        let now = Date::from_iso8601("August 19, 1975 23:15:30");
558        assert_eq!( now.get_date(), 19);
559    }
560
561    #[test]
562    fn test_date_get_day() {
563        let now = Date::from_iso8601("August 19, 1975 23:15:30");
564        assert_eq!(now.get_day(), 2);
565    }
566
567    #[test]
568    fn test_date_get_full_year() {
569        let now = Date::from_iso8601("August 19, 75 23:15:30");
570        assert_eq!(now.get_full_year(), 1975);
571    }
572
573    #[test]
574    fn test_date_get_hours() {
575        let now = Date::from_iso8601("August 19, 1975 23:15:30");
576        assert_eq!(now.get_hours(), 23);
577    }
578
579    #[test]
580    fn test_date_get_milliseconds() {
581        let now = Date::from_iso8601("August 19, 1975 23:15:30");
582        now.set_milliseconds(123);
583        assert_eq!(now.get_milliseconds(), 123);
584    }
585
586    #[test]
587    fn test_date_get_minutes() {
588        let now = Date::from_iso8601("August 19, 1975 23:15:30");
589        assert_eq!(now.get_minutes(), 15);
590    }
591
592    #[test]
593    fn test_date_get_month() {
594        let now = Date::from_iso8601("August 19, 1975 23:15:30");
595        assert_eq!(now.get_month(), 7);
596    }
597
598    #[test]
599    fn test_date_get_seconds() {
600        let now = Date::from_iso8601("August 19, 1975 23:15:30");
601        assert_eq!(now.get_seconds(), 30);
602    }
603
604    #[test]
605    fn test_date_get_time() {
606        let now = Date::from_iso8601("July 20, 69 00:20:18 GMT+00:00");
607        assert_eq!(now.get_time(), -14254782000.0);
608    }
609
610    #[test]
611    fn test_date_get_timezone_offset() {
612        // this is impossible to test like this, since this function depends on local time only.
613        // and there is no easy way to mock the system time, so the only real thing to check
614        // is that two dates return the same timezone offset.
615        let t1 = Date::from_iso8601("August 19, 1975 23:15:30 GMT+07:00");
616        let t2 = Date::from_iso8601("August 19, 1975 23:15:30 GMT-02:00");
617        assert_eq!(t1.get_timezone_offset(), t2.get_timezone_offset());
618    }
619
620    #[test]
621    fn test_date_get_utc_date() {
622        let now = Date::from_iso8601("August 19, 1975 23:15:30 GMT+11:00");
623        assert_eq!(now.get_utc_date(), 19);
624        let now = Date::from_iso8601("August 19, 1975 23:15:30 GMT-11:00");
625        assert_eq!(now.get_utc_date(), 20);
626    }
627
628    #[test]
629    fn test_date_get_utc_day() {
630        let now = Date::from_iso8601("August 19, 1975 23:15:30 GMT+11:00");
631        assert_eq!( now.get_utc_day(), 2 );
632        let now = Date::from_iso8601("August 19, 1975 23:15:30 GMT-11:00");
633        assert_eq!( now.get_utc_day(), 3 );
634    }
635
636    #[test]
637    fn test_date_get_utc_full_year() {
638        let now = Date::from_iso8601("December 31, 1975 23:15:30 GMT+11:00");
639        assert_eq!(now.get_utc_full_year(), 1975 );
640        let now = Date::from_iso8601("December 31, 1975 23:15:30 GMT-11:00");
641        assert_eq!(now.get_utc_full_year(), 1976 );
642    }
643
644    #[test]
645    fn test_date_get_utc_milliseconds() {
646        let now = Date::from_iso8601("August 19, 1975 23:15:30");
647        now.set_milliseconds(123);
648        assert_eq!(now.get_utc_milliseconds(), 123);
649    }
650
651    #[test]
652    fn test_date_get_utc_minutes() {
653        let now = Date::from_iso8601("August 19, 1975 23:15:30");
654        assert_eq!(now.get_utc_minutes(), 15);
655    }
656
657    #[test]
658    fn test_date_get_utc_month() {
659        let now = Date::from_iso8601("December 31, 1975 23:15:30 GMT+11:00");
660        assert_eq!(now.get_utc_month(), 11);
661        let now = Date::from_iso8601("December 31, 1975 23:15:30 GMT-11:00");
662        assert_eq!(now.get_utc_month(), 0);
663    }
664
665    #[test]
666    fn test_date_set_date() {
667        let now = Date::from_iso8601("August 19, 1975 23:15:30");
668        now.set_date(3);
669        assert_eq!(now.get_date(), 3);
670    }
671
672    #[test]
673    fn test_date_set_full_year() {
674        let now = Date::from_iso8601("August 19, 1975 23:15:30");
675        now.set_full_year(1969);
676        assert_eq!(now.get_full_year(), 1969);
677    }
678
679    #[test]
680    fn test_date_set_hours() {
681        let now = Date::from_iso8601("August 19, 1975 23:15:30");
682        now.set_hours(15);
683        assert_eq!(now.get_hours(), 15);
684    }
685
686    #[test]
687    fn test_date_set_milliseconds() {
688        let now = Date::from_iso8601("August 19, 1975 23:15:30");
689        now.set_milliseconds(123);
690        assert_eq!(now.get_milliseconds(), 123);
691    }
692
693    #[test]
694    fn test_date_set_minutes() {
695        let now = Date::from_iso8601("August 19, 1975 23:15:30");
696        now.set_minutes(42);
697        assert_eq!(now.get_minutes(), 42);
698    }
699
700    #[test]
701    fn test_date_set_month() {
702        let now = Date::from_iso8601("August 19, 1975 23:15:30");
703        now.set_month(9);
704        assert_eq!(now.get_month(), 9);
705    }
706
707    #[test]
708    fn test_date_set_seconds() {
709        let now = Date::from_iso8601("August 19, 1975 23:15:30");
710        now.set_seconds(59);
711        assert_eq!(now.get_seconds(), 59);
712    }
713
714    #[test]
715    fn test_date_set_time() {
716        let now = Date::from_iso8601("August 19, 1975 23:15:30");
717        now.set_time(818035920000.0);
718        assert_eq!(now.to_utc_string(), "Mon, 04 Dec 1995 00:12:00 GMT");
719    }
720
721    #[test]
722    fn test_date_set_utc_date() {
723        let now = Date::from_iso8601("August 19, 1975 23:15:30");
724        now.set_utc_date(3);
725        assert_eq!(now.get_utc_date(), 3);
726    }
727
728    #[test]
729    fn test_date_set_utc_full_year() {
730        let now = Date::from_iso8601("August 19, 1975 23:15:30");
731        now.set_utc_full_year(1969);
732        assert_eq!(now.get_utc_full_year(), 1969);
733    }
734
735    #[test]
736    fn test_date_set_utc_hours() {
737        let now = Date::from_iso8601("August 19, 1975 23:15:30");
738        now.set_utc_hours(15);
739        assert_eq!(now.get_utc_hours(), 15);
740    }
741
742    #[test]
743    fn test_date_set_utc_milliseconds() {
744        let now = Date::from_iso8601("August 19, 1975 23:15:30");
745        now.set_utc_milliseconds(123);
746        assert_eq!(now.get_utc_milliseconds(), 123);
747    }
748
749    #[test]
750    fn test_date_set_utc_minutes() {
751        let now = Date::from_iso8601("August 19, 1975 23:15:30");
752        now.set_utc_minutes(42);
753        assert_eq!(now.get_utc_minutes(), 42);
754    }
755
756    #[test]
757    fn test_date_set_utc_month() {
758        let now = Date::from_iso8601("August 19, 1975 23:15:30");
759        now.set_utc_month(9);
760        assert_eq!(now.get_utc_month(), 9);
761    }
762
763    #[test]
764    fn test_date_set_utc_seconds() {
765        let now = Date::from_iso8601("August 19, 1975 23:15:30");
766        now.set_utc_seconds(59);
767        assert_eq!(now.get_utc_seconds(), 59);
768    }
769
770    #[test]
771    fn test_date_to_date_string() {
772        let now = Date::from_datetime(1993, 6, 28, 14, 39, 7, 0);
773        assert_eq!(now.to_date_string(), "Wed Jul 28 1993");
774    }
775
776    #[test]
777    fn test_date_to_iso_string() {
778        let now = Date::from_iso8601("05 October 2011 14:48 UTC");
779        assert_eq!(now.to_iso_string(), "2011-10-05T14:48:00.000Z");
780    }
781
782    #[test]
783    fn test_date_to_json() {
784        let now = Date::from_iso8601("August 19, 1975 23:15:30 UTC");
785        assert_eq!(now.to_iso_string(), "1975-08-19T23:15:30.000Z");
786    }
787
788    #[test]
789    fn test_date_to_time_string() {
790        // not easy to test this due to time-zones
791    }
792
793    #[test]
794    fn test_date_to_utc_string() {
795        let now = Date::from_time(Date::utc(96, 1, 2, 3, 4, 5, 0));
796        assert_eq!(now.to_utc_string(), "Fri, 02 Feb 1996 03:04:05 GMT");
797    }
798
799    #[test]
800    fn test_date_value_of() {
801        let now = Date::from_time(Date::utc(96, 1, 2, 3, 4, 5, 0));
802        assert_eq!(now.value_of(), 823230245000.0);
803    }
804
805}