Skip to content
This repository has been archived by the owner on Apr 19, 2023. It is now read-only.

sunrise for lat/lon in UTC+8 erroneosuly set to 00:00:00 UTC (should be on previous day) #4

Open
seankhl opened this issue Sep 1, 2021 · 1 comment

Comments

@seankhl
Copy link

seankhl commented Sep 1, 2021

Couldn't think of a title to accurately sum up the issue, but the problem here is that in UTC+8, when running the sample program with a UTC offset of 0, I get

Sunrise: 00:00:00
Sunset: 11:08:43

But this is wrong, the sunrise should be on the previous day actually in UTC, as when I set the timzeone offset to 8, I get

Sunrise: 07:00:40
Sunset: 19:08:43

and this is confirmed to be correct by other sources.

I'm using a program that uses your library, which does all its calculations in UTC, and therefore, my sunrise times are always wrong.

I took a quick look at the code but it's a bit much to process, and I decided to open an issue instead of just tackling it myself in case the solution was easy for you.

@xrstf
Copy link

xrstf commented Sep 19, 2021

I hit the same or a similar issue. My UTC offset is +2 and the sunrise/set times calculated by the library are one day behind what other sources say for my location (Hamburg, Germany). This is my test program:

package main

import (
	"fmt"
	"log"
	"time"

	"github.com/kelvins/sunrisesunset"
)

const (
	Location  = "Europe/Berlin"
	Latitude  = 53.536268
	Longitude = 9.992086
	// StartDate = "2018-01-01"
	StartDate = "2021-09-18"
	// EndDate   = "2099-12-31"
	EndDate = "2021-09-30"
)

func main() {
	loc, err := time.LoadLocation(Location)
	if err != nil {
		log.Fatalf("Failed to load location %q: %v", Location, err)
	}

	start, err := time.ParseInLocation("2006-01-02", StartDate, loc)
	if err != nil {
		log.Fatalf("Failed to parse start date %q: %v", StartDate, err)
	}

	end, err := time.ParseInLocation("2006-01-02", EndDate, loc)
	if err != nil {
		log.Fatalf("Failed to parse end date %q: %v", EndDate, err)
	}

	for t := start; !t.After(end); t = t.AddDate(0, 0, 1) {
		_, offset := t.Zone()
		sunrise, sunset, err := sunrisesunset.GetSunriseSunset(Latitude, Longitude, float64(offset)/3600.0, t)

		// If no error has occurred, print the results
		if err == nil {
			fmt.Printf("Sunrise @ %s: %s\n", t.Format("2006-01-02"), sunrise.Format("15:04:05")) // Sunrise: 06:11:44
			fmt.Printf("Sunset @ %s : %s\n", t.Format("2006-01-02"), sunset.Format("15:04:05"))  // Sunset: 18:14:27
		} else {
			fmt.Println(err)
		}
	}
}

which outputs

Sunrise @ 2021-09-18: 06:57:11
Sunset @ 2021-09-18 : 19:30:39
Sunrise @ 2021-09-19: 06:58:56
Sunset @ 2021-09-19 : 19:28:12
Sunrise @ 2021-09-20: 07:00:40 <-- example this should be the sunrise time of 2019-09-19 (Sunday)
Sunset @ 2021-09-20 : 19:25:45
Sunrise @ 2021-09-21: 07:02:26
Sunset @ 2021-09-21 : 19:23:17
Sunrise @ 2021-09-22: 07:04:11
Sunset @ 2021-09-22 : 19:20:50
Sunrise @ 2021-09-23: 07:05:56
Sunset @ 2021-09-23 : 19:18:23
Sunrise @ 2021-09-24: 07:07:41
Sunset @ 2021-09-24 : 19:15:56
Sunrise @ 2021-09-25: 07:09:27
Sunset @ 2021-09-25 : 19:13:28
Sunrise @ 2021-09-26: 07:11:13
Sunset @ 2021-09-26 : 19:11:01
Sunrise @ 2021-09-27: 07:12:59
Sunset @ 2021-09-27 : 19:08:35
Sunrise @ 2021-09-28: 07:14:45
Sunset @ 2021-09-28 : 19:06:08
Sunrise @ 2021-09-29: 07:16:32
Sunset @ 2021-09-29 : 19:03:41
Sunrise @ 2021-09-30: 07:18:18
Sunset @ 2021-09-30 : 19:01:15

I will simply add a day in my calculations to "fix" this, as in my case I don't need to worry about the location or UTC offset changing too much.

Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants