diff --git a/README.md b/README.md index 34829a59..cdf8b9f7 100644 --- a/README.md +++ b/README.md @@ -153,8 +153,19 @@ Returns an object with the following properties: By default, it will search for moon rise and set during local user's day (frou 0 to 24 hours). If `inUTC` is set to true, it will instead search the specified date from 0 to 24 UTC hours. +### Solar time + +```js +SunCalc.getSolarTime(/*Date*/ date, /*Number*/ utcOffset, /*Number*/ longitude) +``` + +Returns the solar time of the given date in the given latitude and UTC offset. + ## Changelog +#### 1.9.0 — Jan 22, 2022 +- Added solar time. + #### 1.8.0 — Dec 22, 2016 - Improved precision of moonrise/moonset calculations. diff --git a/package.json b/package.json index ef696eaf..8eea3257 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "suncalc", - "version": "1.8.0", + "version": "1.9.0", "description": "A tiny JavaScript library for calculating sun/moon positions and phases.", "homepage": "https://github.com/mourner/suncalc", "keywords": [ @@ -12,7 +12,8 @@ "sunset", "twilight", "moon", - "illumination" + "illumination", + "solar" ], "author": "Vladimir Agafonkin", "repository": { diff --git a/suncalc.js b/suncalc.js index c9ca56d2..a3929948 100644 --- a/suncalc.js +++ b/suncalc.js @@ -308,6 +308,24 @@ SunCalc.getMoonTimes = function (date, lat, lng, inUTC) { return result; }; +// calculation for solar time based on https://www.pveducation.org/pvcdrom/properties-of-sunlight/solar-time + +SunCalc.getSolarTime = function (date, utcOffset, lng) { + // calculate the day of year + var start = new Date(date.getFullYear(), 0, 0); + var diff = (date - start) + ((start.getTimezoneOffset() - date.getTimezoneOffset()) * 60 * 1000); + var dayOfYear = Math.floor(diff / dayMs); + + var b = 360 / 365 * (dayOfYear - 81) * rad; + var equationOfTime = 9.87 * sin(2 * b) - 7.53 * cos(b) - 1.5 * sin(b); + var localSolarTimeMeridian = 15 * utcOffset; + var timeCorrection = equationOfTime + 4 * (lng - localSolarTimeMeridian); + var localSolarTime = date.getHours() + timeCorrection / 60 + date.getMinutes() / 60; + + var solarDate = new Date(0, 0); + solarDate.setMinutes(+localSolarTime * 60); + return solarDate; +}; // export as Node module / AMD module / browser variable if (typeof exports === 'object' && typeof module !== 'undefined') module.exports = SunCalc;