Konversi cap waktu Unix ke waktu dalam JavaScript

1159

Saya menyimpan waktu dalam database MySQL sebagai cap waktu Unix dan itu akan dikirim ke beberapa kode JavaScript. Bagaimana saya bisa mendapatkan waktu keluar dari itu?

Misalnya, dalam format HH / MM / SS.

roflwaffle
sumber
5
Hanya kalikan dengan 1000 karena cap waktu JS dalam milidetik dan PHP memberikan dalam hitungan detik.
ankr
Berikut adalah tautan yang sangat berguna dengan format tanggal yang berbeda: timestamp.online/article/... Gabungkan dengan penggandaan dengan 1000 dan ini akan menyelesaikan pekerjaan Anda!
Kevin Lemaire

Jawaban:

1735

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);

Untuk informasi lebih lanjut mengenai objek Date, silakan merujuk ke MDN atau spesifikasi ECMAScript 5 .

Aron Rotteveel
sumber
114
Multiplikasi @nickf sepele pada CPU modern - penggabungan string akan membutuhkan lebih banyak pekerjaan!
Alnitak
4
Rangkaian harus terdiri dari membaca memori dan menulis memori..bagaimana seseorang dapat merancang sesuatu yang mengambil sesuatu yang sederhana seperti menambahkan dan membuatnya lebih rumit daripada perkalian ... meminta seorang anak untuk menggabungkan dan mereka dapat..multiplikasi lebih sulit ... plus memori diletakkan untuk bekerja secara linear anyawyas ... Dapatkah seseorang memberikan referensi ke komentar @nickf?
29
Sebenarnya ini akan menampilkan waktu dalam format '10: 2: 2 ', karena tidak menambah 0 sebelum nilai di bawah 10.
Fireblaze
16
@ user656925 - Perkalian melibatkan angka, penggabungan melibatkan string. Komputer menangani angka jauh lebih efisien daripada string. Ketika penggabungan string dilakukan, ada banyak manajemen memori yang terjadi di latar belakang. (Namun, jika Anda sudah melakukan penggabungan string, memasukkan beberapa karakter tambahan di salah satu string mungkin sebenarnya lebih murah daripada rata-rata satu operasi prosesor yang diperlukan untuk mengalikan dua angka bersamaan.)
Brilliand
6
Perhitungan angka @Stallman adalah hal paling mendasar yang dilakukan komputer, dan mereka sangat efisien dalam hal itu, baik dalam memori maupun runtime. Komentar Brilliand di atas relevan, meskipun IMHO bagian terakhir dari komentarnya benar-benar palsu.
Alnitak
298

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));

Syekh
sumber
untuk HH / MM / SS cukup gunakan tiga variabel terakhir dan ini waktunya akan di waktu lokal Anda tetapi jika Anda ingin mendapatkan waktu UTC hanya menggunakan metode getUTC. Ini kodenya.
shomrat
36
Saya menggunakan solusi ini tetapi mengubahnya sehingga menit dan detik akan muncul sebagai: 03 atau: 09 bukannya: 3 atau: 9, seperti:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189
3
Bug: getMonth()mengembalikan angka bulan antara 0 dan 11, dengan demikian a.getMonth() - 1salah.
jcampbell1
195

JavaScript berfungsi dalam milidetik, jadi pertama-tama Anda harus mengubah cap waktu UNIX dari detik menjadi milidetik.

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

Saya sebagian ke Date.format()perpustakaan Jacob Wright , yang mengimplementasikan format tanggal JavaScript dengan gaya date()fungsi PHP .

new Date(unix_timestamp * 1000).format('h:i:s')
Brad Koch
sumber
12
Saya tahu itu adalah jawaban yang baik dalam beberapa hari, tetapi hari ini memperluas objek js asli adalah anti-pola.
Peter
3
Tidak berfungsi (lagi?) Di simpul js format is not a function. Tapi ini tampaknya berhasil: stackoverflow.com/a/34015511/7550772
ibodi
71

