Здравствуйте! Я работаю над реализацией функции для форматирования времени в JavaScript без использования сторонних библиотек. Мне необходимо преобразовать время в формате UTC (например, "2024-12-24T14:00:00Z") в локальное время для часового пояса GMT+2. Вот код функции, который я использую: <pre><code class="javascript">function formatTime(dateString) { const date = new Date(dateString); const timezoneOffsetHours = 2; // GMT+2 const hours = (date.getUTCHours() + timezoneOffsetHours) % 24; const minutes = date.getUTCMinutes(); const formattedHours = String(hours).padStart(2, '0'); const formattedMinutes = String(minutes).padStart(2, '0'); return `${formattedHours}:${formattedMinutes}`; }</code></pre> Когда я передаю строку "2024-12-24T14:00:00Z", я ожидаю получить результат "16:00". Однако функция возвращает неправильное значение, отстающее примерно на 10 часов. Я установил, что входная строка формата UTC (с суффиксом Z) корректна, и проверил системный часовой пояс: локальное время настроено правильно. Не могу понять, почему расчёт времени происходит неверно. Возможно, я неправильно работаю с UTC или смещением. Буду признателен за любые советы или примеры, которые помогут решить эту проблему. Спасибо!
Здравствуйте! Проблема в вашем коде связана с тем, как вы обрабатываете часовой пояс. Ваша функция корректно принимает строку с временной меткой в формате UTC, однако к полученным часам UTC вы добавляете смещение GMT+2, не учитывая, что это смещение влияет также на начало нового суток. Это может привести к неправильному вычислению времени, особенно когда результат выходит за пределы 24 часов. Чтобы правильно сделать преобразование из UTC в локальное время GMT+2, необходимо учитывать также и часы. Давайте немного изменим вашу функцию: ```javascript function formatTime(dateString) { const date = new Date(dateString); const timezoneOffsetHours = 2; // GMT+2 // Получаем общее количество миллисекунд с начала эпохи const utcTime = date.getTime(); // Применяем смещение в миллисекундах const localTime = new Date(utcTime + timezoneOffsetHours * 60 * 60 * 1000); // Получаем часы и минуты const hours = localTime.getUTCHours(); const minutes = localTime.getUTCMinutes(); const formattedHours = String(hours).padStart(2, '0'); const formattedMinutes = String(minutes).padStart(2, '0'); return `${formattedHours}:${formattedMinutes}`; } // Пример использования console.log(formatTime("2024-12-24T14:00:00Z")); // Ожидаемый вывод: "16:00" ``` В данной реализации мы: 1. Сначала создаем объект `Date` из строки с временем `dateString`. Это будет время в UTC. 2. Получаем общее время в миллисекундах с помощью `getTime()`. 3. Затем добавляем смещение для GMT+2 (в миллисекундах) к полученному времени. 4. Создаём новый объект `Date` из скорректированного времени и получаем часы и минуты. Этот подход правильно обрабатывает добавление смещения часового пояса и решает вашу проблему. Теперь, передавая строку "2024-12-24T14:00:00Z", вы должны получить "16:00", как и ожидали.
Основная проблема вашего кода заключается в том, что он пытается работать с объектом Date как с UTC-временем, но использует метод getUTCHours() вместо метода getHours(), который учитывает текущее смещение часового пояса.