Unix zaman damgasını JavaScript'te zamana dönüştürme


1157

Bir Unix zaman damgası olarak MySQL veritabanında zaman saklıyorum ve bazı JavaScript koduna gönderilir. Bundan sadece zamanı nasıl çıkarabilirim?

Örneğin, SS / DD / SS biçiminde.


5
JS zaman damgaları milisaniye cinsinden ve PHP saniyeler içinde yayınladığından 1000 ile çarpın.
ankr

İşte farklı tarih formatı ile çok kullanışlı bir bağlantı: timestamp.online/article/… 1000 ile çarpma ile birleştirin ve işi halledin!
Kevin Lemaire

Yanıtlar:


1732

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 nesnesi hakkında daha fazla bilgi için lütfen MDN veya ECMAScript 5 spesifikasyonuna bakın .


114
@nickf çarpımları modern CPU'larda önemsizdir - dize birleştirme çok daha fazla iş gerektirir !
Alnitak

4
Birleştirme hafızayı okumaktan ve hafızayı yazmaktan ibaret olmalıdır ... Birisi ekleme gibi basit bir şey gerektiren ve çarpma işleminden daha karmaşık hale getirebilecek bir şey tasarlayabilir mi ... bir çocuktan bitiştirmesini isteyin ve yapabilirler ... çok daha zor ... artı bellek doğrusal anyawyas çalışmak üzere düzenlenmiştir ... Birisi @ nickf yorum bir referans sağlayabilir?

29
Aslında 10'un altındaki değerlerden önce fazladan 0 eklemediği için zamanı '10: 2: 2 'formatında
gösterecektir

16
@ user656925 - Çarpma sayıları içerir, birleştirme dizeleri içerir. Bilgisayarlar sayıları dizelerden çok daha verimli kullanırlar. Dize birleştirme tamamlandığında, arka planda çok fazla bellek yönetimi oluyor. (Bununla birlikte, zaten bir dize birleştirme yapıyorsanız, dizelerden birine birkaç ekstra karakter eklemek, aslında iki sayıyı bir araya getirmek için gereken bir işlemci opundan ortalama olarak daha az maliyetli olabilir.)
Brilliand

6
@Stallman sayı hesaplaması, bilgisayarların yaptığı en temel şeydir ve hem bellekte hem de çalışma zamanında son derece verimlidirler. Brilliand'ın yukarıdaki yorumu önemlidir, ancak IMHO yorumunun son kısmı tamamen düzensizdir.
Alnitak

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 için sadece son üç değişkeni kullanın ve bu saat yerel saatinizde olacaktır, ancak UTC saatini almak istiyorsanız getUTC yöntemlerini kullanın. İşte kod.
shomrat

36
Bu çözümü kullandım, ancak dakikalar ve saniyeler yerine: 03 veya: 09 gibi var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
görünecek şekilde ayarladım

3
Hata: getMonth()0 ile 11 arasında bir ay sayısı döndürür, bu nedenle a.getMonth() - 1yanlıştır.
jcampbell1

195

JavaScript milisaniye olarak çalışır, bu nedenle önce UNIX zaman damgasını saniyelerden milisaniyeye dönüştürmeniz gerekir.

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

80

Date.format()PHP'nin date()işlev biçiminde JavaScript tarih biçimlendirmesini uygulayan Jacob Wright'ın kütüphanesinin bir kısmıyım .

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

12
Bir gün içinde iyi bir cevap olduğunu biliyorum, ama bu gün yerli js nesnelerini genişletmek bir anti-desen.
Peter

3
Js düğümünde (artık?) Çalışmıyor format is not a function. Ancak bu görünüşe göre çalışıyor: stackoverflow.com/a/34015511/7550772
ibodi

71

kullanın:

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

ve zaman için:

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

bkz. Date.prototype.toLocaleDateString ()


Bu, istendiği gibi saati (SS / DD / SS) değil, tarihi (E / G / YYYY) almak için kullanılan bir komuttur.
Wolfgang

2
sadece bir not, "1504095567183" sayısı unix_timestamp * 1000
camillo777

1
Ayrıca toLocaleString, hem tarih hem de saat içerir.
Sean

56

Saniyeleri şu şekilde biçimlendirmek için en kısa tek katmanlı çözüm 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"

Yöntem Date.prototype.toISOString(), zamanı her zaman 24 veya 27 karakter uzunluğunda (yani veya sırasıyla) basitleştirilmiş genişletilmiş ISO 8601 biçiminde döndürür . Saat dilimi her zaman sıfır UTC ofsetidir.YYYY-MM-DDTHH:mm:ss.sssZ±YYYYYY-MM-DDTHH:mm:ss.sssZ

