Avatar ·

Как преобразовать Unix timestamp в читаемое время в JavaScript?

Привет всем! Я новичок в JavaScript и работаю над проектом, где получаю данные с API погоды. Сервер возвращает время в виде Unix timestamp (например, 1717189200). Мне нужно отобразить это время пользователю в понятном формате, типа "12:45" или "12:45:30". Я пробовал разные штуки, но ничего не работает. Вот мой код: ```javascript let timestamp = 1717189200; let date = new Date(timestamp); console.log(date); // Выводит что-то странное: Thu Jan 01 1970 03:19:49... ``` Почему я получаю 1970 год? Я думал, что Unix timestamp — это количество секунд с 1 января 1970 года. Но new Date() ожидает миллисекунды, да? Как правильно преобразовать timestamp в нормальное время? Нужно ли учитывать часовой пояс пользователя? Буду благодарен за подробное объяснение с примерами кода. Спасибо! <<>>

Правильное преобразование Unix timestamp в JavaScript

Вы на верном пути! Проблема в том, что new Date() в JavaScript ожидает миллисекунды, а Unix timestamp обычно передаётся в секундах. Поэтому вы получаете дату 1 января 1970 года — это базовое значение плюс небольшое смещение.

Вот основное решение:

let timestamp = 1717189200; // секунды
let date = new Date(timestamp * 1000); // умножаем на 1000 для миллисекунд
console.log(date); // Теперь корректная дата

Форматирование времени

Чтобы вывести только часы и минуты, используйте встроенные методы:

let timestamp = 1717189200;
let date = new Date(timestamp * 1000);

// Локальное время пользователя
let hours = date.getHours();
let minutes = date.getMinutes();
let seconds = date.getSeconds();

// Форматирование с ведущими нулями
let formattedTime = `${hours.toString().padStart(2, '0')}:${minutes.toString().padStart(2, '0')}`;
console.log(formattedTime); // Например, "12:45"

Современный способ: Intl.DateTimeFormat

Рекомендую использовать Intl.DateTimeFormat — он учитывает локаль и часовой пояс пользователя:

let timestamp = 1717189200;
let date = new Date(timestamp * 1000);

let formatter = new Intl.DateTimeFormat('ru-RU', {
    hour: '2-digit',
    minute: '2-digit',
    second: '2-digit',
    timeZoneName: 'short'
});

console.log(formatter.format(date)); // "12:45:30 GMT+3"

Проверка: секунды или миллисекунды?

Некоторые API могут возвращать timestamp в миллисекундах. Как отличить?

  • Если число 10 цифр (например, 1717189200) — это секунды
  • Если число 13 цифр (например, 1717189200000) — это миллисекунды

Универсальный код:

function convertTimestamp(timestamp) {
    // Если timestamp больше 1e12 (миллисекунды), не умножаем
    let date = timestamp > 1e12 ? new Date(timestamp) : new Date(timestamp * 1000);
    return date;
}

Полный пример для вашего API погоды

function formatTimeFromAPI(timestamp) {
    const date = new Date(timestamp * 1000);
    const options = {
        hour: '2-digit',
        minute: '2-digit',
        timeZone: 'Europe/Moscow' // или 'UTC' для универсального времени
    };
    return new Intl.DateTimeFormat('ru-RU', options).format(date);
}

// Использование:
let apiTimestamp = 1717189200;
console.log(formatTimeFromAPI(apiTimestamp)); // "12:45"

Важно: Intl.DateTimeFormat автоматически учитывает часовой пояс браузера пользователя, если не указан конкретный timeZone. Это лучший способ для отображения времени.

<<>>

Альтернативный подход: библиотека moment.js (устарела) и date-fns

Раньше часто использовали moment.js, но сейчас она считается устаревшей. Рекомендую современную лёгкую библиотеку date-fns:

// Установка: npm install date-fns
import { format, fromUnixTime } from 'date-fns';

let timestamp = 1717189200;
let date = fromUnixTime(timestamp); // Преобразует секунды в Date
let formatted = format(date, 'HH:mm:ss');
console.log(formatted); // "12:45:30"

Простой ручной метод без библиотек

Если не хотите подключать библиотеки, можно сделать так:

function unixToTime(seconds) {
    let d = new Date(seconds * 1000);
    return d.toLocaleTimeString('ru-RU', { 
        hour: '2-digit', 
        minute: '2-digit',
        hour12: false // 24-часовой формат
    });
}

console.log(unixToTime(1717189200)); // "12:45"

Метод toLocaleTimeString() — это самый короткий способ получить локальное время без ручного форматирования. Он работает во всех современных браузерах.