Local solar time function from UTC and longitude

后端 未结 5 1787
被撕碎了的回忆
被撕碎了的回忆 2020-12-16 17:50

I\'m wondering if there is a python function/module that calculates the local time after midnight (or local solar time) given the UTC time and longitude? It doesn\'t need to

5条回答
  •  余生分开走
    2020-12-16 18:26

    Using ephem's sidereal_time() method:

    import ephem # pip install pyephem (on Python 2)
                 # pip install ephem   (on Python 3)
    
    def solartime(observer, sun=ephem.Sun()):
        sun.compute(observer)
        # sidereal time == ra (right ascension) is the highest point (noon)
        hour_angle = observer.sidereal_time() - sun.ra
        return ephem.hours(hour_angle + ephem.hours('12:00')).norm  # norm for 24h
    

    Note: ephem.hours is a float number that represents an angle in radians and converts to/from a string as "hh:mm:ss.ff".

    For comparison, here's the "utc + longitude" formula:

    import math
    from datetime import timedelta
    
    def ul_time(observer):
        utc_dt = observer.date.datetime()
        longitude = observer.long
        return utc_dt + timedelta(hours=longitude / math.pi * 12)
    

    Example

    from datetime import datetime
    
    # "solar time" for some other cities
    for name in ['Los Angeles', 'New York', 'London',
                 'Paris', 'Moscow', 'Beijing', 'Tokyo']:
        city = ephem.city(name)
        print("%-11s %11s %s" % (name, solartime(city),
                                 ul_time(city).strftime('%T')))
    
    # set date, longitude manually
    o = ephem.Observer()
    o.date = datetime(2012, 4, 15, 1, 0, 2) # some utc time
    o.long = '00:00:00.0' # longitude (you could also use a float (radians) here)
    print("%s %s" % (solartime(o), ul_time(o).strftime('%T')))
    

    Output

    Los Angeles 14:59:34.11 14:44:30
    New York    17:56:31.27 17:41:27
    London      22:52:02.04 22:36:58
    Paris       23:01:56.56 22:46:53
    Moscow       1:23:00.33 01:07:57
    Beijing      6:38:09.53 06:23:06
    Tokyo        8:11:17.81 07:56:15
    1:00:00.10 01:00:01
    

提交回复
热议问题