{"id":1633,"date":"2023-03-21T15:57:42","date_gmt":"2023-03-21T12:57:42","guid":{"rendered":"http:\/\/torsunov.ivan-tyurin.ru\/?page_id=1633"},"modified":"2026-08-26T18:45:14","modified_gmt":"2026-08-26T15:45:14","slug":"raschyot-vremeni-voshoda","status":"publish","type":"page","link":"https:\/\/torsunov.ru\/en\/raschyot-vremeni-voshoda\/","title":{"rendered":"Sunrise calculation"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"1633\" class=\"elementor elementor-1633\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-61e2d30 e-flex e-con-boxed e-con e-parent\" data-id=\"61e2d30\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-70c4c48 elementor-widget elementor-widget-html\" data-id=\"70c4c48\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!--\n\u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0434\u043b\u044f torsunov.ru\n\u041c\u043e\u0436\u043d\u043e \u0432\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0446\u0435\u043b\u0438\u043a\u043e\u043c \u0432 HTML-\u0432\u0438\u0434\u0436\u0435\u0442 Elementor \/ HTML-\u0431\u043b\u043e\u043a WordPress.\n\n\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0438:\n1) \u041f\u043e\u0438\u0441\u043a \u0433\u043e\u0440\u043e\u0434\u0430\/\u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442: Open-Meteo Geocoding API\n2) \u0410\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435: Sunrise-Sunset.org API v2\n\n\u0412\u0430\u0436\u043d\u043e:\n- API Sunrise-Sunset.org \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0432\u0438\u0434\u0438\u043c\u0443\u044e \u0430\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u044e \u2014 \u043e\u043d\u0430 \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0438\u0436\u0435.\n- Open-Meteo \u0442\u0430\u043a\u0436\u0435 \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0430\u0442\u0440\u0438\u0431\u0443\u0446\u0438\u044e \u2014 \u043e\u043d\u0430 \u0443\u0436\u0435 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0430 \u043d\u0438\u0436\u0435.\n-->\n\n<div id=\"torsunov-solar-calculator\" class=\"tsc\">\n  <div class=\"tsc__header\">\n    <p class=\"tsc__lead\">\n      \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\n      \u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0441\u0445\u043e\u0434\u0430, \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0434\u043d\u044f \u0438 \u0437\u0430\u043a\u0430\u0442\u0430\n      \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u0430\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0434\u043d\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f.\n    <\/p>\n  <\/div>\n\n  <div class=\"tsc__panel\">\n    <div class=\"tsc__grid tsc__grid--location\">\n      <div class=\"tsc__field tsc__field--city\">\n        <label for=\"tsc-city\">\u0413\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442<\/label>\n        <div class=\"tsc__autocomplete\">\n          <input\n            id=\"tsc-city\"\n            type=\"text\"\n            autocomplete=\"off\"\n            placeholder=\"\u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440: \u041c\u043e\u0441\u043a\u0432\u0430, \u041f\u0438\u043b\u044c\u043d\u0430, \u0411\u0435\u0440\u043b\u0438\u043d\"\n            aria-autocomplete=\"list\"\n            aria-controls=\"tsc-city-results\"\n          >\n          <div id=\"tsc-city-results\" class=\"tsc__suggestions\" role=\"listbox\" hidden><\/div>\n        <\/div>\n      <\/div>\n\n      <div class=\"tsc__field\">\n        <label for=\"tsc-date\">\u0414\u0430\u0442\u0430<\/label>\n        <input id=\"tsc-date\" type=\"date\">\n      <\/div>\n    <\/div>\n\n    <div class=\"tsc__actions\">\n      <button id=\"tsc-geolocate\" class=\"tsc__button tsc__button--secondary\" type=\"button\">\n        <span aria-hidden=\"true\">\u2316<\/span>\n        \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435\n      <\/button>\n      <button id=\"tsc-calculate\" class=\"tsc__button tsc__button--primary\" type=\"button\">\n        \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c\n      <\/button>\n    <\/div>\n\n    <div id=\"tsc-selected\" class=\"tsc__selected\" hidden><\/div>\n    <div id=\"tsc-status\" class=\"tsc__status\" role=\"status\" aria-live=\"polite\"><\/div>\n  <\/div>\n\n  <section id=\"tsc-results\" class=\"tsc__results\" hidden>\n    <div class=\"tsc__section-head\">\n      <div>\n        <div class=\"tsc__eyebrow\">\u0410\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435<\/div>\n        <h3>\u0421\u043e\u043b\u043d\u0446\u0435 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438<\/h3>\n      <\/div>\n      <div id=\"tsc-timezone\" class=\"tsc__timezone\"><\/div>\n    <\/div>\n\n    <div class=\"tsc__sun-grid\">\n      <div class=\"tsc__sun-card\">\n        <div class=\"tsc__sun-label\">\u0412\u043e\u0441\u0445\u043e\u0434<\/div>\n        <div id=\"tsc-sunrise\" class=\"tsc__sun-time\">\u2014<\/div>\n      <\/div>\n\n      <div class=\"tsc__sun-card tsc__sun-card--accent\">\n        <div class=\"tsc__sun-label\">\u0418\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c<\/div>\n        <div id=\"tsc-noon\" class=\"tsc__sun-time\">\u2014<\/div>\n        <div class=\"tsc__sun-note\">\u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0421\u043e\u043b\u043d\u0446\u0430 \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c<\/div>\n      <\/div>\n\n      <div class=\"tsc__sun-card\">\n        <div class=\"tsc__sun-label\">\u0417\u0430\u043a\u0430\u0442<\/div>\n        <div id=\"tsc-sunset\" class=\"tsc__sun-time\">\u2014<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"tsc__offset\">\n      <span>\u0421\u043c\u0435\u0449\u0435\u043d\u0438\u0435 \u043e\u0442\u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e 12:00 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/span>\n      <strong id=\"tsc-offset\">\u2014<\/strong>\n    <\/div>\n\n    <div class=\"tsc__section-head tsc__section-head--regime\">\n      <div>\n        <div class=\"tsc__eyebrow\">\u0420\u0435\u0436\u0438\u043c \u0434\u043d\u044f<\/div>\n        <h3>\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f<\/h3>\n      <\/div>\n    <\/div>\n\n    <div class=\"tsc__regime\">\n      <div class=\"tsc__regime-row\">\n        <div>\n          <strong>\u041f\u043e\u0434\u044a\u0451\u043c<\/strong>\n          <span>\u0434\u043e 06:00 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/span>\n        <\/div>\n        <div id=\"tsc-rise-time\" class=\"tsc__regime-time\">\u2014<\/div>\n      <\/div>\n\n      <div class=\"tsc__regime-row\">\n        <div>\n          <strong>\u041e\u0431\u0435\u0434<\/strong>\n          <span>12:00 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/span>\n        <\/div>\n        <div id=\"tsc-lunch-time\" class=\"tsc__regime-time\">\u2014<\/div>\n      <\/div>\n\n      <div class=\"tsc__regime-row\">\n        <div>\n          <strong>\u0423\u0436\u0438\u043d<\/strong>\n          <span>18:00 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/span>\n        <\/div>\n        <div id=\"tsc-dinner-time\" class=\"tsc__regime-time\">\u2014<\/div>\n      <\/div>\n\n      <div class=\"tsc__regime-row\">\n        <div>\n          <strong>\u041e\u0442\u0431\u043e\u0439<\/strong>\n          <span>21:00 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438<\/span>\n        <\/div>\n        <div id=\"tsc-sleep-time\" class=\"tsc__regime-time\">\u2014<\/div>\n      <\/div>\n    <\/div>\n\n    <div class=\"tsc__converter\">\n      <div>\n        <div class=\"tsc__eyebrow\">\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440<\/div>\n        <h3>\u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435<\/h3>\n        <p>\n          \u0415\u0441\u043b\u0438 \u0432\u0430\u043c \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u043e\u0432\u0430\u043d\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f,\n          \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0435\u0433\u043e \u0437\u0434\u0435\u0441\u044c.\n        <\/p>\n      <\/div>\n\n      <div class=\"tsc__converter-controls\">\n        <div class=\"tsc__field\">\n          <label for=\"tsc-custom-solar\">\u0421\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f<\/label>\n          <input id=\"tsc-custom-solar\" type=\"time\" value=\"05:25\">\n        <\/div>\n        <div class=\"tsc__convert-arrow\" aria-hidden=\"true\">\u2192<\/div>\n        <div class=\"tsc__field\">\n          <label>\u041c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f<\/label>\n          <div id=\"tsc-custom-local\" class=\"tsc__result-input\">\u2014<\/div>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <div id=\"tsc-polar-warning\" class=\"tsc__warning\" hidden><\/div>\n  <\/section>\n\n  <details class=\"tsc__manual\">\n    <summary>\u0412\u0432\u0435\u0441\u0442\u0438 \u0434\u0430\u043d\u043d\u044b\u0435 \u0432\u0440\u0443\u0447\u043d\u0443\u044e<\/summary>\n    <div class=\"tsc__manual-body\">\n      <p>\n        \u0420\u0443\u0447\u043d\u043e\u0439 \u0440\u0435\u0436\u0438\u043c \u043d\u0443\u0436\u0435\u043d, \u0435\u0441\u043b\u0438 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u0440\u0443\u0433\u043e\u0433\u043e \u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\n        \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430. \u041d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u0442\u043e\u0447\u043d\u044b\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u2014 \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c.\n        \u0415\u0441\u043b\u0438 \u043e\u043d \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u0435\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u0438\u0431\u043b\u0438\u0437\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043a\u0430\u043a \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0443 \u043c\u0435\u0436\u0434\u0443\n        \u0432\u043e\u0441\u0445\u043e\u0434\u043e\u043c \u0438 \u0437\u0430\u043a\u0430\u0442\u043e\u043c.\n      <\/p>\n\n      <div class=\"tsc__grid tsc__grid--manual\">\n        <div class=\"tsc__field\">\n          <label for=\"tsc-manual-rise\">\u0412\u043e\u0441\u0445\u043e\u0434<\/label>\n          <input id=\"tsc-manual-rise\" type=\"time\" value=\"06:15\">\n        <\/div>\n\n        <div class=\"tsc__field\">\n          <label for=\"tsc-manual-noon\">\u0421\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c<\/label>\n          <input id=\"tsc-manual-noon\" type=\"time\" value=\"13:30\">\n        <\/div>\n\n        <div class=\"tsc__field\">\n          <label for=\"tsc-manual-set\">\u0417\u0430\u043a\u0430\u0442<\/label>\n          <input id=\"tsc-manual-set\" type=\"time\" value=\"20:45\">\n        <\/div>\n      <\/div>\n\n      <div class=\"tsc__actions tsc__actions--manual\">\n        <button id=\"tsc-midpoint\" class=\"tsc__button tsc__button--secondary\" type=\"button\">\n          \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u043f\u043e\u043b\u0434\u0435\u043d\u044c \u043f\u043e \u0432\u043e\u0441\u0445\u043e\u0434\u0443 \u0438 \u0437\u0430\u043a\u0430\u0442\u0443\n        <\/button>\n        <button id=\"tsc-apply-manual\" class=\"tsc__button tsc__button--primary\" type=\"button\">\n          \u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0443\u0447\u043d\u044b\u0435 \u0434\u0430\u043d\u043d\u044b\u0435\n        <\/button>\n      <\/div>\n\n      <div class=\"tsc__manual-note\">\n        \u0421\u0435\u0440\u0435\u0434\u0438\u043d\u0430 \u043c\u0435\u0436\u0434\u0443 \u0432\u043e\u0441\u0445\u043e\u0434\u043e\u043c \u0438 \u0437\u0430\u043a\u0430\u0442\u043e\u043c \u2014 \u043f\u0440\u0438\u0431\u043b\u0438\u0436\u0435\u043d\u0438\u0435. \u0414\u043b\u044f \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e\n        \u0440\u0430\u0441\u0447\u0451\u0442\u0430 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043d\u0435\u043f\u043e\u0441\u0440\u0435\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u043e \u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0439 solar noon.\n      <\/div>\n    <\/div>\n  <\/details>\n\n  <div class=\"tsc__method\">\n    <strong>\u041a\u0430\u043a \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u0447\u0451\u0442<\/strong>\n    <p>\n      \u0417\u0430 12:00 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u0440\u0438\u043d\u0438\u043c\u0430\u0435\u0442\u0441\u044f \u0438\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c \u0434\u043b\u044f\n      \u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u044b\u0445 \u043a\u043e\u043e\u0440\u0434\u0438\u043d\u0430\u0442 \u0438 \u0434\u0430\u0442\u044b. \u0417\u0430\u0442\u0435\u043c \u043a \u043c\u0435\u0441\u0442\u043d\u043e\u043c\u0443 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043f\u043e\u043b\u0443\u0434\u043d\u044f \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0435\u0442\u0441\u044f\n      \u0440\u0430\u0437\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 \u0442\u0440\u0435\u0431\u0443\u0435\u043c\u044b\u043c \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u043c \u0432\u0440\u0435\u043c\u0435\u043d\u0435\u043c \u0438 12:00.\n    <\/p>\n    <code>\u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f = \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c + (\u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u2212 12:00)<\/code>\n  <\/div>\n\n  \n<\/div>\n\n<style>\n  #torsunov-solar-calculator.tsc {\n    --tsc-accent: #21c8ca;\n    --tsc-accent-dark: #159a9c;\n    --tsc-accent-soft: #e9fbfb;\n    --tsc-text: #262626;\n    --tsc-muted: #6f746d;\n    --tsc-border: #e3e6df;\n    --tsc-bg: #ffffff;\n    --tsc-panel: #fafbf8;\n    --tsc-warning: #fff8e7;\n    --tsc-warning-border: #ecd28b;\n\n    width: 100%;\n    max-width: 920px;\n    margin: 0 auto;\n    color: var(--tsc-text);\n    font-family: inherit;\n    line-height: 1.5;\n  }\n\n  #torsunov-solar-calculator *,\n  #torsunov-solar-calculator *::before,\n  #torsunov-solar-calculator *::after {\n    box-sizing: border-box;\n  }\n\n  #torsunov-solar-calculator .tsc__header {\n    margin-bottom: 22px;\n  }\n\n  #torsunov-solar-calculator .tsc__eyebrow {\n    margin-bottom: 5px;\n    color: var(--tsc-accent-dark);\n    font-size: 12px;\n    font-weight: 700;\n    letter-spacing: .08em;\n    text-transform: uppercase;\n  }\n\n  #torsunov-solar-calculator .tsc__title {\n    margin: 0 0 10px;\n    font-size: clamp(26px, 4vw, 38px);\n    line-height: 1.15;\n  }\n\n  #torsunov-solar-calculator h3 {\n    margin: 0;\n    font-size: clamp(19px, 2.6vw, 25px);\n    line-height: 1.25;\n  }\n\n  #torsunov-solar-calculator .tsc__lead {\n    max-width: 800px;\n    margin: 0;\n    color: var(--tsc-muted);\n    font-size: 16px;\n  }\n\n  #torsunov-solar-calculator .tsc__panel,\n  #torsunov-solar-calculator .tsc__results,\n  #torsunov-solar-calculator .tsc__manual,\n  #torsunov-solar-calculator .tsc__method {\n    border: 1px solid var(--tsc-border);\n    border-radius: 16px;\n    background: var(--tsc-bg);\n  }\n\n  #torsunov-solar-calculator .tsc__panel {\n    padding: 20px;\n    background: var(--tsc-panel);\n  }\n\n  #torsunov-solar-calculator .tsc__grid {\n    display: grid;\n    gap: 16px;\n  }\n\n  #torsunov-solar-calculator .tsc__grid--location {\n    grid-template-columns: minmax(0, 2fr) minmax(180px, .8fr);\n  }\n\n  #torsunov-solar-calculator .tsc__grid--manual {\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n  }\n\n  #torsunov-solar-calculator .tsc__field label {\n    display: block;\n    margin-bottom: 6px;\n    font-size: 13px;\n    font-weight: 700;\n  }\n\n  #torsunov-solar-calculator input[type=\"text\"],\n  #torsunov-solar-calculator input[type=\"date\"],\n  #torsunov-solar-calculator input[type=\"time\"] {\n    width: 100%;\n    min-height: 46px;\n    padding: 10px 12px;\n    border: 1px solid #cfd4cb;\n    border-radius: 9px;\n    outline: none;\n    background: #fff;\n    color: var(--tsc-text);\n    font: inherit;\n    transition: border-color .2s ease, box-shadow .2s ease;\n  }\n\n  #torsunov-solar-calculator input:focus {\n    border-color: var(--tsc-accent);\n    box-shadow: 0 0 0 3px rgba(33, 200, 202, .16);\n  }\n\n  #torsunov-solar-calculator .tsc__autocomplete {\n    position: relative;\n  }\n\n  #torsunov-solar-calculator .tsc__suggestions {\n    position: absolute;\n    z-index: 1000;\n    top: calc(100% + 5px);\n    right: 0;\n    left: 0;\n    max-height: 320px;\n    overflow-y: auto;\n    border: 1px solid var(--tsc-border);\n    border-radius: 10px;\n    background: #fff;\n    box-shadow: 0 12px 30px rgba(0,0,0,.12);\n  }\n\n  #torsunov-solar-calculator .tsc__suggestion {\n    display: block;\n    width: 100%;\n    padding: 10px 12px;\n    border: 0;\n    border-bottom: 1px solid #eef0eb;\n    background: #fff;\n    color: var(--tsc-text);\n    text-align: left;\n    cursor: pointer;\n  }\n\n  #torsunov-solar-calculator .tsc__suggestion:last-child {\n    border-bottom: 0;\n  }\n\n  #torsunov-solar-calculator .tsc__suggestion:hover,\n  #torsunov-solar-calculator .tsc__suggestion:focus {\n    background: var(--tsc-accent-soft);\n    outline: none;\n  }\n\n  #torsunov-solar-calculator .tsc__suggestion-main {\n    display: block;\n    font-weight: 700;\n  }\n\n  #torsunov-solar-calculator .tsc__suggestion-sub {\n    display: block;\n    margin-top: 2px;\n    color: var(--tsc-muted);\n    font-size: 12px;\n  }\n\n  #torsunov-solar-calculator .tsc__actions {\n    display: flex;\n    flex-wrap: wrap;\n    gap: 10px;\n    margin-top: 16px;\n  }\n\n  #torsunov-solar-calculator .tsc__button {\n    min-height: 44px;\n    padding: 10px 17px;\n    border: 1px solid transparent;\n    border-radius: 9px;\n    font: inherit;\n    font-weight: 700;\n    cursor: pointer;\n    transition: transform .15s ease, background .2s ease, border-color .2s ease;\n  }\n\n  #torsunov-solar-calculator .tsc__button:active {\n    transform: translateY(1px);\n  }\n\n  #torsunov-solar-calculator .tsc__button:disabled {\n    opacity: .55;\n    cursor: wait;\n  }\n\n  #torsunov-solar-calculator .tsc__button--primary {\n    border-color: var(--tsc-accent);\n    background: var(--tsc-accent);\n    color: #fff;\n  }\n\n  #torsunov-solar-calculator .tsc__button--primary:hover {\n    border-color: var(--tsc-accent-dark);\n    background: var(--tsc-accent-dark);\n  }\n\n  #torsunov-solar-calculator .tsc__button--secondary {\n    border-color: #cfd4cb;\n    background: #fff;\n    color: var(--tsc-text);\n  }\n\n  #torsunov-solar-calculator .tsc__button--secondary:hover {\n    border-color: var(--tsc-accent);\n    background: var(--tsc-accent-soft);\n  }\n\n  #torsunov-solar-calculator .tsc__selected {\n    margin-top: 14px;\n    padding: 10px 12px;\n    border-radius: 9px;\n    background: #fff;\n    color: var(--tsc-muted);\n    font-size: 13px;\n  }\n\n  #torsunov-solar-calculator .tsc__selected strong {\n    color: var(--tsc-text);\n  }\n\n  #torsunov-solar-calculator .tsc__status {\n    min-height: 1.5em;\n    margin-top: 10px;\n    color: var(--tsc-muted);\n    font-size: 13px;\n  }\n\n  #torsunov-solar-calculator .tsc__status--error {\n    color: #a4362c;\n  }\n\n  #torsunov-solar-calculator .tsc__results {\n    margin-top: 20px;\n    padding: 20px;\n  }\n\n  #torsunov-solar-calculator .tsc__section-head {\n    display: flex;\n    align-items: flex-start;\n    justify-content: space-between;\n    gap: 16px;\n    margin-bottom: 16px;\n  }\n\n  #torsunov-solar-calculator .tsc__section-head--regime {\n    margin-top: 28px;\n  }\n\n  #torsunov-solar-calculator .tsc__timezone {\n    padding: 5px 9px;\n    border-radius: 999px;\n    background: var(--tsc-accent-soft);\n    color: var(--tsc-accent-dark);\n    font-size: 12px;\n    white-space: nowrap;\n  }\n\n  #torsunov-solar-calculator .tsc__sun-grid {\n    display: grid;\n    grid-template-columns: repeat(3, minmax(0, 1fr));\n    gap: 12px;\n  }\n\n  #torsunov-solar-calculator .tsc__sun-card {\n    min-height: 132px;\n    padding: 17px;\n    border: 1px solid var(--tsc-border);\n    border-radius: 12px;\n    background: #fff;\n  }\n\n  #torsunov-solar-calculator .tsc__sun-card--accent {\n    border-color: #b7eded;\n    background: var(--tsc-accent-soft);\n  }\n\n  #torsunov-solar-calculator .tsc__sun-label {\n    min-height: 2.9em;\n    color: var(--tsc-muted);\n    font-size: 13px;\n    font-weight: 700;\n  }\n\n  #torsunov-solar-calculator .tsc__sun-time {\n    margin-top: 4px;\n    font-size: clamp(29px, 5vw, 40px);\n    font-weight: 800;\n    letter-spacing: -.02em;\n    line-height: 1;\n  }\n\n  #torsunov-solar-calculator .tsc__sun-note {\n    margin-top: 8px;\n    color: var(--tsc-muted);\n    font-size: 11px;\n  }\n\n  #torsunov-solar-calculator .tsc__offset {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 12px;\n    margin-top: 12px;\n    padding: 11px 14px;\n    border-radius: 10px;\n    background: #f7f8f5;\n    font-size: 13px;\n  }\n\n  #torsunov-solar-calculator .tsc__offset strong {\n    font-size: 16px;\n  }\n\n  #torsunov-solar-calculator .tsc__regime {\n    overflow: hidden;\n    border: 1px solid var(--tsc-border);\n    border-radius: 12px;\n  }\n\n  #torsunov-solar-calculator .tsc__regime-row {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    gap: 20px;\n    min-height: 72px;\n    padding: 13px 16px;\n    border-bottom: 1px solid var(--tsc-border);\n    background: #fff;\n  }\n\n  #torsunov-solar-calculator .tsc__regime-row:last-child {\n    border-bottom: 0;\n  }\n\n  #torsunov-solar-calculator .tsc__regime-row strong,\n  #torsunov-solar-calculator .tsc__regime-row span {\n    display: block;\n  }\n\n  #torsunov-solar-calculator .tsc__regime-row span {\n    margin-top: 2px;\n    color: var(--tsc-muted);\n    font-size: 12px;\n  }\n\n  #torsunov-solar-calculator .tsc__regime-time {\n    flex: 0 0 auto;\n    color: var(--tsc-accent-dark);\n    font-size: 24px;\n    font-weight: 800;\n  }\n\n  #torsunov-solar-calculator .tsc__converter {\n    display: grid;\n    grid-template-columns: 1.35fr 1fr;\n    gap: 24px;\n    margin-top: 24px;\n    padding: 18px;\n    border-radius: 12px;\n    background: var(--tsc-panel);\n  }\n\n  #torsunov-solar-calculator .tsc__converter p {\n    margin: 8px 0 0;\n    color: var(--tsc-muted);\n    font-size: 13px;\n  }\n\n  #torsunov-solar-calculator .tsc__converter-controls {\n    display: grid;\n    grid-template-columns: 1fr auto 1fr;\n    align-items: end;\n    gap: 10px;\n  }\n\n  #torsunov-solar-calculator .tsc__convert-arrow {\n    padding-bottom: 12px;\n    color: var(--tsc-muted);\n    font-size: 22px;\n  }\n\n  #torsunov-solar-calculator .tsc__result-input {\n    display: flex;\n    align-items: center;\n    min-height: 46px;\n    padding: 10px 12px;\n    border: 1px solid #cfd4cb;\n    border-radius: 9px;\n    background: #fff;\n    color: var(--tsc-accent-dark);\n    font-weight: 800;\n  }\n\n  #torsunov-solar-calculator .tsc__warning {\n    margin-top: 16px;\n    padding: 12px 14px;\n    border: 1px solid var(--tsc-warning-border);\n    border-radius: 10px;\n    background: var(--tsc-warning);\n    font-size: 13px;\n  }\n\n  #torsunov-solar-calculator .tsc__manual {\n    margin-top: 20px;\n    overflow: hidden;\n  }\n\n  #torsunov-solar-calculator .tsc__manual summary {\n    padding: 15px 18px;\n    font-weight: 700;\n    cursor: pointer;\n    background: var(--tsc-panel);\n  }\n\n  #torsunov-solar-calculator .tsc__manual-body {\n    padding: 18px;\n    border-top: 1px solid var(--tsc-border);\n  }\n\n  #torsunov-solar-calculator .tsc__manual-body > p {\n    margin-top: 0;\n    color: var(--tsc-muted);\n  }\n\n  #torsunov-solar-calculator .tsc__actions--manual {\n    margin-top: 14px;\n  }\n\n  #torsunov-solar-calculator .tsc__manual-note {\n    margin-top: 12px;\n    color: var(--tsc-muted);\n    font-size: 12px;\n  }\n\n  #torsunov-solar-calculator .tsc__method {\n    margin-top: 20px;\n    padding: 16px 18px;\n    background: var(--tsc-panel);\n  }\n\n  #torsunov-solar-calculator .tsc__method p {\n    margin: 6px 0 8px;\n    color: var(--tsc-muted);\n    font-size: 13px;\n  }\n\n  #torsunov-solar-calculator .tsc__method code {\n    display: inline-block;\n    max-width: 100%;\n    padding: 7px 9px;\n    border-radius: 7px;\n    background: #fff;\n    color: var(--tsc-text);\n    font-size: 12px;\n    white-space: normal;\n  }\n\n  #torsunov-solar-calculator .tsc__sources {\n    margin-top: 12px;\n    color: var(--tsc-muted);\n    font-size: 11px;\n    text-align: center;\n  }\n\n  #torsunov-solar-calculator .tsc__sources a {\n    color: var(--tsc-accent-dark);\n    text-decoration: underline;\n  }\n\n  @media (max-width: 720px) {\n    #torsunov-solar-calculator .tsc__grid--location,\n    #torsunov-solar-calculator .tsc__grid--manual,\n    #torsunov-solar-calculator .tsc__sun-grid,\n    #torsunov-solar-calculator .tsc__converter {\n      grid-template-columns: 1fr;\n    }\n\n    #torsunov-solar-calculator .tsc__section-head {\n      display: block;\n    }\n\n    #torsunov-solar-calculator .tsc__timezone {\n      display: inline-block;\n      margin-top: 8px;\n    }\n\n    #torsunov-solar-calculator .tsc__converter-controls {\n      grid-template-columns: 1fr;\n    }\n\n    #torsunov-solar-calculator .tsc__convert-arrow {\n      display: none;\n    }\n\n    #torsunov-solar-calculator .tsc__sun-card {\n      min-height: auto;\n    }\n\n    #torsunov-solar-calculator .tsc__sun-label {\n      min-height: auto;\n    }\n  }\n\n  @media (max-width: 480px) {\n    #torsunov-solar-calculator .tsc__panel,\n    #torsunov-solar-calculator .tsc__results {\n      padding: 14px;\n      border-radius: 12px;\n    }\n\n    #torsunov-solar-calculator .tsc__actions {\n      display: grid;\n      grid-template-columns: 1fr;\n    }\n\n    #torsunov-solar-calculator .tsc__button {\n      width: 100%;\n    }\n\n    #torsunov-solar-calculator .tsc__regime-row {\n      gap: 10px;\n      padding: 12px;\n    }\n\n    #torsunov-solar-calculator .tsc__regime-time {\n      font-size: 21px;\n    }\n\n    #torsunov-solar-calculator .tsc__offset {\n      align-items: flex-start;\n      flex-direction: column;\n    }\n  }\n<\/style>\n\n<script>\n(function () {\n  'use strict';\n\n  const root = document.getElementById('torsunov-solar-calculator');\n  if (!root || root.dataset.initialized === '1') return;\n  root.dataset.initialized = '1';\n\n  const $ = (selector) => root.querySelector(selector);\n\n  const els = {\n    city: $('#tsc-city'),\n    cityResults: $('#tsc-city-results'),\n    date: $('#tsc-date'),\n    geolocate: $('#tsc-geolocate'),\n    calculate: $('#tsc-calculate'),\n    selected: $('#tsc-selected'),\n    status: $('#tsc-status'),\n    results: $('#tsc-results'),\n    timezone: $('#tsc-timezone'),\n    sunrise: $('#tsc-sunrise'),\n    noon: $('#tsc-noon'),\n    sunset: $('#tsc-sunset'),\n    offset: $('#tsc-offset'),\n    riseTime: $('#tsc-rise-time'),\n    lunchTime: $('#tsc-lunch-time'),\n    dinnerTime: $('#tsc-dinner-time'),\n    sleepTime: $('#tsc-sleep-time'),\n    customSolar: $('#tsc-custom-solar'),\n    customLocal: $('#tsc-custom-local'),\n    polarWarning: $('#tsc-polar-warning'),\n    manualRise: $('#tsc-manual-rise'),\n    manualNoon: $('#tsc-manual-noon'),\n    manualSet: $('#tsc-manual-set'),\n    midpoint: $('#tsc-midpoint'),\n    applyManual: $('#tsc-apply-manual')\n  };\n\n  const state = {\n    location: null,\n    solarNoonMinutes: null,\n    searchTimer: null,\n    searchController: null,\n    requestController: null,\n    dateWasChanged: false\n  };\n\n  function pad2(n) {\n    return String(n).padStart(2, '0');\n  }\n\n  function browserDateISO() {\n    const d = new Date();\n    return [\n      d.getFullYear(),\n      pad2(d.getMonth() + 1),\n      pad2(d.getDate())\n    ].join('-');\n  }\n\n  function dateInTimeZone(timeZone) {\n    try {\n      const parts = new Intl.DateTimeFormat('en-CA', {\n        timeZone: timeZone,\n        year: 'numeric',\n        month: '2-digit',\n        day: '2-digit'\n      }).formatToParts(new Date());\n\n      const obj = {};\n      parts.forEach(part => {\n        if (part.type !== 'literal') obj[part.type] = part.value;\n      });\n\n      if (obj.year && obj.month && obj.day) {\n        return `${obj.year}-${obj.month}-${obj.day}`;\n      }\n    } catch (e) {}\n    return browserDateISO();\n  }\n\n  function timeToMinutes(value) {\n    if (!value || typeof value !== 'string') return null;\n    var parts = value.split(':');\n    if (parts.length < 2) return null;\n    var h = Number(parts[0]);\n    var m = Number(parts[1]);\n    if (!Number.isFinite(h) || !Number.isFinite(m) || h < 0 || h > 23 || m < 0 || m > 59) return null;\n    return h * 60 + m;\n  }\n\n  function isoLocalTimeToMinutes(iso) {\n    if (!iso || typeof iso !== 'string') return null;\n    var tPos = iso.indexOf('T');\n    if (tPos === -1 || iso.length < tPos + 6) return null;\n    var timePart = iso.substring(tPos + 1, tPos + 6);\n    return timeToMinutes(timePart);\n  }\n\n  function isoLocalTime(iso) {\n    const mins = isoLocalTimeToMinutes(iso);\n    return mins === null ? '\\u2014' : minutesToClock(mins).text;\n  }\n\n  function minutesToClock(totalMinutes) {\n    if (!Number.isFinite(totalMinutes)) {\n      return { text: '\\u2014', dayShift: 0 };\n    }\n\n    const dayShift = Math.floor(totalMinutes \/ 1440);\n    let normalized = totalMinutes % 1440;\n    if (normalized < 0) normalized += 1440;\n\n    const hours = Math.floor(normalized \/ 60);\n    const minutes = Math.round(normalized % 60);\n\n    \/\/ \\u0417\\u0430\\u0449\\u0438\\u0442\\u0430 \\u043E\\u0442 \\u043E\\u043A\\u0440\\u0443\\u0433\\u043B\\u0435\\u043D\\u0438\\u044F \\u0434\\u043E 60 \\u043C\\u0438\\u043D\\u0443\\u0442.\n    if (minutes === 60) {\n      return minutesToClock(dayShift * 1440 + normalized + 1);\n    }\n\n    return {\n      text: `${pad2(hours)}:${pad2(minutes)}`,\n      dayShift\n    };\n  }\n\n  function formatClockWithDay(totalMinutes) {\n    const value = minutesToClock(totalMinutes);\n    if (value.text === '\\u2014') return value.text;\n    if (value.dayShift > 0) return `${value.text} (+${value.dayShift} \\u0434\\u043D.)`;\n    if (value.dayShift < 0) return `${value.text} (${value.dayShift} \\u0434\\u043D.)`;\n    return value.text;\n  }\n\n  function formatOffset(offsetMinutes) {\n    if (!Number.isFinite(offsetMinutes)) return '\\u2014';\n    if (offsetMinutes === 0) return '0 \\u043C\\u0438\\u043D';\n\n    const sign = offsetMinutes > 0 ? '+' : '\\u2212';\n    const abs = Math.abs(Math.round(offsetMinutes));\n    const h = Math.floor(abs \/ 60);\n    const m = abs % 60;\n\n    if (h && m) return `${sign}${h} \\u0447 ${pad2(m)} \\u043C\\u0438\\u043D`;\n    if (h) return `${sign}${h} \\u0447`;\n    return `${sign}${m} \\u043C\\u0438\\u043D`;\n  }\n\n  function escapeHtml(value) {\n    var text = String(value === null || value === undefined ? '' : value);\n    var div = document.createElement('div');\n    div.textContent = text;\n    return div.innerHTML;\n  }\n\n  function setStatus(message, isError = false) {\n    els.status.textContent = message || '';\n    els.status.classList.toggle('tsc__status--error', !!isError);\n  }\n\n  function setBusy(isBusy) {\n    els.calculate.disabled = isBusy;\n    els.geolocate.disabled = isBusy;\n    if (isBusy) {\n      els.calculate.dataset.oldText = els.calculate.textContent;\n      els.calculate.textContent = '\\u0420\\u0430\\u0441\\u0447\\u0451\\u0442...';\n    } else if (els.calculate.dataset.oldText) {\n      els.calculate.textContent = els.calculate.dataset.oldText;\n      delete els.calculate.dataset.oldText;\n    }\n  }\n\n  function renderSelectedLocation() {\n    if (!state.location) {\n      els.selected.hidden = true;\n      els.selected.innerHTML = '';\n      return;\n    }\n\n    const loc = state.location;\n    const coords = `${Number(loc.latitude).toFixed(5)}, ${Number(loc.longitude).toFixed(5)}`;\n\n    const name = loc.label || '\\u0422\\u043E\\u0447\\u043A\\u0430 \\u043F\\u043E \\u043A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u0430\\u043C';\n    const tz = loc.timezone ? ` \\u00B7 ${escapeHtml(loc.timezone)}` : '';\n\n    els.selected.innerHTML =\n      `<strong>${escapeHtml(name)}<\/strong><br>` +\n      `\\u041A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u044B: ${escapeHtml(coords)}${tz}`;\n\n    els.selected.hidden = false;\n  }\n\n  function setLocation(location, { updateDate = true } = {}) {\n    state.location = {\n      latitude: Number(location.latitude),\n      longitude: Number(location.longitude),\n      timezone: location.timezone || '',\n      label: location.label || ''\n    };\n\n    if (updateDate && !state.dateWasChanged && state.location.timezone) {\n      els.date.value = dateInTimeZone(state.location.timezone);\n    }\n\n    renderSelectedLocation();\n  }\n\n  function locationLabel(item) {\n    const parts = [item.name];\n    if (item.admin1 && item.admin1 !== item.name) parts.push(item.admin1);\n    if (item.country) parts.push(item.country);\n    return parts.filter(Boolean).join(', ');\n  }\n\n  function closeSuggestions() {\n    els.cityResults.hidden = true;\n    els.cityResults.innerHTML = '';\n  }\n\n  function renderSuggestions(results) {\n    els.cityResults.innerHTML = '';\n\n    if (!results || !results.length) {\n      const empty = document.createElement('div');\n      empty.className = 'tsc__suggestion';\n      empty.textContent = '\\u041D\\u0438\\u0447\\u0435\\u0433\\u043E \\u043D\\u0435 \\u043D\\u0430\\u0439\\u0434\\u0435\\u043D\\u043E';\n      els.cityResults.appendChild(empty);\n      els.cityResults.hidden = false;\n      return;\n    }\n\n    results.forEach(item => {\n      const button = document.createElement('button');\n      button.type = 'button';\n      button.className = 'tsc__suggestion';\n      button.setAttribute('role', 'option');\n\n      const main = document.createElement('span');\n      main.className = 'tsc__suggestion-main';\n      main.textContent = item.name || '\\u0411\\u0435\\u0437 \\u043D\\u0430\\u0437\\u0432\\u0430\\u043D\\u0438\\u044F';\n\n      const sub = document.createElement('span');\n      sub.className = 'tsc__suggestion-sub';\n      const subParts = [];\n      if (item.admin1 && item.admin1 !== item.name) subParts.push(item.admin1);\n      if (item.country) subParts.push(item.country);\n      if (item.timezone) subParts.push(item.timezone);\n      sub.textContent = subParts.join(' \\u00B7 ');\n\n      button.appendChild(main);\n      button.appendChild(sub);\n\n      button.addEventListener('click', () => {\n        const label = locationLabel(item);\n        els.city.value = label;\n\n        setLocation({\n          latitude: item.latitude,\n          longitude: item.longitude,\n          timezone: item.timezone || '',\n          label\n        });\n\n        closeSuggestions();\n        calculateFromApi();\n      });\n\n      els.cityResults.appendChild(button);\n    });\n\n    els.cityResults.hidden = false;\n  }\n\n  async function searchCities(query) {\n    const q = query.trim();\n    if (q.length < 2) {\n      closeSuggestions();\n      return;\n    }\n\n    if (state.searchController) state.searchController.abort();\n    state.searchController = new AbortController();\n\n    try {\n      const url =\n        'https:\/\/geocoding-api.open-meteo.com\/v1\/search' +\n        '?name=' + encodeURIComponent(q) +\n        '&count=8&language=ru&format=json';\n\n      const response = await fetch(url, {\n        signal: state.searchController.signal,\n        headers: { 'Accept': 'application\/json' }\n      });\n\n      if (!response.ok) {\n        throw new Error(`\\u041E\\u0448\\u0438\\u0431\\u043A\\u0430 \\u043F\\u043E\\u0438\\u0441\\u043A\\u0430 \\u0433\\u043E\\u0440\\u043E\\u0434\\u0430 (${response.status})`);\n      }\n\n      const data = await response.json();\n      renderSuggestions(data.results || []);\n    } catch (error) {\n      if (error.name === 'AbortError') return;\n      closeSuggestions();\n      setStatus('\\u041D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u0438\\u0442\\u044C \\u043F\\u043E\\u0438\\u0441\\u043A \\u0433\\u043E\\u0440\\u043E\\u0434\\u0430. \\u041C\\u043E\\u0436\\u043D\\u043E \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u044C \\u0433\\u0435\\u043E\\u043B\\u043E\\u043A\\u0430\\u0446\\u0438\\u044E \\u0438\\u043B\\u0438 \\u0440\\u0443\\u0447\\u043D\\u043E\\u0439 \\u0440\\u0435\\u0436\\u0438\\u043C.', true);\n    }\n  }\n\n  function onCityInput() {\n    \/\/ \\u0415\\u0441\\u043B\\u0438 \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044C \\u0438\\u0437\\u043C\\u0435\\u043D\\u0438\\u043B \\u0443\\u0436\\u0435 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u0439 \\u0433\\u043E\\u0440\\u043E\\u0434, \\u0441\\u0442\\u0430\\u0440\\u044B\\u0435 \\u043A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u044B \\u0431\\u043E\\u043B\\u044C\\u0448\\u0435 \\u043D\\u0435 \\u0441\\u0447\\u0438\\u0442\\u0430\\u0435\\u043C \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u044B\\u043C\\u0438.\n    state.location = null;\n    renderSelectedLocation();\n\n    clearTimeout(state.searchTimer);\n    const q = els.city.value;\n\n    state.searchTimer = setTimeout(() => searchCities(q), 300);\n  }\n\n  function useGeolocation() {\n    if (!navigator.geolocation) {\n      setStatus('\\u0412\\u0430\\u0448 \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440 \\u043D\\u0435 \\u043F\\u043E\\u0434\\u0434\\u0435\\u0440\\u0436\\u0438\\u0432\\u0430\\u0435\\u0442 \\u043E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u0435\\u043D\\u0438\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E\\u043F\\u043E\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u044F.', true);\n      return;\n    }\n\n    setStatus('\\u041E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u044F\\u0435\\u043C \\u043A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u044B\\u2026');\n    els.geolocate.disabled = true;\n\n    navigator.geolocation.getCurrentPosition(\n      (position) => {\n        els.geolocate.disabled = false;\n\n        const lat = position.coords.latitude;\n        const lng = position.coords.longitude;\n\n        setLocation({\n          latitude: lat,\n          longitude: lng,\n          timezone: '',\n          label: '\\u0412\\u0430\\u0448\\u0435 \\u0442\\u0435\\u043A\\u0443\\u0449\\u0435\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E\\u043F\\u043E\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0435'\n        }, { updateDate: false });\n\n        els.city.value = '\\u0412\\u0430\\u0448\\u0435 \\u0442\\u0435\\u043A\\u0443\\u0449\\u0435\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E\\u043F\\u043E\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0435';\n        setStatus('\\u041A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u044B \\u043E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u0435\\u043D\\u044B. \\u041F\\u043E\\u043B\\u0443\\u0447\\u0430\\u0435\\u043C \\u0430\\u0441\\u0442\\u0440\\u043E\\u043D\\u043E\\u043C\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u0434\\u0430\\u043D\\u043D\\u044B\\u0435\\u2026');\n        calculateFromApi();\n      },\n      (error) => {\n        els.geolocate.disabled = false;\n\n        let message = '\\u041D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u043E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u0438\\u0442\\u044C \\u043C\\u0435\\u0441\\u0442\\u043E\\u043F\\u043E\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0435.';\n        if (error.code === 1) message = '\\u0414\\u043E\\u0441\\u0442\\u0443\\u043F \\u043A \\u0433\\u0435\\u043E\\u043B\\u043E\\u043A\\u0430\\u0446\\u0438\\u0438 \\u0437\\u0430\\u043F\\u0440\\u0435\\u0449\\u0451\\u043D \\u0432 \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440\\u0435.';\n        if (error.code === 2) message = '\\u041D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u043E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u0438\\u0442\\u044C \\u043A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u044B \\u0443\\u0441\\u0442\\u0440\\u043E\\u0439\\u0441\\u0442\\u0432\\u0430.';\n        if (error.code === 3) message = '\\u0418\\u0441\\u0442\\u0435\\u043A\\u043B\\u043E \\u0432\\u0440\\u0435\\u043C\\u044F \\u043E\\u0436\\u0438\\u0434\\u0430\\u043D\\u0438\\u044F \\u0433\\u0435\\u043E\\u043B\\u043E\\u043A\\u0430\\u0446\\u0438\\u0438.';\n\n        setStatus(message, true);\n      },\n      {\n        enableHighAccuracy: false,\n        timeout: 12000,\n        maximumAge: 300000\n      }\n    );\n  }\n\n  async function calculateFromApi() {\n    if (!state.location) {\n      setStatus('\\u0421\\u043D\\u0430\\u0447\\u0430\\u043B\\u0430 \\u0432\\u044B\\u0431\\u0435\\u0440\\u0438\\u0442\\u0435 \\u0433\\u043E\\u0440\\u043E\\u0434 \\u0438\\u0437 \\u0432\\u044B\\u043F\\u0430\\u0434\\u0430\\u044E\\u0449\\u0435\\u0433\\u043E \\u0441\\u043F\\u0438\\u0441\\u043A\\u0430 \\u0438\\u043B\\u0438 \\u043E\\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u0438\\u0442\\u0435 \\u043C\\u0435\\u0441\\u0442\\u043E\\u043F\\u043E\\u043B\\u043E\\u0436\\u0435\\u043D\\u0438\\u0435.', true);\n      els.city.focus();\n      return;\n    }\n\n    if (!els.date.value) {\n      setStatus('\\u0412\\u044B\\u0431\\u0435\\u0440\\u0438\\u0442\\u0435 \\u0434\\u0430\\u0442\\u0443 \\u0440\\u0430\\u0441\\u0447\\u0451\\u0442\\u0430.', true);\n      els.date.focus();\n      return;\n    }\n\n    if (state.requestController) state.requestController.abort();\n    state.requestController = new AbortController();\n\n    const lat = state.location.latitude;\n    const lng = state.location.longitude;\n    const date = els.date.value;\n\n    setBusy(true);\n    setStatus('\\u041F\\u043E\\u043B\\u0443\\u0447\\u0430\\u0435\\u043C \\u0430\\u0441\\u0442\\u0440\\u043E\\u043D\\u043E\\u043C\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u0434\\u0430\\u043D\\u043D\\u044B\\u0435\\u2026');\n\n    try {\n      const url =\n        'https:\/\/api.sunrise-sunset.org\/v2' +\n        '?lat=' + encodeURIComponent(lat) +\n        '&lng=' + encodeURIComponent(lng) +\n        '&date=' + encodeURIComponent(date);\n\n      const response = await fetch(url, {\n        signal: state.requestController.signal,\n        headers: { 'Accept': 'application\/json' }\n      });\n\n      const data = await response.json();\n\n      if (!response.ok || data.error) {\n        const message = data.message || data.error || `HTTP ${response.status}`;\n        throw new Error(message);\n      }\n\n      if (!data.solar_noon) {\n        throw new Error('API \\u043D\\u0435 \\u0432\\u0435\\u0440\\u043D\\u0443\\u043B \\u0432\\u0440\\u0435\\u043C\\u044F \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u043E\\u0433\\u043E \\u043F\\u043E\\u043B\\u0443\\u0434\\u043D\\u044F \\u0434\\u043B\\u044F \\u044D\\u0442\\u043E\\u0439 \\u0442\\u043E\\u0447\\u043A\\u0438 \\u0438 \\u0434\\u0430\\u0442\\u044B.');\n      }\n\n      \/\/ \\u0412\\u0410\\u0416\\u041D\\u041E:\n      \/\/ \\u041D\\u0435 \\u0438\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0435\\u043C new Date(data.solar_noon) \\u0434\\u043B\\u044F \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u044F.\n      \/\/ API \\u0432\\u043E\\u0437\\u0432\\u0440\\u0430\\u0449\\u0430\\u0435\\u0442 ISO-\\u0432\\u0440\\u0435\\u043C\\u044F \\u0432 \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E\\u043C \\u043F\\u043E\\u044F\\u0441\\u0435 \\u0441\\u0430\\u043C\\u043E\\u0439 \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u0442\\u043E\\u0447\\u043A\\u0438.\n      \/\/ new Date() \\u043F\\u0435\\u0440\\u0435\\u0432\\u0451\\u043B \\u0431\\u044B \\u0435\\u0433\\u043E \\u0432 \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E\\u0439 \\u043F\\u043E\\u044F\\u0441 \\u0431\\u0440\\u0430\\u0443\\u0437\\u0435\\u0440\\u0430 \\u043F\\u043E\\u043B\\u044C\\u0437\\u043E\\u0432\\u0430\\u0442\\u0435\\u043B\\u044F.\n      const noonMinutes = isoLocalTimeToMinutes(data.solar_noon);\n\n      if (noonMinutes === null) {\n        throw new Error('\\u041D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u0440\\u0430\\u0441\\u043F\\u043E\\u0437\\u043D\\u0430\\u0442\\u044C \\u0432\\u0440\\u0435\\u043C\\u044F \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u043E\\u0433\\u043E \\u043F\\u043E\\u043B\\u0443\\u0434\\u043D\\u044F.');\n      }\n\n      state.solarNoonMinutes = noonMinutes;\n\n      \/\/ \\u0415\\u0441\\u043B\\u0438 \\u043A\\u043E\\u043E\\u0440\\u0434\\u0438\\u043D\\u0430\\u0442\\u044B \\u043F\\u043E\\u043B\\u0443\\u0447\\u0435\\u043D\\u044B \\u0447\\u0435\\u0440\\u0435\\u0437 \\u0433\\u0435\\u043E\\u043B\\u043E\\u043A\\u0430\\u0446\\u0438\\u044E, \\u0447\\u0430\\u0441\\u043E\\u0432\\u043E\\u0439 \\u043F\\u043E\\u044F\\u0441 \\u0431\\u0435\\u0440\\u0451\\u043C \\u0438\\u0437 astronomy API.\n      if (!state.location.timezone && data.tzid) {\n        state.location.timezone = data.tzid;\n        if (!state.dateWasChanged) {\n          \/\/ \\u0414\\u0430\\u0442\\u0443 \\u043D\\u0435 \\u043C\\u0435\\u043D\\u044F\\u0435\\u043C \\u043F\\u043E\\u0441\\u043B\\u0435 \\u0437\\u0430\\u043F\\u0440\\u043E\\u0441\\u0430, \\u0447\\u0442\\u043E\\u0431\\u044B \\u043D\\u0435 \\u0437\\u0430\\u043F\\u0440\\u043E\\u0441\\u0438\\u0442\\u044C \\u0434\\u0440\\u0443\\u0433\\u043E\\u0439 \\u0434\\u0435\\u043D\\u044C \\u0430\\u0432\\u0442\\u043E\\u043C\\u0430\\u0442\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438.\n          \/\/ \\u041D\\u043E timezone \\u0441\\u043E\\u0445\\u0440\\u0430\\u043D\\u044F\\u0435\\u043C \\u0434\\u043B\\u044F \\u043E\\u0442\\u043E\\u0431\\u0440\\u0430\\u0436\\u0435\\u043D\\u0438\\u044F.\n        }\n        renderSelectedLocation();\n      }\n\n      renderResults({\n        sunrise: data.sunrise,\n        solarNoon: data.solar_noon,\n        sunset: data.sunset,\n        timezone: data.tzid || state.location.timezone || '',\n        utcOffset: data.utc_offset || '',\n        sunStatus: data.sun_status || 'normal',\n        source: 'api'\n      });\n\n      setStatus('\\u0420\\u0430\\u0441\\u0447\\u0451\\u0442 \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D.');\n    } catch (error) {\n      if (error.name === 'AbortError') return;\n      setStatus(\n        '\\u041D\\u0435 \\u0443\\u0434\\u0430\\u043B\\u043E\\u0441\\u044C \\u043F\\u043E\\u043B\\u0443\\u0447\\u0438\\u0442\\u044C \\u0430\\u0441\\u0442\\u0440\\u043E\\u043D\\u043E\\u043C\\u0438\\u0447\\u0435\\u0441\\u043A\\u0438\\u0435 \\u0434\\u0430\\u043D\\u043D\\u044B\\u0435: ' +\n        (error.message || '\\u043D\\u0435\\u0438\\u0437\\u0432\\u0435\\u0441\\u0442\\u043D\\u0430\\u044F \\u043E\\u0448\\u0438\\u0431\\u043A\\u0430') +\n        '. \\u041F\\u043E\\u043F\\u0440\\u043E\\u0431\\u0443\\u0439\\u0442\\u0435 \\u0435\\u0449\\u0451 \\u0440\\u0430\\u0437 \\u0438\\u043B\\u0438 \\u0432\\u043E\\u0441\\u043F\\u043E\\u043B\\u044C\\u0437\\u0443\\u0439\\u0442\\u0435\\u0441\\u044C \\u0440\\u0443\\u0447\\u043D\\u044B\\u043C \\u0440\\u0435\\u0436\\u0438\\u043C\\u043E\\u043C.',\n        true\n      );\n    } finally {\n      setBusy(false);\n    }\n  }\n\n  function renderResults(data) {\n    if (!Number.isFinite(state.solarNoonMinutes)) return;\n\n    const noon = state.solarNoonMinutes;\n    const offset = noon - 720; \/\/ 12:00 = 720 \\u043C\\u0438\\u043D\\u0443\\u0442\n\n    els.sunrise.textContent = data.sunrise ? isoLocalTime(data.sunrise) : '\\u2014';\n    els.noon.textContent = data.solarNoon\n      ? isoLocalTime(data.solarNoon)\n      : minutesToClock(noon).text;\n    els.sunset.textContent = data.sunset ? isoLocalTime(data.sunset) : '\\u2014';\n\n    const timezoneParts = [];\n    if (data.timezone) timezoneParts.push(data.timezone);\n    if (data.utcOffset) timezoneParts.push('UTC' + data.utcOffset);\n    els.timezone.textContent = timezoneParts.join(' \\u00B7 ');\n\n    els.offset.textContent = formatOffset(offset);\n\n    els.riseTime.textContent = formatClockWithDay(noon - 360);   \/\/ 06:00\n    els.lunchTime.textContent = formatClockWithDay(noon);       \/\/ 12:00\n    els.dinnerTime.textContent = formatClockWithDay(noon + 360);\/\/ 18:00\n    els.sleepTime.textContent = formatClockWithDay(noon + 540); \/\/ 21:00\n\n    updateCustomConverter();\n\n    els.polarWarning.hidden = true;\n    els.polarWarning.textContent = '';\n\n    if (data.sunStatus === 'midnight_sun') {\n      els.polarWarning.textContent =\n        '\\u0414\\u043B\\u044F \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u0442\\u043E\\u0447\\u043A\\u0438 \\u043D\\u0430\\u0431\\u043B\\u044E\\u0434\\u0430\\u0435\\u0442\\u0441\\u044F \\u043F\\u043E\\u043B\\u044F\\u0440\\u043D\\u044B\\u0439 \\u0434\\u0435\\u043D\\u044C: \\u043E\\u0431\\u044B\\u0447\\u043D\\u043E\\u0433\\u043E \\u0432\\u043E\\u0441\\u0445\\u043E\\u0434\\u0430 \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0430\\u0442\\u0430 \\u0432 \\u044D\\u0442\\u0443 \\u0434\\u0430\\u0442\\u0443 \\u043C\\u043E\\u0436\\u0435\\u0442 \\u043D\\u0435 \\u0431\\u044B\\u0442\\u044C. \\u0420\\u0430\\u0441\\u0447\\u0451\\u0442 \\u0440\\u0435\\u0436\\u0438\\u043C\\u0430 \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u0435\\u043D \\u043E\\u0442\\u043D\\u043E\\u0441\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E \\u0438\\u0441\\u0442\\u0438\\u043D\\u043D\\u043E\\u0433\\u043E \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u043E\\u0433\\u043E \\u043F\\u043E\\u043B\\u0443\\u0434\\u043D\\u044F.';\n      els.polarWarning.hidden = false;\n    } else if (data.sunStatus === 'polar_night') {\n      els.polarWarning.textContent =\n        '\\u0414\\u043B\\u044F \\u0432\\u044B\\u0431\\u0440\\u0430\\u043D\\u043D\\u043E\\u0439 \\u0442\\u043E\\u0447\\u043A\\u0438 \\u043D\\u0430\\u0431\\u043B\\u044E\\u0434\\u0430\\u0435\\u0442\\u0441\\u044F \\u043F\\u043E\\u043B\\u044F\\u0440\\u043D\\u0430\\u044F \\u043D\\u043E\\u0447\\u044C: \\u043E\\u0431\\u044B\\u0447\\u043D\\u043E\\u0433\\u043E \\u0432\\u043E\\u0441\\u0445\\u043E\\u0434\\u0430 \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0430\\u0442\\u0430 \\u0432 \\u044D\\u0442\\u0443 \\u0434\\u0430\\u0442\\u0443 \\u043D\\u0435\\u0442. \\u0415\\u0441\\u043B\\u0438 API \\u0432\\u043E\\u0437\\u0432\\u0440\\u0430\\u0449\\u0430\\u0435\\u0442 \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u044B\\u0439 \\u043F\\u043E\\u043B\\u0434\\u0435\\u043D\\u044C, \\u0440\\u0435\\u0436\\u0438\\u043C \\u0440\\u0430\\u0441\\u0441\\u0447\\u0438\\u0442\\u044B\\u0432\\u0430\\u0435\\u0442\\u0441\\u044F \\u043E\\u0442\\u043D\\u043E\\u0441\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E \\u043D\\u0435\\u0433\\u043E.';\n      els.polarWarning.hidden = false;\n    } else if (!data.sunrise || !data.sunset) {\n      els.polarWarning.textContent =\n        '\\u041D\\u0430 \\u0432\\u044B\\u0441\\u043E\\u043A\\u0438\\u0445 \\u0448\\u0438\\u0440\\u043E\\u0442\\u0430\\u0445 \\u0432 \\u043E\\u0442\\u0434\\u0435\\u043B\\u044C\\u043D\\u044B\\u0435 \\u0434\\u0430\\u0442\\u044B \\u0432\\u043E\\u0441\\u0445\\u043E\\u0434 \\u0438\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0430\\u0442 \\u043C\\u043E\\u0436\\u0435\\u0442 \\u043E\\u0442\\u0441\\u0443\\u0442\\u0441\\u0442\\u0432\\u043E\\u0432\\u0430\\u0442\\u044C \\u0432 \\u043F\\u0440\\u0435\\u0434\\u0435\\u043B\\u0430\\u0445 \\u043A\\u0430\\u043B\\u0435\\u043D\\u0434\\u0430\\u0440\\u043D\\u043E\\u0433\\u043E \\u0434\\u043D\\u044F. \\u041E\\u0441\\u043D\\u043E\\u0432\\u043D\\u043E\\u0439 \\u0440\\u0430\\u0441\\u0447\\u0451\\u0442 \\u0432\\u044B\\u043F\\u043E\\u043B\\u043D\\u044F\\u0435\\u0442\\u0441\\u044F \\u043E\\u0442\\u043D\\u043E\\u0441\\u0438\\u0442\\u0435\\u043B\\u044C\\u043D\\u043E \\u0438\\u0441\\u0442\\u0438\\u043D\\u043D\\u043E\\u0433\\u043E \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u043E\\u0433\\u043E \\u043F\\u043E\\u043B\\u0443\\u0434\\u043D\\u044F.';\n      els.polarWarning.hidden = false;\n    }\n\n    els.results.hidden = false;\n  }\n\n  function updateCustomConverter() {\n    if (!Number.isFinite(state.solarNoonMinutes)) {\n      els.customLocal.textContent = '\\u2014';\n      return;\n    }\n\n    const solarMinutes = timeToMinutes(els.customSolar.value);\n    if (solarMinutes === null) {\n      els.customLocal.textContent = '\\u2014';\n      return;\n    }\n\n    const localMinutes = state.solarNoonMinutes + (solarMinutes - 720);\n    els.customLocal.textContent = formatClockWithDay(localMinutes);\n  }\n\n  function midpointBetweenRiseAndSet(riseMinutes, setMinutes) {\n    if (!Number.isFinite(riseMinutes) || !Number.isFinite(setMinutes)) return null;\n\n    \/\/ \\u0415\\u0441\\u043B\\u0438 \\u0437\\u0430\\u043A\\u0430\\u0442 \\u0444\\u043E\\u0440\\u043C\\u0430\\u043B\\u044C\\u043D\\u043E \\u0440\\u0430\\u043D\\u044C\\u0448\\u0435 \\u0432\\u043E\\u0441\\u0445\\u043E\\u0434\\u0430 (\\u043A\\u0440\\u0430\\u0439\\u043D\\u0438\\u0439 \\u0441\\u043B\\u0443\\u0447\\u0430\\u0439\/\\u043F\\u0435\\u0440\\u0435\\u0445\\u043E\\u0434 \\u0447\\u0435\\u0440\\u0435\\u0437 \\u043F\\u043E\\u043B\\u043D\\u043E\\u0447\\u044C),\n    \/\/ \\u0441\\u0447\\u0438\\u0442\\u0430\\u0435\\u043C, \\u0447\\u0442\\u043E \\u0437\\u0430\\u043A\\u0430\\u0442 \\u043E\\u0442\\u043D\\u043E\\u0441\\u0438\\u0442\\u0441\\u044F \\u043A \\u0441\\u043B\\u0435\\u0434\\u0443\\u044E\\u0449\\u0435\\u043C\\u0443 \\u043A\\u0430\\u043B\\u0435\\u043D\\u0434\\u0430\\u0440\\u043D\\u043E\\u043C\\u0443 \\u0434\\u043D\\u044E.\n    let adjustedSet = setMinutes;\n    if (adjustedSet <= riseMinutes) adjustedSet += 1440;\n\n    return riseMinutes + (adjustedSet - riseMinutes) \/ 2;\n  }\n\n  function calculateManualMidpoint() {\n    const rise = timeToMinutes(els.manualRise.value);\n    const set = timeToMinutes(els.manualSet.value);\n\n    if (rise === null || set === null) {\n      setStatus('\\u0423\\u043A\\u0430\\u0436\\u0438\\u0442\\u0435 \\u043A\\u043E\\u0440\\u0440\\u0435\\u043A\\u0442\\u043D\\u043E\\u0435 \\u0432\\u0440\\u0435\\u043C\\u044F \\u0432\\u043E\\u0441\\u0445\\u043E\\u0434\\u0430 \\u0438 \\u0437\\u0430\\u043A\\u0430\\u0442\\u0430.', true);\n      return;\n    }\n\n    const midpoint = midpointBetweenRiseAndSet(rise, set);\n    const clock = minutesToClock(midpoint);\n    els.manualNoon.value = clock.text;\n    setStatus('\\u041F\\u0440\\u0438\\u0431\\u043B\\u0438\\u0436\\u0451\\u043D\\u043D\\u044B\\u0439 \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u044B\\u0439 \\u043F\\u043E\\u043B\\u0434\\u0435\\u043D\\u044C \\u0440\\u0430\\u0441\\u0441\\u0447\\u0438\\u0442\\u0430\\u043D \\u043A\\u0430\\u043A \\u0441\\u0435\\u0440\\u0435\\u0434\\u0438\\u043D\\u0430 \\u043C\\u0435\\u0436\\u0434\\u0443 \\u0432\\u043E\\u0441\\u0445\\u043E\\u0434\\u043E\\u043C \\u0438 \\u0437\\u0430\\u043A\\u0430\\u0442\\u043E\\u043C.');\n  }\n\n  function applyManualData() {\n    const rise = timeToMinutes(els.manualRise.value);\n    const noon = timeToMinutes(els.manualNoon.value);\n    const set = timeToMinutes(els.manualSet.value);\n\n    if (noon === null) {\n      setStatus('\\u0423\\u043A\\u0430\\u0436\\u0438\\u0442\\u0435 \\u043A\\u043E\\u0440\\u0440\\u0435\\u043A\\u0442\\u043D\\u043E\\u0435 \\u0432\\u0440\\u0435\\u043C\\u044F \\u0441\\u043E\\u043B\\u043D\\u0435\\u0447\\u043D\\u043E\\u0433\\u043E \\u043F\\u043E\\u043B\\u0443\\u0434\\u043D\\u044F.', true);\n      return;\n    }\n\n    state.solarNoonMinutes = noon;\n\n    renderResults({\n      sunrise: rise === null ? null : `2000-01-01T${minutesToClock(rise).text}:00+00:00`,\n      solarNoon: `2000-01-01T${minutesToClock(noon).text}:00+00:00`,\n      sunset: set === null ? null : `2000-01-01T${minutesToClock(set).text}:00+00:00`,\n      timezone: '\\u0420\\u0443\\u0447\\u043D\\u043E\\u0439 \\u0440\\u0435\\u0436\\u0438\\u043C',\n      utcOffset: '',\n      sunStatus: 'normal',\n      source: 'manual'\n    });\n\n    setStatus('\\u0420\\u0443\\u0447\\u043D\\u044B\\u0435 \\u0434\\u0430\\u043D\\u043D\\u044B\\u0435 \\u043F\\u0440\\u0438\\u043C\\u0435\\u043D\\u0435\\u043D\\u044B.');\n  }\n\n  els.date.value = browserDateISO();\n\n  els.city.addEventListener('input', onCityInput);\n\n  els.city.addEventListener('keydown', (event) => {\n    if (event.key === 'Escape') closeSuggestions();\n    if (event.key === 'Enter') {\n      const first = els.cityResults.querySelector('button.tsc__suggestion');\n      if (first && !els.cityResults.hidden) {\n        event.preventDefault();\n        first.click();\n      }\n    }\n  });\n\n  document.addEventListener('click', (event) => {\n    if (!root.contains(event.target) || !event.target.closest('.tsc__autocomplete')) {\n      closeSuggestions();\n    }\n  });\n\n  els.date.addEventListener('change', () => {\n    state.dateWasChanged = true;\n    if (state.location) calculateFromApi();\n  });\n\n  els.geolocate.addEventListener('click', useGeolocation);\n  els.calculate.addEventListener('click', calculateFromApi);\n  els.customSolar.addEventListener('input', updateCustomConverter);\n  els.midpoint.addEventListener('click', calculateManualMidpoint);\n  els.applyManual.addEventListener('click', applyManualData);\n})();\n<\/script>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<!-- dce invisible element b2275d7 --><style>\n\n        input {\n            text-align: center;\n        }\n        form {\n            margin-top: 20px;\n            text-align: center\n        }\n        table {\n            width: 500px;\n            margin: 0 auto;\n        }\n    <\/style>\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0441\u0445\u043e\u0434\u0430, \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0434\u043d\u044f \u0438 \u0437\u0430\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u0430\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0434\u043d\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0413\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0414\u0430\u0442\u0430 \u2316 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0410\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0421\u043e\u043b\u043d\u0446\u0435 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0412\u043e\u0441\u0445\u043e\u0434 \u2014 \u0418\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c \u2014 \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0421\u043e\u043b\u043d\u0446\u0430 \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"inline_featured_image":false,"footnotes":""},"class_list":["post-1633","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430 - \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/torsunov.ru\/en\/raschyot-vremeni-voshoda\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430 - \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430\" \/>\n<meta property=\"og:description\" content=\"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0441\u0445\u043e\u0434\u0430, \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0434\u043d\u044f \u0438 \u0437\u0430\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u0430\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0434\u043d\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0413\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0414\u0430\u0442\u0430 \u2316 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0410\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0421\u043e\u043b\u043d\u0446\u0435 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0412\u043e\u0441\u0445\u043e\u0434 \u2014 \u0418\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c \u2014 \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0421\u043e\u043b\u043d\u0446\u0430 \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/torsunov.ru\/en\/raschyot-vremeni-voshoda\/\" \/>\n<meta property=\"og:site_name\" content=\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-26T15:45:14+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"2 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/torsunov.ru\\\/raschyot-vremeni-voshoda\\\/\",\"url\":\"https:\\\/\\\/torsunov.ru\\\/raschyot-vremeni-voshoda\\\/\",\"name\":\"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430 - \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/torsunov.ru\\\/#website\"},\"datePublished\":\"2023-03-21T12:57:42+00:00\",\"dateModified\":\"2026-08-26T15:45:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/torsunov.ru\\\/raschyot-vremeni-voshoda\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/torsunov.ru\\\/raschyot-vremeni-voshoda\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/torsunov.ru\\\/raschyot-vremeni-voshoda\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u0413\u043b\u0430\u0432\u043d\u0430\u044f\",\"item\":\"https:\\\/\\\/torsunov.ru\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/torsunov.ru\\\/#website\",\"url\":\"https:\\\/\\\/torsunov.ru\\\/\",\"name\":\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430\",\"description\":\"\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043b\u0435\u043a\u0446\u0438\u0438, \u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0435\u0437\u0434\u043e\u043a \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u0430\u043c\u0430\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.\",\"publisher\":{\"@id\":\"https:\\\/\\\/torsunov.ru\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/torsunov.ru\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/torsunov.ru\\\/#organization\",\"name\":\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430\",\"url\":\"https:\\\/\\\/torsunov.ru\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/torsunov.ru\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/torsunov.ru\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/logo.png\",\"contentUrl\":\"https:\\\/\\\/torsunov.ru\\\/wp-content\\\/uploads\\\/2023\\\/02\\\/logo.png\",\"width\":527,\"height\":90,\"caption\":\"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430\"},\"image\":{\"@id\":\"https:\\\/\\\/torsunov.ru\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430 - \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/torsunov.ru\/en\/raschyot-vremeni-voshoda\/","og_locale":"en_US","og_type":"article","og_title":"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430 - \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430","og_description":"\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435. \u041a\u0430\u043b\u044c\u043a\u0443\u043b\u044f\u0442\u043e\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u0442 \u0430\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u0432\u0440\u0435\u043c\u044f \u0432\u043e\u0441\u0445\u043e\u0434\u0430, \u0438\u0441\u0442\u0438\u043d\u043d\u043e\u0433\u043e \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u0443\u0434\u043d\u044f \u0438 \u0437\u0430\u043a\u0430\u0442\u0430 \u0434\u043b\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u0442\u043e\u0447\u043a\u0438 \u0438 \u0434\u0430\u0442\u044b, \u0430 \u0437\u0430\u0442\u0435\u043c \u043f\u0435\u0440\u0435\u0441\u0447\u0438\u0442\u0430\u0435\u0442 \u0440\u0435\u0436\u0438\u043c \u0434\u043d\u044f \u0432 \u043c\u0435\u0441\u0442\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. \u0413\u043e\u0440\u043e\u0434 \u0438\u043b\u0438 \u043d\u0430\u0441\u0435\u043b\u0451\u043d\u043d\u044b\u0439 \u043f\u0443\u043d\u043a\u0442 \u0414\u0430\u0442\u0430 \u2316 \u041e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u044c \u043c\u043e\u0451 \u043c\u0435\u0441\u0442\u043e\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0420\u0430\u0441\u0441\u0447\u0438\u0442\u0430\u0442\u044c \u0410\u0441\u0442\u0440\u043e\u043d\u043e\u043c\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0421\u043e\u043b\u043d\u0446\u0435 \u0432 \u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u0439 \u043c\u0435\u0441\u0442\u043d\u043e\u0441\u0442\u0438 \u0412\u043e\u0441\u0445\u043e\u0434 \u2014 \u0418\u0441\u0442\u0438\u043d\u043d\u044b\u0439 \u0441\u043e\u043b\u043d\u0435\u0447\u043d\u044b\u0439 \u043f\u043e\u043b\u0434\u0435\u043d\u044c \u2014 \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0432\u044b\u0441\u043e\u0442\u0430 \u0421\u043e\u043b\u043d\u0446\u0430 \u043d\u0430\u0434 \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u043e\u043c [&hellip;]","og_url":"https:\/\/torsunov.ru\/en\/raschyot-vremeni-voshoda\/","og_site_name":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430","article_modified_time":"2026-08-26T15:45:14+00:00","twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"2 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/torsunov.ru\/raschyot-vremeni-voshoda\/","url":"https:\/\/torsunov.ru\/raschyot-vremeni-voshoda\/","name":"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430 - \u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430","isPartOf":{"@id":"https:\/\/torsunov.ru\/#website"},"datePublished":"2023-03-21T12:57:42+00:00","dateModified":"2026-08-26T15:45:14+00:00","breadcrumb":{"@id":"https:\/\/torsunov.ru\/raschyot-vremeni-voshoda\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/torsunov.ru\/raschyot-vremeni-voshoda\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/torsunov.ru\/raschyot-vremeni-voshoda\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u0413\u043b\u0430\u0432\u043d\u0430\u044f","item":"https:\/\/torsunov.ru\/"},{"@type":"ListItem","position":2,"name":"\u0420\u0430\u0441\u0447\u0451\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u0432\u043e\u0441\u0445\u043e\u0434\u0430"}]},{"@type":"WebSite","@id":"https:\/\/torsunov.ru\/#website","url":"https:\/\/torsunov.ru\/","name":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430","description":"\u0417\u0434\u0435\u0441\u044c \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u043b\u0435\u043a\u0446\u0438\u0438, \u0447\u0438\u0442\u0430\u0442\u044c \u043c\u0430\u0442\u0435\u0440\u0438\u0430\u043b\u044b, \u0443\u0437\u043d\u0430\u0432\u0430\u0442\u044c \u0440\u0430\u0441\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u043f\u043e\u0435\u0437\u0434\u043e\u043a \u0438 \u043f\u0440\u043e\u0432\u043e\u0434\u0438\u0442\u044c \u0440\u0430\u0441\u0447\u0435\u0442 \u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u0421\u0430\u043c\u0430\u044f \u0430\u043a\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f.","publisher":{"@id":"https:\/\/torsunov.ru\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/torsunov.ru\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/torsunov.ru\/#organization","name":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430","url":"https:\/\/torsunov.ru\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/torsunov.ru\/#\/schema\/logo\/image\/","url":"https:\/\/torsunov.ru\/wp-content\/uploads\/2023\/02\/logo.png","contentUrl":"https:\/\/torsunov.ru\/wp-content\/uploads\/2023\/02\/logo.png","width":527,"height":90,"caption":"\u041e\u0444\u0438\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0430\u0439\u0442 \u041e\u043b\u0435\u0433\u0430 \u0413\u0435\u043d\u043d\u0430\u0434\u044c\u0435\u0432\u0438\u0447\u0430 \u0422\u043e\u0440\u0441\u0443\u043d\u043e\u0432\u0430"},"image":{"@id":"https:\/\/torsunov.ru\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/pages\/1633","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/comments?post=1633"}],"version-history":[{"count":30,"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/pages\/1633\/revisions"}],"predecessor-version":[{"id":24420,"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/pages\/1633\/revisions\/24420"}],"wp:attachment":[{"href":"https:\/\/torsunov.ru\/en\/wp-json\/wp\/v2\/media?parent=1633"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}