-
Notifications
You must be signed in to change notification settings - Fork 73
/
Copy pathmoonphase.js
82 lines (70 loc) · 2.77 KB
/
moonphase.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
/*
moonphase.js - by Don Cross - 2019-05-13
Example Node.js program for Astronomy Engine:
https://github.com/cosinekitty/astronomy
This program calculates the Moon's phase for a given date and time,
or for the computer's current date and time if none is given.
It also finds the dates and times of the subsequent 10 quarter phase changes.
To execute, run the command:
node moonphase [date]
*/
const Astronomy = require('./astronomy.js');
function Pad(s, w) {
s = s.toFixed(0);
while (s.length < w) {
s = '0' + s;
}
return s;
}
function FormatDate(date) {
var year = Pad(date.getUTCFullYear(), 4);
var month = Pad(1 + date.getUTCMonth(), 2);
var day = Pad(date.getUTCDate(), 2);
var hour = Pad(date.getUTCHours(), 2);
var minute = Pad(date.getUTCMinutes(), 2);
var svalue = date.getUTCSeconds() + (date.getUTCMilliseconds() / 1000);
var second = Pad(Math.round(svalue), 2);
return `${year}-${month}-${day} ${hour}:${minute}:${second} UTC`;
}
function ParseDate(text) {
const d = new Date(text);
if (!Number.isFinite(d.getTime())) {
console.error(`ERROR: Not a valid date: "${text}"`);
process.exit(1);
}
return d;
}
function Demo() {
const date = (process.argv.length === 3) ? ParseDate(process.argv[2]) : new Date();
// Calculate the Moon's ecliptic phase angle,
// which ranges from 0 to 360 degrees.
// 0 degrees = new moon,
// 90 degrees = first quarter,
// 180 degrees = full moon,
// 270 degrees = third quarter.
const phase = Astronomy.MoonPhase(date);
console.log(`${FormatDate(date)} : Moon's ecliptic phase angle = ${phase.toFixed(3)} degrees.`);
// Calculate the fraction of the Moon's disc
// that appears illuminated, as seen from the Earth.
const illum = Astronomy.Illumination(Astronomy.Body.Moon, date);
console.log(`${FormatDate(date)} : Moon's illuminated fraction = ${illum.phase_fraction.toFixed(2)}%.`);
console.log('');
// Predict when the next 10 lunar quarter phases will happen.
console.log('The next 10 lunar quarters are:');
const QuarterName = ['New Moon', 'First Quarter', 'Full Moon', 'Third Quarter'];
let mq;
for (let i=0; i < 10; ++i) {
if (mq === undefined) {
// The first time around the for loop, we search forward
// from the current date and time to find the next quarter
// phase, whatever it might be.
mq = Astronomy.SearchMoonQuarter(date);
} else {
// Use the previous moon quarter information to find the next quarter phase event.
mq = Astronomy.NextMoonQuarter(mq);
}
console.log(`${FormatDate(mq.time.date)} : ${QuarterName[mq.quarter]}`);
}
}
Demo();
process.exit(0);