Javascript or Python - How do I figure out if it's night or day?

前端 未结 3 743
感情败类
感情败类 2021-02-05 05:54

any idea how I figure out if it\'s currently night/day or sunrise/dawn based on time and location of the user?

I haven\'t found anything useful that I c

3条回答
  •  北荒
    北荒 (楼主)
    2021-02-05 06:46

    You can do as I did and use this public domain Sun.py module to compute the position of the sun relative to positions on the Earth. It's pretty old, but has worked well for me for many years. I made a few superficial modifications to it to be more up-to-date with Python 2.7, such as making the few classes in it new-style, but for the most part it's unchanged.

    Here's one module I created, called sunriseset.py, which shows how to use it to calculate the sunrise and sunset times for a specific location given its geographic coordinates and timezone. The referenced timezone module is an implementation of the tzinfo abstract base class described in the datetime module's documentation on tzinfoobjects.

    # -*- coding: iso-8859-1 -*-
    import datetime
    import timezone  # concrete tzinfo subclass based on the Python docs
    import math
    from Sun import Sun
    
    __all__ = ['getsuninfo', 'Place']
    
    class Place(object):
        def __init__(self, name, coords, tz=timezone.Pacific):
            self.name = name        # string
            self.coords = coords    # tuple (E/W long, N/S lat)
            self.tz = tz            # tzinfo constant
    
    def _hoursmins(hours):
        """Convert floating point decimal time in hours to integer hrs,mins"""
        frac,h = math.modf(hours)
        m = round(frac*60, 0)
        if m == 60: # rounded up to next hour
            h += 1; m = 0
        return int(h),int(m)
    
    def _ymd(date):
        """Return y,m,d from datetime object as tuple"""
        return date.timetuple()[:3]
    
    def getsuninfo(location, date=None):
        """Return local datetime of sunrise, sunset, and length of day in hrs,mins)"""
        if date == None:
            querydate = datetime.date.today()
        else: # date given should be datetime instance
            querydate = date
    
        args = _ymd(querydate) + location.coords
        utcrise, utcset = Sun().sunRiseSet(*args)
        daylength = Sun().dayLength(*args)
        hrs,mins = _hoursmins(daylength)
    
        risehour, risemin = _hoursmins(utcrise)
        sethour, setmin   = _hoursmins(utcset)
    
        # convert times to timedelta values (ie from midnight utc of the date)
        midnight = datetime.datetime(tzinfo=timezone.utc, *_ymd(querydate))
        deltarise = datetime.timedelta(hours=risehour, minutes=risemin)
        utcdatetimerise = midnight+deltarise
        deltaset = datetime.timedelta(hours=sethour, minutes=setmin)
        utcdatetimeset  = midnight+deltaset
    
        # convert results from UTC time to local time of location
        localrise = utcdatetimerise.astimezone(location.tz)
        localset  = utcdatetimeset.astimezone(location.tz)
    
        return localrise, localset, hrs, mins
    
    if __name__ == "__main__":
        import datetime, timezone
    
        def unittest(location, testdate):
            risetime, settime, hrs, mins = getsuninfo(location, testdate)
    
            print "Location:", location.name
            print "Date:", testdate.strftime("%a %x")
            print risetime.strftime("Sunrise %I:%M %p"), settime.strftime("- Sunset %I:%M %p (%Z)")
            print "daylight: %d:%02d" % (hrs,mins)
            print
    
        place = Place("My House", (-121.990278, 47.204444), timezone.Pacific)
    
        # test dates just before and after DST transitions
        print "pre 2007"
        print "========="
        unittest(place, datetime.date(2006, 4, 1))
        unittest(place, datetime.date(2006, 4, 2))
        unittest(place, datetime.date(2006, 10, 28))
        unittest(place, datetime.date(2006, 10, 29))
    
        print "2007"
        print "========="
        unittest(place, datetime.date(2007, 3, 10))
        unittest(place, datetime.date(2007, 3, 11))
        unittest(place, datetime.date(2007, 11, 3))
        unittest(place, datetime.date(2007, 11, 4))
    

提交回复
热议问题