Почему в JavaScript возникает ошибка с отображением времени?

Здравствуйте! 

Я работаю над реализацией функции для форматирования времени в 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 или смещением.

Буду признателен за любые советы или примеры, которые помогут решить эту проблему.

Спасибо!
  • 24 декабря 2024 г. 20:13
Ответы на вопрос 2
Здравствуйте!

Проблема в вашем коде связана с тем, как вы обрабатываете часовой пояс. Ваша функция корректно принимает строку с временной меткой в формате 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(), который учитывает текущее смещение часового пояса. 

Похожие вопросы