Chuyển đổi dấu thời gian Unix thành thời gian trong JavaScript


1157

Tôi đang lưu trữ thời gian trong cơ sở dữ liệu MySQL dưới dạng dấu thời gian Unix và được gửi đến một số mã JavaScript. Làm thế nào tôi có thể nhận được thời gian ra khỏi nó?

Ví dụ, ở định dạng HH / MM / SS.


5
Chỉ cần nhân với 1000 vì dấu thời gian JS tính bằng mili giây và PHP cung cấp trong vài giây.
ankr

Đây là một liên kết rất hữu ích với định dạng ngày khác nhau: timestamp.online/article/ chủ Kết hợp với phép nhân với 1000 và nó hoàn thành công việc!
Kevin Lemaire

Câu trả lời:


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

Để biết thêm thông tin về đối tượng Ngày, vui lòng tham khảo MDN hoặc đặc tả ECMAScript 5 .


114
Phép nhân @nickf là tầm thường trên các CPU hiện đại - việc nối chuỗi sẽ đòi hỏi nhiều công việc hơn!
Alnitak

4
Sự kết hợp nên bao gồm đọc bộ nhớ và ghi nhớ bộ nhớ..tại sao ai đó có thể thiết kế một thứ gì đó đơn giản như nối thêm và làm cho nó phức tạp hơn nhiều lần ... yêu cầu một đứa trẻ ghép lại và chúng có thể..multiplicaion khó khăn hơn ... cộng với bộ nhớ được đặt ra để hoạt động tuyến tính anyawyas ... Ai đó có thể cung cấp tài liệu tham khảo cho nhận xét @nickf không?

29
Trên thực tế, nó sẽ hiển thị thời gian ở định dạng '10: 2: 2 ', vì nó không thêm 0 trước các giá trị dưới 10.
Fireblaze

16
@ user656925 - Phép nhân liên quan đến số, phép nối liên quan đến chuỗi. Máy tính xử lý số hiệu quả hơn nhiều so với chuỗi. Khi nối chuỗi được thực hiện, có rất nhiều quản lý bộ nhớ đang diễn ra trong nền. (Tuy nhiên, nếu bạn vẫn đang thực hiện nối chuỗi, thì việc thêm một vài ký tự phụ vào một trong các chuỗi thực sự có thể sẽ tốn ít chi phí hơn so với một bộ xử lý mà nó cần để nhân hai số với nhau.)
Brilliand

6
Tính toán số @Stallman là điều cơ bản nhất mà máy tính làm được và chúng cực kỳ hiệu quả với nó, cả về bộ nhớ và thời gian chạy. Nhận xét của Brilliand ở trên có liên quan, mặc dù IMHO phần cuối cùng của bình luận của ông là hoàn toàn không có thật.
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));


đối với HH / MM / SS chỉ cần sử dụng ba biến cuối cùng và đây là thời gian địa phương của bạn, nhưng nếu bạn muốn có thời gian UTC, chỉ cần sử dụng các phương thức getUTC. Đây là mã.
shomrat

36
Tôi đã sử dụng giải pháp này nhưng đã tinh chỉnh nó để phút và giây sẽ hiển thị là: 03 hoặc: 09 thay vì: 3 hoặc: 9, như vậy:var min = a.getMinutes() < 10 ? '0' + a.getMinutes() : a.getMinutes(); var sec = a.getSeconds() < 10 ? '0' + a.getSeconds() : a.getSeconds();
user1985189

3
Lỗi: getMonth()trả về số tháng trong khoảng từ 0 đến 11, do đó a.getMonth() - 1là sai.
jcampbell1

195

JavaScript hoạt động theo mili giây, do đó trước tiên bạn sẽ phải chuyển đổi dấu thời gian UNIX từ giây sang mili giây.

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

80

Tôi là một phần của Date.format()thư viện của Jacob Wright , nơi thực hiện định dạng ngày JavaScript theo kiểu hàm của PHP date().

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

12
Tôi biết Đó là câu trả lời tốt trong một ngày, nhưng ngày nay việc mở rộng các đối tượng js bản địa là một mô hình chống.
Peter

3
Nó không hoạt động (nữa?) Trong nút js format is not a function. Nhưng điều này rõ ràng có tác dụng: stackoverflow.com/a
432015511/7550772

71

Sử dụng:

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

và cho thời gian:

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

xem Date.prototype.toLocaleDateString ()


Đây là lệnh để lấy ngày (M / D / YYYY), không phải thời gian (HH / MM / SS) như yêu cầu.
Wolfgang

2
chỉ cần một ghi chú, số "1504095567183" là unix_timestamp * 1000
camillo777

1
Ngoài ra, toLocaleStringbao gồm cả ngày và thời gian.
Sean

56

Đây là giải pháp một lớp lót ngắn nhất để định dạng giây như 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"

Phương thức Date.prototype.toISOString()trả về thời gian ở định dạng ISO 8601 mở rộng được đơn giản hóa , luôn dài 24 hoặc 27 ký tự (tức là YYYY-MM-DDTHH:mm:ss.sssZhoặc ±YYYYYY-MM-DDTHH:mm:ss.sssZtương ứng). Múi giờ luôn luôn bù UTC.

