Javascript 或 Python - 我如何判断是白天还是黑夜?

标签 javascript python geolocation timezone

知道如何根据用户的时间和位置确定当前是夜晚/白天还是日出/黎明?

我没有发现任何可以在客户端或后端使用的有用的东西。

棘手的是,小时不一定定义是白天还是黑夜,这在很大程度上取决于年、月、日、小时和地理坐标。


为了澄清......模仿这样的东西。

enter image description here


一种近似此值的方法也非常有用。


希望有人能帮忙!

最佳答案

Python 3 用户注意事项:我刚刚使用 Python 3.8.6 尝试了以下代码,它也适用于该版本。我必须将 print 语句转换为 print() 函数调用,但仅此而已。

我注意到 tzinfo 类的示例实现与 Python 2 文档中的不同,但使用 tzinfo_example.py 中的示例 tzinfolatest documentation 中引用的文件工作得很好(但旧的 2.x 版本也是如此)。

您可以从 here 下载下面显示的 sunriseset.py 文件的 Python 3 版本.


你可以像我一样使用这个公共(public)领域 Sun.py模块来计算太阳相对于地球位置的位置。 (警告:它包含制表符,并假定制表符每 8 个字符。)它已经很老了,但多年来一直对我很好。我对其进行了一些表面上的修改以使其与 Python 2.7 保持同步,例如将其中的几个类设为新样式,但大部分都没有改变。

这是我创建的一个模块,名为 sunriseset.py,它展示了如何使用它来计算给定地理坐标和时区的特定位置的日出和日落时间。引用的 timezone 模块是 tzinfo 的实现。 tzinfoobjects 上的 datetime 模块文档中描述的抽象基类.

# -*- 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))

关于Javascript 或 Python - 我如何判断是白天还是黑夜?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15044521/

相关文章:

python - 如何用树木的森林来标记特征的重要性?

geolocation - 有没有免费的地理数据库?

iOS 强制地理定位以特定语言返回城市名称

javascript - 将下拉菜单放置在文本框或文本区域内

javascript - 如何使用原型(prototype)进行自定义方法和对象操作

javascript - 如何判断指定路径上没有图片

python - 从 XLIFF 文件中提取数据并创建数据框

Python:如果两列没有出现在另一个 pandas 列中,如何删除 Pandas 中的行?

javascript - 表单验证练习

android - 如果我想通过 Wi-Fi 在我的 Android 应用程序中进行地理定位,是否需要使用像 Skyhook 这样的服务?