Перетворіть часову позначку Unix у час у JavaScript


1157

Я зберігаю час у базі даних MySQL як часова мітка Unix, яка надсилається до деякого коду JavaScript. Як я можу отримати лише час від цього?

Наприклад, у форматі HH / MM / SS.


5
Просто помножте на 1000, оскільки часові позначки JS знаходяться в мілісекундах, а PHP - за секунди.
ankr

Ось дуже корисне посилання з різним форматом дати: timestamp.online/article/… Комбінуйте з множенням на 1000, і це буде виконано!
Кевін Лемер

Відповіді:


1731

let unix_timestamp = 1549312452
// Create a new JavaScript Date object based on the timestamp
// multiplied by 1000 so that the argument is in milliseconds, not seconds.
var date = new Date(unix_timestamp * 1000);
// Hours part from the timestamp
var hours = date.getHours();
// Minutes part from the timestamp
var minutes = "0" + date.getMinutes();
// Seconds part from the timestamp
var seconds = "0" + date.getSeconds();

// Will display time in 10:30:23 format
var formattedTime = hours + ':' + minutes.substr(-2) + ':' + seconds.substr(-2);

console.log(formattedTime);

Для отримання додаткової інформації щодо об'єкта Date, зверніться до MDN або специфікації ECMAScript 5 .


114
Мультиплікація @nickf є тривіальною для сучасних процесорів - конкатенація рядків зажадає набагато більше роботи!
Альнітак

4
З'єднання повинно складатися з читання пам'яті та запису пам'яті. Як би хтось спроектував щось, що вимагає чогось простого, наприклад, додавання і зробити це складніше, ніж багатоплановий ... попросити дитину об'єднатися, і вони можуть ... багатоскладність складніше ... плюс пам'ять викладається для лінійної роботи anyawyas ... Чи може хтось надати посилання на коментар @nickf?

29
Насправді він відображатиме час у форматі '10: 2: 2 ', оскільки він не додає додаткових 0 до значень нижче 10.
Fireblaze

16
@ user656925 - Множення включає числа, конкатенація включає рядки. Комп'ютери обробляють числа набагато ефективніше, ніж рядки. Коли конкатенація рядків робиться, на задньому плані відбувається багато управління пам'яттю. (Однак, якщо ви все-таки робите конкатенацію рядків, то включення декількох зайвих символів в одну з рядків може бути насправді дешевше в середньому, ніж один процесор, який потрібен для множення двох чисел разом.)
Brilliand

6
Обчислення чисел @Stallman - це найважливіше, що роблять комп'ютери, і вони надзвичайно ефективні при цьому як в пам'яті, так і в процесі виконання. Коментар Брілліанда вище є актуальним, хоча сама заключна частина коментаря ІМХО є абсолютно хибною.
Альнітак

297

function timeConverter(UNIX_timestamp){
  var a = new Date(UNIX_timestamp * 1000);
  var months = ['Jan','Feb','Mar','Apr','May','Jun','Jul','Aug','Sep','Oct','Nov','Dec'];
  var year = a.getFullYear();
  var month = months[a.getMonth()];
  var date = a.getDate();
  var hour = a.getHours();
  var min = a.getMinutes();
  var sec = a.getSeconds();
  var time = date + ' ' + month + ' ' + year + ' ' + hour + ':' + min + ':' + sec ;
  return time;
}
console.log(timeConverter(0));


для HH / MM / SS просто використовуйте останні три змінні, і цей час буде місцевим часом, але якщо ви хочете отримати час UTC, просто використовуйте методи getUTC. Ось код.
shomrat

36
Я скористався цим рішенням, але змінив його, щоб хвилини і секунди відображалися як: 03 або: 09 замість: 3 або: 9, як так:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189

3
Помилка: getMonth()повертає число місяця між 0 і 11, тому a.getMonth() - 1неправильно.
jcampbell1

195

JavaScript працює в мілісекундах, тому спочатку доведеться конвертувати часову позначку UNIX з секунд в мілісекунди.

var date = new Date(UNIX_Timestamp * 1000);
// Manipulate JavaScript Date object here...

80

Я є частиною Date.format()бібліотеки Якоба Райт , яка реалізує форматування дати JavaScript у стилі функції PHP date().

