-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
Copy path03-date-tasks.js
114 lines (102 loc) · 3.68 KB
/
03-date-tasks.js
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
'use strict';
/********************************************************************************************
* *
* Plese read the following tutorial before implementing tasks: *
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Numbers_and_dates#Date_object
* https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date *
* npm test ./test/03-date-tests.js *
********************************************************************************************/
/**
* Parses a rfc2822 string date representation into date value
* For rfc2822 date specification refer to : http://tools.ietf.org/html/rfc2822#page-14
*
* @param {string} value
* @return {date}
*
* @example:
* 'December 17, 1995 03:24:00' => Date()
* 'Tue, 26 Jan 2016 13:48:02 GMT' => Date()
* 'Sun, 17 May 1998 03:00:00 GMT+01' => Date()
*/
function parseDataFromRfc2822(value) {
return Date.parse(value);
}
/**
* Parses an ISO 8601 string date representation into date value
* For ISO 8601 date specification refer to : https://en.wikipedia.org/wiki/ISO_8601
*
* @param {string} value
* @return {date}
*
* @example :
* '2016-01-19T16:07:37+00:00' => Date()
* '2016-01-19T08:07:37Z' => Date()
*/
function parseDataFromIso8601(value) {
return Date.parse(value);
}
/**
* Returns true if specified date is leap year and false otherwise
* Please find algorithm here: https://en.wikipedia.org/wiki/Leap_year#Algorithm
*
* @param {date} date
* @return {bool}
*
* @example :
* Date(1900,1,1) => false
* Date(2000,1,1) => true
* Date(2001,1,1) => false
* Date(2012,1,1) => true
* Date(2015,1,1) => false
*/
function isLeapYear(date) {
let year = date.getFullYear();
return ((year % 4 == 0) && (year % 100 != 0)) || (year % 400 == 0);
}
/**
* Returns the string represention of the timespan between two dates.
* The format of output string is "HH:mm:ss.sss"
*
* @param {date} startDate
* @param {date} endDate
* @return {string}
*
* @example:
* Date(2000,1,1,10,0,0), Date(2000,1,1,11,0,0) => "01:00:00.000"
* Date(2000,1,1,10,0,0), Date(2000,1,1,10,30,0) => "00:30:00.000"
* Date(2000,1,1,10,0,0), Date(2000,1,1,10,0,20) => "00:00:20.000"
* Date(2000,1,1,10,0,0), Date(2000,1,1,10,0,0,250) => "00:00:00.250"
* Date(2000,1,1,10,0,0), Date(2000,1,1,15,20,10,453) => "05:20:10.453"
*/
function timeSpanToString(startDate, endDate) {
return (new Date(endDate - startDate)).toISOString().slice(11, -1);
}
/**
* Returns the angle (in radians) between the hands of an analog clock for the specified Greenwich time.
* If you have problem with solution please read: https://en.wikipedia.org/wiki/Clock_angle_problem
*
* @param {date} date
* @return {number}
*
* @example:
* Date.UTC(2016,2,5, 0, 0) => 0
* Date.UTC(2016,3,5, 3, 0) => Math.PI/2
* Date.UTC(2016,3,5,18, 0) => Math.PI
* Date.UTC(2016,3,5,21, 0) => Math.PI/2
*/
function angleBetweenClockHands(date) {
const hoursArrow = 0.5 * (60 * (date.getUTCHours() % 12) + date.getUTCMinutes());
const minutesArrow = 6 * date.getUTCMinutes();
let angle = Math.abs(hoursArrow - minutesArrow);
if (angle > 180) {
angle = 360 - angle;
}
return (angle * Math.PI / 180);
}
module.exports = {
parseDataFromRfc2822: parseDataFromRfc2822,
parseDataFromIso8601: parseDataFromIso8601,
isLeapYear: isLeapYear,
timeSpanToString: timeSpanToString,
angleBetweenClockHands: angleBetweenClockHands
};