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