Lưu ý: Giải pháp này không yêu cầu bất kỳ thư viện của bên thứ ba nào và được hỗ trợ trong tất cả các trình duyệt và công cụ JavaScript hiện đại.


Tôi đang dán chức năng của bạn trong bảng điều khiển của Chrome: / Ngay cả trong fiddle của bạn, nó cũng hiển thị 01:02:00 cho tôi! Đã thử trên Firefox, kết quả tương tự. Rất lạ ... Tôi khá chắc chắn vì đó là GMT + 1!
Steve Chamaillard

Tôi đã cung cấp một chỉnh sửa cho câu trả lời của bạn mà bỏ qua bất kỳ múi giờ nào, vì vậy nó sẽ luôn hiển thị giá trị được định dạng đúng!
Steve Chamaillard

1
@SteveChamaillard Cảm ơn bạn, Steve. Bạn đã đúng, toTimeStringđã không làm việc tốt với múi giờ. Thật không may, chỉnh sửa của bạn đã bị từ chối trước khi tôi nhìn thấy nó. Tuy nhiên, tôi khuyên bạn nên sử dụng toISOStringthay thế, vì toGMTStringkhông dùng nữa và có thể trả về các kết quả khác nhau trên các nền tảng khác nhau.
VisioN

Thậm chí ngắn hơn với ES6: let time = s => new Date (s * 1e3) .toISOString (). Lát (-13, -5)
Samoody

28

Tôi nghĩ về việc sử dụng một thư viện như Momentjs.com , điều này thực sự đơn giản:

Dựa trên dấu thời gian Unix:

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

Dựa trên chuỗi ngày của MySQL:

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

3
một lợi thế khác của khoảnh khắc.js (hoặc libs tương tự) sẽ là sự hỗ trợ của họ về thời gian tương đối , cho các tin nhắn như "6 giờ trước".
martin

Trong console.logví dụ của bạn , tôi đã nhầm lẫn về định dạng do /, nhưng nó đã giúp tôi rất nhiều.
NetOperator Wibby 19/03/2015

Dấu thời gian của tôi là ở định dạng UTC. Bất kỳ thay đổi tôi cần phải thực hiện ở đây cho điều đó? Làm thế nào tôi có thể có sáng / chiều?
mã hóa

Moment.js là waaay quá mức cần thiết cho một việc nhỏ như vậy và sẽ ảnh hưởng đến hiệu suất của bạn. Thay vào đó, hãy sử dụng các phương thức gốc Câu trả lời của Dan Alboteanu
Robin Métral

22

Dấu thời gian UNIX là số giây kể từ 00:00:00 UTC ngày 1 tháng 1 năm 1970 (theo Wikipedia ).

Đối số của đối tượng Date trong Javascript là số milisecond kể từ 00:00:00 UTC ngày 1 tháng 1 năm 1970 (theo tài liệu Javascript của W3Schools ).

Xem mã dưới đây ví dụ:

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

cho:

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

giải pháp một lớp lót ngắn nhất để định dạng giây như hh: mm: ss: biến thể:

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


1
Khi sử dụng điều này với dấu thời gian unix PHP tôi nhận được + 5 giờ so với thời gian thực tế vì một số lý do: /
keanu numeves

2
@keanu numeves - nghe có vẻ như bạn ở múi giờ miền đông Hoa Kỳ và dấu thời gian là UTC. Hãy thử xóa .slice (0,19) và tôi nghĩ bạn sẽ thấy múi giờ của kết quả là Z (Zulu).
bitfiddler

17

Sử dụng Moment.js , bạn có thể nhận được thời gian và ngày như thế này:

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

Và bạn chỉ có thể có thời gian sử dụng điều này:

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

Bạn có biết làm thế nào để làm điều đó ngược lại, như chuyển đổi định dạng này DD-MM-YYYY HH: mm: ss thành một cái gì đó như thế này 1439198499 ??
Kemat Rochi

Xin chào Kemat, Bạn có thể thực hiện điều đó qua thời điểm tuyên bố này ('2009-07-15 00:00:00'). Unix ()
Peter T.

Dấu thời gian của tôi là ở định dạng UTC. Bất kỳ sự khác biệt tôi cần phải làm ở đây cho điều đó? Làm thế nào tôi có thể có sáng / chiều?
mã hóa

Bạn có thể dễ dàng chuyển đổi dấu thời gian để hẹn hò với thời điểm sử dụngJS, bạn kiểm tra coderszine.com/convert-timestamp-to-date-USE-javascript
Laeeq

15

Vấn đề với các giải pháp đã nói ở trên là, nếu giờ, phút hoặc giây, chỉ có một chữ số (tức là 0-9), thì thời gian sẽ sai, ví dụ: có thể là 2: 3: 9, nhưng đúng hơn là 02: 03:09.

Theo trang này , có vẻ như là một giải pháp tốt hơn để sử dụng phương thức "toLocaleTimeString" của Date.


