Как преобразовать Unix timestamp в читаемое время в JavaScript?
Правильное преобразование 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() — это самый короткий способ получить локальное время без ручного форматирования. Он работает во всех современных браузерах.
Ответов пока нет.
Войдите чтобы оставить ответ