npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

solar-data

v1.5.0

Published

solar data calculations

Readme

solar-data

this library exposes methods to calculate the following time stamps (moment object) for a given date and location

  • dawn (local and utc)
  • sunrise (local and utc)
  • solar noon (local and utc)
  • sunset (local and utc)
  • dusk (local and utc)
  • solar midnight (local and utc) as well as the sun hour angle (Integer) for a given date and location at
  • current time
  • dawn
  • sunrise
  • solar noon
  • sunset
  • dusk
  • solar midnight

use solar-data

moment-timezone is a dependency, import both into your project

import moment from "moment-timezone";
import * as solar from "solar-data";

methods

solarData

params:

  • date (a UTC date moment object)
  • latitude (integer)
  • longitude (integer)
  • timezone (string, must be in the format of a TZ database name)

returns:

  • result is an object containing solar data
    • parameters are written to the object
      • result.date
      • result.latitude
      • result.longitude
      • result.timezone
    • sun event dates in local and utc time
      • result.dawnLocal
      • result.sunriseLocal
      • result.solarnoonLocal
      • result.sunsetLocal
      • result.duskLocal
      • result.solarmidnightLocal
      • result.dawnUTC
      • result.sunriseUTC
      • result.solarnoonUTC
      • result.sunsetUTC
      • result.duskUTC
      • result.solarmidnightUTC
    • sun hour angle currently and at sun event dates
      • result.hraNow
      • result.hraDawn
      • result.hraSunrise
      • result.hraSolarNoon
      • result.hraSunset
      • result.hraDusk
      • result.hraSolarMidnight

example

making the solardata object

let date = moment.utc(); // current datetime in UTC

let latitude = 41.85003;
let longitude = -87.65005; // lat/long for Chicago, IL

let timezone = "America/Chicago"; // timezone for Chicago, IL

let sd = solar.solarData(date, latitude, longitude, timezone); // create the object containing solardata

get solar event dates (dawn, sunset, etc.)

let sunrise = sd.sunriseLocal; //get sunrise timestamp in local time (Chicago), this is a moment object and can formatted accordingly

console.log(sunrise.format()); // => 2022-08-10T05:41:00-05:00
console.log(sunrise.format("HH:mm")); // => 05:41
console.log(sunrise.format("dddd, MMMM Do YYYY, hh:mm a")) // => Wednesday, August 10th 2022, 05:41 am

get sun hour angle

  • this indicates the position of the sun in the sky on a scale of -180 to 180, corrected for earth tilt:
    • at lat: 0, long: 0, timezone: 'Etc/UCT' sunrise is -90, 0 is solar noon, 90 is sunset and 180/-180 is solar midnight
    • at other locations, these numbers are corrected for earth tilt
//Chicago

console.log(sd.hraSunrise) // => -92.25
console.log(sd.hraSolarNoon) // => 16.5
console.log(sd.hraSunset) // => 119.5
console.log(sd.hraSolarMidnight) // => -163.5

console.log(sd.hraNow) // => -74.25 => it is after sunrise but before noon


//Tokyo
console.log(sd.hraSunrise) // => -109
console.log(sd.hraSolarNoon) // => -3.25
console.log(sd.Sunset) // => 96.5
console.log(sd.hraSolarMidnight) // => 176.75

console.log(sd.hraNow) // => 146 => it is after sunset but before solar midnight

hra

params:

  • date (a UTC date moment object)
  • longitude (integer)
  • timezone (string, must be in the format of a TZ database name)

returns:

  • integer of the solar hour angle at the passed date and location

example

let date = moment.utc('2001-1-1 00:00'); // Jan 1st 2001
let longitude = -0.12574; // longitude of London, UK
let timezone = 'Europe/London';

console.log(solar.hra(date, longitude, timezone)) // => 179.75 

getPoint

params:

  • angle (integer) - the sun hour angle from solarData or hra
  • radius (integer) - the radius of the circle representing the sunpath
  • centerX (integer) - the x coordinate of the center of the circle
  • centerY (integer) - the y coordinate of the center of the circle

returns:

  • object with the x and y coordinates of the given sun angle in a canvas

this can be used to translate sun angles and display sun location(s), sun path, sunrise/set horizon on a canvas

example

given a canvas with 500px width & height, we can represent the sun's position for a given location on a circle.

The center of the cirlce is the point of view of the observer.

On the X axis, 0 represents West and 500 represents East. The sun moves east to west, left to right on the screen. The Y axis represents the height of the sun from the observers perspective. The smaller the number, the higher the sun.

//Chicago
let sd = solar.solarData(date, latitude, longitude, timezone); // create the object containing solardata

let centerX = 250;
let centerY = 250; // placing the circle in the center of the 500px square canvas


let radius = 150; // => the width & height of the circle representing the sun path will 300px and fit inside the 500px square canvas

let sunCoords = solar.getPoint(sd.hraNow, radius, centerX, centerY); // coordinates of the sun now 

let riseCoords = solar.getPoint(sd.hraSunrise, radius, centerX, centerY); // sunrise coordinates
let solarnoonCoords = solar.getPoint(sd.hraSolarNoon, radius, centerX, centerY); // noon coordinates
let setCoords = solar.getPoint(sd.hraSunset, radius, centerX, centerY); // sunset coordinates

console.log('X: '+riseCoords.x+' Y: '+riseCoords.y) // => X: 399.8843554361084 Y: 255.8889723638603
console.log('X: '+solarnoonCoords.x+' Y: '+solarnoonCoords.y) // => X: 207.39769829441167 Y: 106.17703976977103
console.log('X: '+setCoords.x+' Y: '+setCoords.y) // => X: 119.44664560901504 Y: 323.86353401552003

Between sunrise and sunset, the sun moves from east to west on the X axis (399 > 207 > 119). It also rises and falls on the Y axis (255 > 106 > 323).

To render the path of the sun, you can create a start and end datetime, iterate over moments in between and create a point for each:

let sunpath = [];

let dStart = moment.utc(moment.utc().year(), moment.utc().month(), moment.utc().date(), 0, 0]); // sunpath starts at midnight
let dEnd = dStart.clone().add(1, 'days'); // sun path end date is 24 hrs from start date

while (dStart < dEnd){
    sunpath.push(solar.getPoint(solar.hra(dStart,longitude, timezone), radius, centerX, centerY));
    dStart.add(1, 'minutes');
}

You can also render a "horizon" (the line between sunrise, the observer, and sunset) by creating a point for each:

let sd = solar.solarData(date, latitude, longitude, timezone); // create the object containing solardata

let riseCoords = solar.getPoint(sd.hraSunrise, radius, centerX, centerY); // point for sunrise
let observerCoords = {x : centerX, y : centerY};
let setCoords = solar.getPoint(sd.hraSunset, radius, centerX, centerY); // point for sunset

sunposition