5
đối với hầu hết các giải pháp web, đây là câu trả lời đúng nhất, vì nó sử dụng ngôn ngữ của khách hàng, ví dụ định dạng 24h so với 12 giờ sáng / chiều. Đối với chuỗi thời gian, sau đó bạn sẽ sử dụng:date.toLocaleTimeString()
Bachi

1
Nó sẽ không xảy ra với toTimeStringphương pháp. Kiểm tra tại đây: stackoverflow.com/a/35890537/1249581 .
VisioN

14

Một cách khác - từ ngày 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]);


Tôi nhận được "Đối tượng ... không có phương pháp 'toISOString'"
Aviram Netanel

Dấu thời gian của tôi là ở định dạng UTC. Bất kỳ sự khác biệt tôi cần phải làm ở đây cho điều đó? Làm thế nào tôi có thể có sáng / chiều?
mã hóa

13

Trong thời điểm này, bạn phải sử dụng dấu thời gian unix:

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

10

Dựa trên câu trả lời của @ shomrat, đây là đoạn trích tự động ghi datetime như thế này (hơi giống với ngày của StackOverflow để trả lời answered Nov 6 '16 at 11:51:):

today, 11:23

hoặc là

yersterday, 11:23

hoặc (nếu khác nhưng cùng năm so với ngày hôm nay)

6 Nov, 11:23

hoặc (nếu một năm nữa so với hôm nay)

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

Giải pháp hiện đại không cần thư viện 40 KB:

Intl.DateTimeFormat là cách phi văn hóa phi văn hóa để định dạng ngày / giờ.

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

Về "cách phi văn hóa" : Bạn không có nghĩa là "cách phi văn hóa và phi đế quốc" ?
Peter Mortensen

Thật không may, phương pháp này không tương thích với Safari.
Stephen S.

9

Dấu thời gian của tôi đang được tìm nạp từ phụ trợ PHP. Tôi đã thử tất cả các phương pháp trên và nó không hoạt động. Sau đó tôi đã bắt gặp một hướng dẫn có hiệu quả:

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

các phương pháp trên sẽ tạo ra kết quả này

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

Có một loạt các phương pháp hoạt động hoàn hảo với dấu thời gian. Không thể liệt kê tất cả


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

Hoạt động tốt. Cảm ơn bạn
Vlad

6

Hãy chú ý đến vấn đề không với một số câu trả lời. Ví dụ: dấu thời gian 1439329773sẽ bị chuyển đổi nhầm thành12/08/2015 0:49 .

Tôi sẽ đề nghị sử dụng những điều sau đây để khắc phục vấn đề này:

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

Bây giờ kết quả trong:

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

Tôi không nghĩ rằng bạn cần một chức năng bổ sung, riêng biệt, để có được một số có dấu 0, bất cứ khi nào cần thiết - hãy xem câu trả lời của tôi ở phía dưới.
trejder

2
@trejder, trong ví dụ của bạn, bạn GIẢI QUYẾT logic trong khi với chức năng bổ sung, bạn có nó ở một nơi. Ngoài ra, bạn kích hoạt ngày functon (ví dụ getHours ()) luôn hai lần trong khi ở đây - đó là cuộc gọi một lần. Bạn không bao giờ có thể biết mức độ nặng của một số chức năng thư viện sẽ được thực hiện lại (tuy nhiên tôi tin rằng nó nhẹ cho ngày).
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

Xem bộ chuyển đổi ngày / kỷ nguyên .

Bạn cần ParseInt, nếu không nó sẽ không hoạt động:


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

Bạn có thể sử dụng chức năng sau để chuyển đổi dấu thời gian của mình sang HH:MM:SSđịnh dạng:

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

Không vượt qua dấu phân cách, nó sử dụng :như dấu phân cách (mặc định):

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

Nếu bạn muốn sử dụng /như một dấu phân cách, chỉ cần chuyển nó làm tham số thứ hai:

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

Bản giới thiệu

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

Xem thêm Fiddle này .


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


Đây không phải là Dấu thời gian Unix: 1435986900000 / Đây là Dấu thời gian Unix: 1435986900
Orici

giải pháp này hiệu quả với tôi nhưng làm thế nào tôi có thể lấy tháng như tháng hai tháng tư thay vì số?
abidinberkay

2

Nếu bạn muốn chuyển đổi thời lượng Unix thành giờ, phút và giây thực, bạn có thể sử dụng mã sau:

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

Mã dưới đây cũng cung cấp millisec 3 chữ số, lý tưởng cho tiền tố nhật ký giao diện điều khiển:

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

Câu trả lời được đưa ra bởi @Aron hoạt động, nhưng nó không hiệu quả với tôi khi tôi đang cố gắng chuyển đổi dấu thời gian bắt đầu từ năm 1980. Vì vậy, tôi đã thực hiện một vài thay đổi như sau

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

Vì vậy, nếu bạn có dấu thời gian bắt đầu từ một thập kỷ khác hoặc lâu hơn, chỉ cần sử dụng cái này. Nó tiết kiệm rất nhiều đau đầu cho tôi.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.