new Date(unix_timestamp * 1000).format('h:i:s')

12
Я знаю, що це було гарною відповіддю через кілька днів, але в наші дні розширення рідних js-об'єктів є анти-закономірністю.
Петро

3
Він не працює (більше?) У вузлі js format is not a function. Але це , мабуть , працює: stackoverflow.com/a/34015511/7550772
ibodi

71

Використання:

var s = new Date(1504095567183).toLocaleDateString("en-US")
console.log(s)
// expected output "8/30/2017"  

і на час:

var s = new Date(1504095567183).toLocaleTimeString("en-US")
console.log(s)
// expected output "3:19:27 PM"

див. Date.prototype.toLocaleDateString ()


Це команда отримати дату (M / D / YYYY), а не час (HH / MM / SS) відповідно до запиту.
Вольфганг

2
лише примітка, номер "1504095567183" є unix_timestamp * 1000
camillo777

1
Крім того, toLocaleStringвключає як дату, так і час.
Шон

56

Ось найкоротше рішення для однолінійного форматування секунд як hh:mm:ss:

/**
 * Convert seconds to time string (hh:mm:ss).
 *
 * @param Number s
 *
 * @return String
 */
function time(s) {
    return new Date(s * 1e3).toISOString().slice(-13, -5);
}

console.log( time(12345) );  // "03:25:45"

Метод Date.prototype.toISOString()повертає час у спрощеному розширеному форматі ISO 8601 , який завжди становить 24 або 27 символів (тобто YYYY-MM-DDTHH:mm:ss.sssZабо ±YYYYYY-MM-DDTHH:mm:ss.sssZвідповідно). Часовий пояс завжди є нульовим зміщенням UTC.

Примітка. Це рішення не потребує сторонніх бібліотек і підтримується у всіх сучасних браузерах та JavaScript.


Я вставлю вашу функцію в консоль Chrome: / Навіть у вашій загадці це показує 01:02:00 для мене! Пробував на Firefox, такі ж результати. Дуже дивно ... Я майже впевнений, що це тому, що я GMT + 1!
Стів Чамайлард

Я запропонував редагувати вашу відповідь, яка ігнорує будь-який часовий пояс, тому вона завжди відображатиме правильне відформатоване значення!
Стів Чамайлард

1
@SteveChamaillard Дякую, Стів. Ви мали рацію, toTimeStringне працювали добре з часовими поясами. На жаль, ваша редакція була відхилена ще до того, як я її побачив. Однак я б запропонував використовувати toISOStringнатомість, оскільки toGMTStringзастарілий і може повертати різні результати на різних платформах.
VisioN

Ще коротше з ES6: нехай час = s => нова дата (s * 1e3) .toISOString (). Slice (-13, -5)
SamGoody

28

Я б подумав про використання бібліотеки на зразок momentjs.com , що робить це дуже просто:

На основі часової позначки Unix:

var timestamp = moment.unix(1293683278);
console.log( timestamp.format("HH/mm/ss") );

На основі рядка дати MySQL:

var now = moment("2010-10-10 12:03:15");
console.log( now.format("HH/mm/ss") );

3
Ще однією перевагою moment.js (або подібних ліфтів) буде підтримка їх відносного часу для повідомлень типу "6 годин тому".
мартн

У ваших console.logприкладах мене плутали з приводу формату через /, але це мені дуже допомогло.
NetOperator Wibby

Моя часова марка у форматі UTC. Будь-яку зміну мені потрібно зробити для цього? Як я можу їсти / вечора?
кодек

moment.js - це надмірний набір за такі дрібні речі, які вплинуть на вашу ефективність. Використовуйте натомість методи, пор. Відповідь Дана Альботеану
Робін Мітраль

22

Мітка часу UNIX - це кількість секунд з 00:00:00 UTC 1 січня 1970 року (згідно Вікіпедії ).

Аргумент об’єкта Date у Javascript - це кількість мілісекунд з 00:00:00 UTC 1 січня 1970 року (згідно з документацією на Javascript W3Schools ).