Menggunakan:

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

dan untuk waktu:

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

lihat Date.prototype.toLocaleDateString ()

Dan Alboteanu
sumber
Ini adalah perintah untuk mendapatkan tanggal (M / D / YYYY), bukan waktu (HH / MM / SS) seperti yang diminta.
Wolfgang
2
hanya sebuah catatan, angka "1504095567183" adalah unix_timestamp * 1000
camillo777
1
Selain itu, toLocaleStringsertakan tanggal dan waktu.
Sean
56

Berikut ini adalah solusi satu-liner terpendek untuk memformat detik sebagai 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"

Metode Date.prototype.toISOString()mengembalikan waktu dalam format ISO 8601 diperpanjang yang disederhanakan , yang selalu sepanjang 24 atau 27 karakter (yaitu YYYY-MM-DDTHH:mm:ss.sssZatau ±YYYYYY-MM-DDTHH:mm:ss.sssZmasing - masing). Zona waktu selalu nol offset UTC.

NB: Solusi ini tidak memerlukan perpustakaan pihak ketiga dan didukung di semua browser modern dan mesin JavaScript.

Penglihatan
sumber
Saya menempelkan fungsi Anda di konsol Chrome: / Bahkan di biola Anda itu menunjukkan 01:02:00 untuk saya! Mencoba di Firefox, hasil yang sama. Sangat aneh ... Saya cukup yakin itu karena saya GMT + 1!
Steve Chamaillard
Saya telah menawarkan hasil edit untuk jawaban Anda yang mengabaikan zona waktu apa pun, sehingga akan selalu menampilkan nilai yang diformat dengan benar!
Steve Chamaillard
1
@SteveChamaillard Terima kasih, Steve. Anda benar, toTimeStringtidak bekerja dengan baik dengan zona waktu. Sayangnya hasil edit Anda ditolak sebelum saya melihatnya. Namun, saya menyarankan untuk menggunakannya toISOStringsebagai gantinya, karena toGMTStringsudah usang dan dapat mengembalikan hasil yang berbeda pada platform yang berbeda.
VisioN
Bahkan lebih pendek dengan ES6: biarkan waktu = s => Tanggal baru (s * 1e3) .toISOString (). Slice (-13, -5)
SamGoody
28

Saya akan berpikir tentang menggunakan perpustakaan seperti momentjs.com , yang membuatnya sangat sederhana:

Berdasarkan cap waktu Unix:

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

Berdasarkan pada string tanggal MySQL:

var now = moment("2010-10-10 12:03:15");
console.log( now.format("HH/mm/ss") );
homtg
sumber
3
keuntungan lain dari moment.js (atau lib serupa) adalah dukungan mereka terhadap waktu relatif , untuk pesan seperti "6 jam yang lalu".
martin
Dalam console.logcontoh Anda , saya bingung tentang format karena /, tapi itu banyak membantu saya.
NetOperator Wibby
Stempel waktu saya dalam format UTC. Adakah perubahan yang perlu saya lakukan di sini untuk itu? Bagaimana saya dapat memiliki am / pm?
codec
moment.js adalah menunggu terlalu banyak untuk hal kecil yang harus dilakukan dan akan mempengaruhi kinerja Anda. Gunakan metode asli sebagai gantinya, lih. Jawaban Dan Alboteanu
Robin Métral
22

Stempel waktu UNIX adalah jumlah detik sejak 00:00:00 UTC pada 1 Januari 1970 (menurut Wikipedia ).

Objek Argumen Tanggal dalam Javascript adalah jumlah milidetik sejak 00:00:00 UTC pada 1 Januari 1970 (menurut dokumentasi Javascript W3Schools ).

Lihat kode di bawah ini misalnya:

    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);

memberi:

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)
Grzegorz Gierlik
sumber
19