Not: Bu çözüm herhangi bir üçüncü taraf kitaplığı gerektirmez ve tüm modern tarayıcılarda ve JavaScript motorlarında desteklenir.


İşlevinizi Chrome'un konsoluna yapıştırıyorum: / Dövüşçünüzde bile benim için 01:02:00 gösteriyor! Firefox'ta denedim, aynı sonuçlar. Çok garip ... GMT + 1 olduğumdan eminim!
Steve Chamaillard

Cevabınız için herhangi bir saat dilimini yok sayan bir düzenleme önerdim, bu yüzden her zaman doğru biçimlendirilmiş değeri gösterecektir!
Steve Chamaillard

1
@SteveChamaillard Teşekkürler Steve. Haklıydın, toTimeStringsaat dilimleri ile iyi çalışmıyordun. Maalesef düzenlemeniz ben görmeden reddedildi. Ancak, kullanımdan kaldırıldığı ve farklı platformlarda farklı sonuçlar döndüğü için toISOStringbunun yerine kullanılmasını öneririm toGMTString.
VisioN

ES6 ile daha da kısa: let time = s => new Date (s * 1e3) .toISOString (). Dilim (-13, -5)
SamGoody

28

Momentjs.com gibi bir kütüphane kullanmayı düşünürdüm , bu gerçekten basittir:

Unix zaman damgasını temel alan:

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

MySQL tarih dizesine dayanarak:

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

3
moment.js'nin (veya benzer kütüphanelerin) diğer bir avantajı, "6 saat önce" gibi mesajlar için nispi süreyi desteklemeleri olacaktır .
martin

Senin içinde console.logörnekler, ben nedeniyle biçimi hakkında karıştı /ama bana çok yardımcı oldu.
NetOperator Wibby

Zaman damgam UTC biçimindedir. Burada bunun için herhangi bir değişiklik yapmam gerekiyor mu? Nasıl am / pm yapabilirim?
codec

moment.js, bu kadar küçük bir şey yapmak için gereğinden fazla abartılıyor ve performansınızı etkileyecek. Bunun yerine yerel yöntemleri kullanın, bkz. Dan Alboteanu'nun cevabı
Robin Métral

22

UNIX zaman damgası, 1 Ocak 1970 tarihinde 00:00:00 UTC saatinden bu yana geçen saniye sayısıdır ( Wikipedia'ya göre) ).

Javascript'teki Date nesnesinin bağımsız değişkeni, 1 Ocak 1970 UTC saatinden bu yana geçen milisaniye sayısıdır ( W3Schools Javascript belgelerine göre) ).

Örneğin aşağıdaki koda bakın:

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

verir:

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

ss: dd: ss: varyant olarak saniyeleri biçimlendirmek için en kısa tek katmanlı çözüm

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


1
PHP unix zaman damgaları ile kullanırken bazı nedenlerden dolayı gerçek zaman + 5 saat olsun: /
keanu_reeves

2
@keanu_reeves - ABD'nin doğu saat dilimindeymişsiniz gibi görünüyor ve zaman damgaları UTC. .Slice (0,19) 'u kaldırmayı deneyin ve sonucun saat diliminin Z (Zulu) olduğunu göreceksiniz.
bitfiddler

17

Moment.js'yi kullanarak şu şekilde tarih ve saat alabilirsiniz:

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

Ve bunu kullanarak sadece zaman kazanabilirsiniz:

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

DD-MM-YYYY SS: dd: ss gibi bir biçime dönüştürmek gibi geriye nasıl yapacağınızı biliyor musunuz 1439198499?
Kemat Rochi

Merhaba Kemat, Bunu bu ifade anıyla yapabilirsiniz ('2009-07-15 00:00:00'). Unix ()
Peter T.

Zaman damgam UTC biçimindedir. Burada bunun için bir fark yaratmam gerekiyor mu? Nasıl am / pm alabilirim?
codec

Zaman damgasını kolayca usign momentJS'ye dönüştürebilirsiniz, bu coderszine.com/convert-timestamp-to-date-using-javascript
Laeeq

15

Yukarıda belirtilen çözümlerle ilgili sorun, saat, dakika veya saniye, yalnızca bir basamak (yani 0-9) olduğunda, zamanın yanlış olacağı, örneğin 2: 3: 9 olabilir, ancak 02 olması gerekir: 03:09.

Bu sayfaya göre Date'nin "toLocaleTimeString" yöntemini kullanmak daha iyi bir çözüm gibi görünüyor.


5
çoğu web çözümü için, bu en doğru yanıttır, çünkü müşterinin yerel ayarını kullanır, örneğin 24s ve 12s / am formatı. Bir zaman dizesi için şunu kullanırsınız:date.toLocaleTimeString()
Bachi

1
Bu toTimeStringyöntemle olmayacak . Buradan kontrol edin: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Başka bir yol - ISO 8601 tarihinden itibaren.

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


"Object ... 'toISOString'" yöntemine sahip değilim
Netanel

Zaman damgam UTC biçimindedir. Burada bunun için bir fark yaratmam gerekiyor mu? Nasıl am / pm alabilirim?
codec

13

Şu anda unix zaman damgasını kullanmalısınız:

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

10

@ Shomrat'ın cevabına dayanarak, tarih saatini otomatik olarak bu şekilde yazan bir snippet (StackOverflow'un cevapların tarihine biraz benzer:) answered Nov 6 '16 at 11:51:

today, 11:23

veya

yersterday, 11:23

veya (farklı ama bugünden aynı yıl ise)

6 Nov, 11:23

veya (bugünden bir yıl sonra)

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 KB kitaplığa ihtiyaç duymayan modern çözüm:

Intl.DateTimeFormat , bir tarihi / saati biçimlendirmenin kültürel olarak emperyalist olmayan yoludur.

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

İlişkin "olmayan kültürel emperyalist şekilde" sen demek Do: "-kültürel olmayan ve non-emperyalist bir şekilde" ?
Peter Mortensen

Ne yazık ki bu yöntem Safari ile uyumlu değildir.
Stephen S.

9

Zaman damgam bir PHP arka ucundan getiriliyor. Yukarıdaki tüm yöntemleri denedim ve işe yaramadı. Daha sonra çalışan bir öğretici ile karşılaştım:

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

yukarıdaki yöntemler bu sonuçları üretecektir

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

Zaman damgalarıyla mükemmel çalışan bir sürü yöntem var. Hepsini listeleyemiyorum


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

İyi çalışıyor. Teşekkür ederim
Vlad

6

Bazı cevaplarda sıfır soruna dikkat edin. Örneğin, zaman damgası 1439329773yanlışlıkla12/08/2015 0:49 .

Bu sorunun üstesinden gelmek için aşağıdakileri kullanmanızı öneririm:

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

Şimdi sonuçları:

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

Gerektiğinde sıfırdan oluşan bir sayı elde etmek için ekstra, ayrı bir işleve ihtiyacınız olduğunu düşünmüyorum - alttaki cevabımı görün.
trejder

2
@trejder, örneğin, mantığı DUPLICATE yaparken ekstra fonksiyonla tek bir yerde var. Ayrıca burada iken tarih işlevini (örneğin getHours ()) her zaman iki kez tetiklersiniz - bu bir kerelik çağrıdır. Bazı kütüphane işlevinin yeniden çalıştırılmasının ne kadar ağır olduğunu asla bilemezsiniz (ancak tarihler için hafif olduğuna inanıyorum).
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

Tarih / Dönem Dönüştürücüsüne Bakın .

Yapmanız gerekir ParseInt, aksi takdirde işe yaramaz:


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;

4

Zaman damganızı HH:MM:SSformata dönüştürmek için aşağıdaki işlevi kullanabilirsiniz :

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

Bir ayırıcıyı geçmeden :, (varsayılan) ayırıcı olarak kullanır :

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

/Ayırıcı olarak kullanmak istiyorsanız , ikinci parametre olarak iletmeniz yeterlidir:

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

gösteri

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

Ayrıca bkz bu Fiddle .


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


Bu bir Unix Zaman Damgası değil: 1435986900000 / Bu bir Unix Zaman Damgası değil: 1435986900
Orici

Bu çözüm benim için çalışıyor, ancak ay yerine Şubat Mar Nis gibi ayı nasıl alabilirim?
abidinberkay

2

Unix zaman süresini gerçek saatlere, dakikalara ve saniyelere dönüştürmek istiyorsanız, aşağıdaki kodu kullanabilirsiniz:

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

Aşağıdaki kod ayrıca konsol günlüğü önekleri için ideal olan 3 basamaklı milisaniyeler sağlar:

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 tarafından verilen cevap işe yarıyor, ancak 1980'den itibaren zaman damgasını dönüştürmeye çalıştığım için benim için işe yaramadı. Bu yüzden aşağıdaki gibi birkaç değişiklik yaptım

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

Bu yüzden, başka bir on yıldan itibaren başlayan bir zaman damganız varsa, bunu kullanın. Benim için başım ağrıyor.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.