Дивіться код нижче, наприклад:

    function tm(unix_tm) {
        var dt = new Date(unix_tm*1000);
        document.writeln(dt.getHours() + '/' + dt.getMinutes() + '/' + dt.getSeconds() + ' -- ' + dt + '<br>');

    }

tm(60);
tm(86400);

дає:

1/1/0 -- Thu Jan 01 1970 01:01:00 GMT+0100 (Central European Standard Time)
1/0/0 -- Fri Jan 02 1970 01:00:00 GMT+0100 (Central European Standard Time)

19

найкоротший однолінійний варіант для форматування секунд у год: мм: сс: варіант:

console.log(new Date(1549312452 * 1000).toISOString().slice(0, 19).replace('T', ' '));
// "2019-02-04 20:34:12"


1
при використанні цього з часовими позначками PHP unix я чомусь отримую +
keanu_reeves

2
@keanu_reeves - звучить так, ніби ви знаходитесь у східному часовому поясі США, а часові позначки - UTC. Спробуйте видалити .slice (0,19), і я думаю, що ви побачите часовий пояс результату Z (зулу).
bitfiddler

17

Використовуючи Moment.js , ви можете отримати час та дату таким чином:

var dateTimeString = moment(1439198499).format("DD-MM-YYYY HH:mm:ss");

І ви можете отримати лише час, використовуючи це:

var timeString = moment(1439198499).format("HH:mm:ss");

Чи знаєте ви, як це зробити назад, як перетворення цього формату DD-MM-YYYY HH: mm: ss на щось подібне 1439198499 ??
Кемат Рочі

Привіт Кемат, це можна зробити через цей момент заяви ('2009-07-15 00:00:00'). Unix ()
Пітер Т.

Моя часова марка у форматі UTC. Якась різниця мені для цього потрібно зробити? Як я можу їсти / вечора?
кодек

Ви можете легко конвертувати часову позначку на дату введення моментуJS, ви оформили
Laeeq

15

Проблема з вищезгаданими рішеннями полягає в тому, що якщо година, хвилина або секунда має лише одну цифру (тобто 0-9), час був би неправильним, наприклад, це може бути 2: 3: 9, але це, швидше, 02: 03:09

Згідно з цією сторінкою, здається, краще рішення використовувати метод "toLocaleTimeString" Дата.


5
для більшості веб-рішень це найбільш правильна відповідь, оскільки він використовує локальну форму клієнта, наприклад, формат 24h проти 12h am / pm. Для часового рядка ви б тоді використали:date.toLocaleTimeString()
Бачі

1
З toTimeStringметодом це не станеться . Перевірте тут: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Інший спосіб - від дати ISO 8601 .

var timestamp = 1293683278;
var date = new Date(timestamp * 1000);
var iso = date.toISOString().match(/(\d{2}:\d{2}:\d{2})/)
alert(iso[1]);


Я отримую "Об'єкт ... не має методу" toISOString ""
Aviram Netanel

Моя часова марка у форматі UTC. Якась різниця мені для цього потрібно зробити? Як я можу їсти / вечора?
кодек

13

У мить ви повинні використовувати часову позначку unix:

var dateTimeString = moment.unix(1466760005).format("DD-MM-YYYY HH:mm:ss");

10

На основі відповіді @ shomrat, ось фрагмент, який автоматично записує подібний час дати (трохи схожий на дату StackOverflow для відповідей:) answered Nov 6 '16 at 11:51:

today, 11:23

або

yersterday, 11:23

або (якщо інший, але той самий рік, ніж сьогодні)

6 Nov, 11:23

або (якщо інший рік, ніж сьогодні)

6 Nov 2016, 11:23

function timeConverter(t) {     
    var a = new Date(t * 1000);
    var today = new Date();
    var yesterday = new Date(Date.now() - 86400000);
    var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
    var year = a.getFullYear();
    var month = months[a.getMonth()];
    var date = a.getDate();
    var hour = a.getHours();
    var min = a.getMinutes();
    if (a.setHours(0,0,0,0) == today.setHours(0,0,0,0))
        return 'today, ' + hour + ':' + min;
    else if (a.setHours(0,0,0,0) == yesterday.setHours(0,0,0,0))
        return 'yesterday, ' + hour + ':' + min;
    else if (year == today.getFullYear())
        return date + ' ' + month + ', ' + hour + ':' + min;
    else
        return date + ' ' + month + ' ' + year + ', ' + hour + ':' + min;
}