solusi satu liner terpendek untuk memformat detik sebagai jj: mm: dd: varian:

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

Luis David
sumber
1
ketika menggunakan ini dengan PHP cap waktu unix saya mendapatkan + 5 jam dari waktu yang sebenarnya untuk beberapa alasan: /
keanu_reeves
2
@keanu_reeves - terdengar seperti Anda berada di zona waktu AS bagian timur dan cap waktu UTC. Coba hapus .slice (0,19) dan saya pikir Anda akan melihat zona waktu hasilnya adalah Z (Zulu).
bitfiddler
17

Menggunakan Moment.js , Anda bisa mendapatkan waktu dan tanggal seperti ini:

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

Dan Anda hanya bisa mendapatkan waktu menggunakan ini:

var timeString = moment(1439198499).format("HH:mm:ss");
Peter T.
sumber
Apakah Anda tahu bagaimana melakukannya secara terbalik, seperti mengubah format ini DD-MM-YYYY HH: mm: ss ke sesuatu seperti ini 1439198499 ??
Kemat Rochi
Hai Kemat, Anda dapat melakukannya melalui saat pernyataan ini ('2009-07-15 00:00:00'). Unix ()
Peter T.
Stempel waktu saya dalam format UTC. Adakah perbedaan yang perlu saya buat di sini untuk itu? Bagaimana saya dapat memiliki am / pm?
codec
Anda dapat dengan mudah mengonversi timestamp menjadi tanggal saatJS, Anda checkout coderszine.com/convert-timestamp-to-date-using-javascript
Laeeq
15

Masalah dengan solusi yang disebutkan di atas adalah, bahwa jika jam, menit atau detik, hanya memiliki satu digit (yaitu 0-9), waktunya akan salah, misalnya bisa 2: 3: 9, tetapi seharusnya lebih dari 02: 03:09.

Menurut halaman ini, tampaknya ini merupakan solusi yang lebih baik untuk menggunakan metode "toLocaleTimeString" Date.

Bernie
sumber
5
untuk sebagian besar solusi web, ini adalah jawaban yang paling benar, karena ia menggunakan lokal klien, mis. format 24 jam vs. 12 jam pagi / malam. Untuk string waktu, Anda kemudian akan menggunakan:date.toLocaleTimeString()
Bachi
1
Itu tidak akan terjadi dengan toTimeStringmetode. Periksa di sini: stackoverflow.com/a/35890537/1249581 .
VisioN
14

Cara lain - dari tanggal 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]);

deadrunk
sumber
Saya mendapatkan "Objek ... tidak memiliki metode 'toISOString'"
Aviram Netanel
Stempel waktu saya dalam format UTC. Adakah perbedaan yang perlu saya buat di sini untuk itu? Bagaimana saya dapat memiliki am / pm?
codec
13

Saat ini Anda harus menggunakan cap waktu unix:

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

Berdasarkan jawaban @ shomrat, berikut adalah cuplikan yang secara otomatis menulis datetime seperti ini (sedikit mirip dengan tanggal StackOverflow untuk jawaban:) answered Nov 6 '16 at 11:51:

today, 11:23

atau

yersterday, 11:23

atau (jika tahun berbeda tetapi sama dari hari ini)

6 Nov, 11:23

atau (jika satu tahun dari hari ini)

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;
}
Basj
sumber
9

Solusi modern yang tidak memerlukan perpustakaan 40 KB:

Intl.DateTimeFormat adalah cara imperialistik non-budaya untuk memformat tanggal / waktu.

// 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 ) ) );
Adria
sumber
Mengenai "cara imperialistik non-budaya" : Bukankah maksud Anda "cara non-budaya dan non-imperialistik" ?
Peter Mortensen
Sayangnya metode ini tidak kompatibel dengan Safari.
Stephen S.
9

