Перейти к содержимому

Golden Hour Calculator

Найдите окна золотого часа и синего часа для фотографии на основе вашего местоположения и даты.

Об этом инструменте

Золотой час — это короткий промежуток сразу после восхода и перед закатом, когда солнце стоит низко и заливает всё мягким тёплым светом, тогда как синий час — это более глубокие сумерки перед восходом и после заката, наполняющие небо ровными холодными синими тонами. Оба периода ценятся фотографами, потому что дают выигрышные, атмосферные снимки, которых жёсткий полуденный свет попросту не способен повторить. Этот калькулятор использует астрономические формулы, чтобы точно определить, когда открываются и закрываются эти окна для любой даты и любого места.

Чтобы воспользоваться им, введите вашу дату и местоположение, и инструмент покажет время начала и окончания золотого и синего часа вокруг восхода и заката. Он создан для фотографов, видеографов и путешественников, которые хотят спланировать съёмку с точностью до минуты и приехать, пока свет ещё идеален.

Учтите, что это время заметно смещается в зависимости от сезона и вашей широты, поэтому всегда сверяйтесь со значениями именно для вашей даты, а не полагайтесь на приблизительную оценку. Все вычисления выполняются локально в вашем браузере, поэтому никакие данные о местоположении никогда не покидают ваше устройство.

Часто задаваемые вопросы

Реализация кода

import math
from datetime import datetime, timedelta, timezone

def sun_times(lat: float, lon: float, date: datetime) -> dict:
    """Calculate sunrise, sunset and golden hour times."""
    # Day of year
    N = date.timetuple().tm_yday

    # Mean longitude and anomaly
    L = (280.460 + 0.9856474 * N) % 360
    g = math.radians((357.528 + 0.9856003 * N) % 360)

    # Ecliptic longitude
    lam = math.radians(L + 1.915 * math.sin(g) + 0.020 * math.sin(2 * g))

    # Declination
    decl = math.asin(math.sin(math.radians(23.439)) * math.sin(lam))

    # Hour angle for sunrise/sunset (sun altitude = -0.833°)
    cos_ha = (math.sin(math.radians(-0.833)) - math.sin(math.radians(lat)) * math.sin(decl)) /              (math.cos(math.radians(lat)) * math.cos(decl))

    if abs(cos_ha) > 1:
        return {"error": "Midnight sun or polar night"}

    ha = math.degrees(math.acos(cos_ha))

    # Equation of time correction (simplified)
    B = math.radians(360 / 365 * (N - 81))
    eot = 9.87 * math.sin(2 * B) - 7.53 * math.cos(B) - 1.5 * math.sin(B)

    # Solar noon in minutes from midnight UTC
    solar_noon = 720 - 4 * lon - eot

    sunrise_min = solar_noon - 4 * ha
    sunset_min  = solar_noon + 4 * ha

    # Golden hour bounds: sun at 6° above horizon
    cos_gh = (math.sin(math.radians(6)) - math.sin(math.radians(lat)) * math.sin(decl)) /              (math.cos(math.radians(lat)) * math.cos(decl))
    gh_ha = math.degrees(math.acos(max(-1, min(1, cos_gh))))

    golden_end_morn = solar_noon - 4 * gh_ha
    golden_start_eve = solar_noon + 4 * gh_ha

    def mins_to_str(m):
        h, mn = divmod(int(m), 60)
        return f"{h:02d}:{mn:02d}"

    return {
        "sunrise": mins_to_str(sunrise_min),
        "golden_hour_morning_end": mins_to_str(golden_end_morn),
        "solar_noon": mins_to_str(solar_noon),
        "golden_hour_evening_start": mins_to_str(golden_start_eve),
        "sunset": mins_to_str(sunset_min),
    }

# New York City
result = sun_times(40.7128, -74.0060, datetime(2024, 6, 21))
for k, v in result.items():
    print(f"{k}: {v}")

Comments & Feedback

Comments are powered by Giscus. Sign in with GitHub to leave a comment.