9

Сучасне рішення, яке не потребує бібліотеки в 40 Кб:

Intl.DateTimeFormat - це некультурно -імперіалістичний спосіб форматування дати / часу.

// Setup once
var options = {
    //weekday: 'long',
    //month: 'short',
    //year: 'numeric',
    //day: 'numeric',
    hour: 'numeric',
    minute: 'numeric',
    second: 'numeric'
},
intlDate = new Intl.DateTimeFormat( undefined, options );

// Reusable formatter
var timeStamp = 1412743273;
console.log( intlDate.format( new Date( 1000 * timeStamp ) ) );

Щодо "некультурно-імперіалістичного шляху" : Ви не маєте на увазі "некультурний та неімперіалістичний шлях" ?
Пітер Мортенсен

На жаль, цей метод не сумісний із Safari.
Стівен С.

9

Моя часова марка отримується з бекенда PHP. Я спробував усі вищевказані методи, і це не вийшло. Потім я натрапив на підручник, який працював:

var d =val.timestamp;
var date=new Date(+d); //NB: use + before variable name

console.log(d);
console.log(date.toDateString());
console.log(date.getFullYear());
console.log(date.getMinutes());
console.log(date.getSeconds());
console.log(date.getHours());
console.log(date.toLocaleTimeString());

наведені вище методи дадуть ці результати

1541415288860
Mon Nov 05 2018 
2018 
54 
48 
13
1:54:48 PM

Існує маса методів, які прекрасно працюють із часовими позначками. Перерахуйте їх усіх


8
function getTIMESTAMP() {
  var date = new Date();
  var year = date.getFullYear();
  var month = ("0" + (date.getMonth() + 1)).substr(-2);
  var day = ("0" + date.getDate()).substr(-2);
  var hour = ("0" + date.getHours()).substr(-2);
  var minutes = ("0" + date.getMinutes()).substr(-2);
  var seconds = ("0" + date.getSeconds()).substr(-2);

  return year + "-" + month + "-" + day + " " + hour + ":" + minutes + ":" + seconds;
}

//2016-01-14 02:40:01

Добре працює. Дякую
Влад

6

Зверніть увагу на нульову проблему з деякими відповідями. Наприклад, мітка часу 1439329773буде помилково перетворена в12/08/2015 0:49 .

Я б запропонував використовувати наступне для подолання цього питання:

var timestamp = 1439329773; // replace your timestamp
var date = new Date(timestamp * 1000);
var formattedDate = ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
console.log(formattedDate);

Зараз результати:

12/08/2015 00:49

5
// Format value as two digits 0 => 00, 1 => 01
function twoDigits(value) {
   if(value < 10) {
    return '0' + value;
   }
   return value;
}

var date = new Date(unix_timestamp*1000);
// display in format HH:MM:SS
var formattedTime = twoDigits(date.getHours()) 
      + ':' + twoDigits(date.getMinutes()) 
      + ':' + twoDigits(date.getSeconds());

Я не думаю, що вам потрібна додаткова, окрема функція, щоб отримати номер з проміжним нулем, коли це необхідно - дивіться мою відповідь внизу.
trejder

2
@trejder, у вашому прикладі ви розмножуєте логіку, в той час як з додатковою функцією ви маєте її в одному місці. Також ви запускаєте функтон дати (наприклад, getHours ()) завжди два рази, перебуваючи тут - це одноразовий дзвінок. Ви ніколи не можете дізнатись, наскільки важка функція бібліотеки, яку потрібно повторно виконати (однак я вважаю, що це світло для дат).
walv

4
function timeConverter(UNIX_timestamp){
 var a = new Date(UNIX_timestamp*1000);
     var hour = a.getUTCHours();
     var min = a.getUTCMinutes();
     var sec = a.getUTCSeconds();
     var time = hour+':'+min+':'+sec ;
     return time;
 }


4

Ви можете використовувати наступну функцію для перетворення часової позначки у HH:MM:SSформат:

var convertTime = function(timestamp, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    var date = timestamp ? new Date(timestamp * 1000) : new Date();
    return [
        pad(date.getHours()),
        pad(date.getMinutes()),
        pad(date.getSeconds())
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

Не передаючи роздільник, він використовує :як роздільник (за замовчуванням):

time = convertTime(1061351153); // --> OUTPUT = 05:45:53

Якщо ви хочете використовувати /як роздільник, просто передайте його як другий параметр:

time = convertTime(920535115, '/'); // --> OUTPUT = 09/11/55

Демо

var convertTime = function(timestamp, separator) {
    var pad = function(input) {return input < 10 ? "0" + input : input;};
    var date = timestamp ? new Date(timestamp * 1000) : new Date();
    return [
        pad(date.getHours()),
        pad(date.getMinutes()),
        pad(date.getSeconds())
    ].join(typeof separator !== 'undefined' ?  separator : ':' );
}

document.body.innerHTML = '<pre>' + JSON.stringify({
    920535115 : convertTime(920535115, '/'),
    1061351153 : convertTime(1061351153, ':'),
    1435651350 : convertTime(1435651350, '-'),
    1487938926 : convertTime(1487938926),
    1555135551 : convertTime(1555135551, '.')
}, null, '\t') +  '</pre>';

Дивіться також цю скрипку .


3

 function getDateTimeFromTimestamp(unixTimeStamp) {
        var date = new Date(unixTimeStamp);
        return ('0' + date.getDate()).slice(-2) + '/' + ('0' + (date.getMonth() + 1)).slice(-2) + '/' + date.getFullYear() + ' ' + ('0' + date.getHours()).slice(-2) + ':' + ('0' + date.getMinutes()).slice(-2);
      }

    var myTime = getDateTimeFromTimestamp(1435986900000);
    console.log(myTime); // output 01/05/2000 11:00


Це не часова марка Unix: 1435986900000 / Це часова марка Unix: 1435986900
Orici

це рішення працює для мене, але як я можу взяти такий місяць, як лютий березень квітня замість числа?
абідінберкай

2

Якщо ви хочете перетворити тривалість часу Unix в реальну годину, хвилини та секунди, ви можете використовувати наступний код:

var hours = Math.floor(timestamp / 60 / 60);
var minutes = Math.floor((timestamp - hours * 60 * 60) / 60);
var seconds = Math.floor(timestamp - hours * 60 * 60 - minutes * 60 );
var duration = hours + ':' + minutes + ':' + seconds;

1
function getDateTime(unixTimeStamp) {

    var d = new Date(unixTimeStamp);
    var h = (d.getHours().toString().length == 1) ? ('0' + d.getHours()) : d.getHours();
    var m = (d.getMinutes().toString().length == 1) ? ('0' + d.getMinutes()) : d.getMinutes();
    var s = (d.getSeconds().toString().length == 1) ? ('0' + d.getSeconds()) : d.getSeconds();

    var time = h + '/' + m + '/' + s;

    return time;
}

var myTime = getDateTime(1435986900000);
console.log(myTime); // output 01/15/00

1

Код нижче також містить тризначні мілісексуали, ідеально підходять для префіксів журналу консолі:

const timeStrGet = date => {
    const milliSecsStr = date.getMilliseconds().toString().padStart(3, '0') ;
    return `${date.toLocaleTimeString('it-US')}.${milliSecsStr}`;
};

setInterval(() => console.log(timeStrGet(new Date())), 299);



1

Відповідь, надана @Aron, працює, але це не спрацювало для мене, оскільки я намагався перетворити часову позначку починаючи з 1980 року. Тому я вніс декілька змін, як описано нижче

function ConvertUnixTimeToDateForLeap(UNIX_Timestamp) {
    var dateObj = new Date(1980, 0, 1, 0, 0, 0, 0);
    dateObj.setSeconds(dateObj.getSeconds() + UNIX_Timestamp);
    return dateObj;  
}

document.body.innerHTML = 'TimeStamp : ' + ConvertUnixTimeToDateForLeap(1269700200);

Тож якщо у вас є позначка часу, починаючи з іншого десятиліття або близько того, просто використовуйте це. Це врятувало мені багато головного болю.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.