Stempel waktu saya diambil dari backend PHP. Saya mencoba semua metode di atas dan tidak berhasil. Saya kemudian menemukan tutorial yang berhasil:

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());

metode di atas akan menghasilkan hasil ini

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

Ada banyak metode yang bekerja sempurna dengan cap waktu. Tidak bisa mendaftar semuanya

james ace
sumber
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
synan54
sumber
Bekerja dengan baik. Terima kasih
Vlad
6

Perhatikan nol masalah dengan beberapa jawaban. Misalnya, stempel waktu 1439329773akan secara keliru dikonversi ke12/08/2015 0:49 .

Saya menyarankan untuk menggunakan yang berikut ini untuk mengatasi masalah ini:

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);

Sekarang menghasilkan:

12/08/2015 00:49
TechWisdom
sumber
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());
Fireblaze
sumber
Saya tidak berpikir Anda memerlukan fungsi ekstra dan terpisah, untuk mendapatkan angka dengan nol di belakang, kapan pun ini diperlukan - lihat jawaban saya di bagian bawah.
trejder
2
@trejder, dalam contoh Anda, Anda DUPLICATE logika sementara dengan fungsi tambahan Anda memilikinya di satu tempat. Anda juga memicu fungsi tanggal (mis. GetHours ()) selalu dua kali saat di sini - itu adalah panggilan satu kali. Anda tidak akan pernah tahu seberapa berat beberapa fungsi perpustakaan untuk dieksekusi kembali (namun saya percaya itu ringan untuk tanggal).
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;
 }
Syekh
sumber
4

Lihat Date / Epoch Converter .

Anda perlu ParseInt, jika tidak, tidak akan berhasil:


if (!window.a)
    window.a = new Date();

var mEpoch = parseInt(UNIX_timestamp);

if (mEpoch < 10000000000)
    mEpoch *= 1000;

------
a.setTime(mEpoch);
var year = a.getFullYear();
...
return time;
Syams
sumber
4

Anda dapat menggunakan fungsi berikut untuk mengubah cap waktu Anda menjadi HH:MM:SSformat:

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 : ':' );
}

Tanpa melewati pemisah, ia digunakan :sebagai pemisah (default):

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

Jika Anda ingin menggunakan /sebagai pemisah, cukup berikan sebagai parameter kedua:

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

Demo

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>';

Lihat juga Fiddle ini .

John Slegers
sumber
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

Ashish Gupta
sumber
Ini bukan Timestamp Unix: 1435986900000 / Ini adalah Timestamp Unix: 1435986900
Orici
solusi ini bekerja untuk saya tetapi bagaimana saya bisa mengambil bulan seperti Feb Mar Apr alih-alih angka?
abidinberkay
2

Jika Anda ingin mengonversi durasi waktu Unix menjadi jam nyata, menit, dan detik, Anda bisa menggunakan kode berikut:

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;
milkovsky
sumber
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
Bhaumik Mehta
sumber
1

Kode di bawah ini juga menyediakan milidetik 3 digit, ideal untuk awalan log konsol:

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

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

tivoni
sumber
1

moment.js

mengonversi stempel waktu ke string tanggal dalam js

https://momentjs.com/

moment().format('YYYY-MM-DD hh:mm:ss');
// "2020-01-10 11:55:43"

moment(1578478211000).format('YYYY-MM-DD hh:mm:ss');
// "2020-01-08 06:10:11"

xgqfrms
sumber
pilihan alternatif day.js github.com/iamkun/dayjs
xgqfrms
1

Jawaban yang diberikan oleh @Aron berfungsi, tetapi tidak berhasil bagi saya karena saya mencoba mengubah stempel waktu mulai dari tahun 1980. Jadi saya membuat beberapa perubahan sebagai berikut

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);

Jadi, jika Anda memiliki cap waktu mulai dari satu dekade atau lebih, gunakan saja ini. Ini menyelamatkan banyak sakit kepala bagi saya.

Amey Vartak
sumber