-
Notifications
You must be signed in to change notification settings - Fork 1.6k
Expand file tree
/
Copy path03-date-tasks.js
More file actions
131 lines (117 loc) · 4.04 KB
/
Copy path03-date-tasks.js
File metadata and controls
131 lines (117 loc) · 4.04 KB
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
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
'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 *
* *
********************************************************************************************/
/**
* 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 new Date(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 new Date(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) {
const year = date.getFullYear();
if (year % 4 != 0) {
return false;
}
else if (year % 100 != 0) {
return true;
}
else if (year % 400 != 0) {
return false;
}
else return true;
}
/**
* 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) {
const rez = endDate - startDate;
let h = Math.trunc(rez / 3600000 % 100).toString().padStart(2, '0');
let m = Math.trunc(rez / 60000 % 60).toString().padStart(2, '0');
let s = Math.trunc(rez / 1000 % 60).toString().padStart(2, '0');
let ms = Math.trunc(rez % 1000).toString().padStart(3, '0');
return (h + ':' + m + ':' + s + '.' + ms);
}
/**
* 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) {
let hours = date.getUTCHours();
let minutes = date.getUTCMinutes();
hours = (hours > 12 ? hours - 12 : hours);
let angle = Math.abs(0.5 * (60 * hours - 11 * minutes))
if (angle > 180) {
angle -= 180;
}
return angle * Math.PI / 180;
}
module.exports = {
parseDataFromRfc2822: parseDataFromRfc2822,
parseDataFromIso8601: parseDataFromIso8601,
isLeapYear: isLeapYear,
timeSpanToString: timeSpanToString,
angleBetweenClockHands: angleBetweenClockHands
};