a

Câu hỏi Làm thế nào để bạn có được một dấu thời gian trong JavaScript?


Làm thế nào tôi có thể nhận được một dấu thời gian trong JavaScript?

Một cái gì đó tương tự như dấu thời gian của Unix, có nghĩa là, một số duy nhất đại diện cho thời gian và ngày hiện tại. Hoặc là một số hoặc một chuỗi.


3367
2017-10-21 09:29


gốc


Làm thế nào để có được một dấu thời gian 64bit trong JS? - Alexander Mills
@AlexanderMills Vì JavaScript không hỗ trợ số nguyên 64 bit, bạn sẽ phải nhận hai số nguyên 32 bit. Đặt một câu hỏi khác. - wizzwizz4


Các câu trả lời:


Ngắn & Snazzy:

+ new Date()

Một nhà điều hành đơn nhất như plus kích hoạt valueOf phương pháp trong Date đối tượng và nó trả về dấu thời gian (không có bất kỳ thay đổi nào).

Chi tiết:

Trên hầu hết các trình duyệt hiện tại bạn có thể sử dụng Date.now() để có dấu thời gian UTC trong mili giây; một ngoại lệ đáng chú ý cho điều này là IE8 và trước đó (xem bảng tương thích).

Bạn có thể dễ dàng thực hiện một shim cho điều này, mặc dù:

if (!Date.now) {
    Date.now = function() { return new Date().getTime(); }
}

Để có dấu thời gian trong giây, bạn có thể dùng:

Math.floor(Date.now() / 1000)

Hoặc cách khác bạn có thể sử dụng:

Date.now() / 1000 | 0

Mà nên được nhanh hơn một chút, nhưng cũng ít có thể đọc được (cũng xem câu trả lời này).

Tôi khuyên bạn nên sử dụng Date.now() (với khả năng tương thích shim). Nó tốt hơn một chút vì nó ngắn hơn và không tạo mới Date vật. Tuy nhiên, nếu bạn không muốn có tính tương thích tối đa và tối đa, bạn có thể sử dụng phương thức "cũ" để nhận dấu thời gian mili giây:

new Date().getTime()

Sau đó bạn có thể chuyển đổi thành giây như sau:

Math.round(new Date().getTime()/1000)

Và bạn cũng có thể sử dụng valueOf phương pháp mà chúng tôi đã trình bày ở trên:

new Date().valueOf()

Dấu thời gian tính bằng mili giây

var timeStampInMs = window.performance && window.performance.now && window.performance.timing && window.performance.timing.navigationStart ? window.performance.now() + window.performance.timing.navigationStart : Date.now();

console.log(timeStampInMs, Date.now());


4159
2017-10-21 09:32



Một ngoại lệ đáng chú ý khác là node.js. Tôi đến đây từ Google tìm cách làm tương tự trong nút - Milan Babuškov
Sẽ không Date.now() / 1000 | 0 bị từ Vấn đề năm 2038? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496 - gengkev
hoặc thậm chí, w / o sử dụng Math.floor .. ~~(Date.now() / 1000) - code ninja
@ MilanBabuškov nhưng node.js không hỗ trợ Date.now() - OrangeDog
Trong khi +new Data là thông minh, nó không thể đọc được bởi các nhà phát triển khác. Date.now() là rõ ràng hơn và đảm bảo mọi người khác biết điều gì đang xảy ra. - Harry Sadler


Tôi thích điều này, bởi vì nó là nhỏ:

+new Date

Tôi cũng thích điều này, bởi vì nó chỉ là ngắn và tương thích với các trình duyệt hiện đại và hơn 500 người đã bỏ phiếu cho rằng nó tốt hơn:

Date.now()

432
2018-02-18 00:33



Tùy chọn này là một ý tưởng tồi. Nó dễ bị bỏ qua, trông giống như một lỗi đánh máy, và trong thực tế dựa vào một tác dụng phụ của ngôn ngữ. Tôi thấy mã xấu. - inanutshellus
@Billy Khi tôi nhớ lại nó, tôi tính toán dấu thời gian trong hai giải pháp được đề xuất 1M lần mỗi lần và tính thời gian chạy trung bình. Tôi đã chạy nó trong Firefox và Chrome, với getTime nhanh hơn trong cả hai trình duyệt. Điều đó nói rằng, ngay cả khi nó (nhẹ) chậm hơn tôi chọn new Date().getTime(). May mắn cho tôi, giải pháp nhanh hơn đã là giải pháp dễ đọc! - inanutshellus
Đồng ý với @ FabrícioMatté. Hành vi của nhà điều hành đơn nhất có thể không thô sơ, nhưng nếu bạn chưa đánh lừa nó, đừng mong đợi có thể hoạt động hiệu quả trong nhiều nhóm. - Jason T Featheringham
@Niklaus Đó là vì bạn đang nối nó vào một chuỗi khác. Trong trường hợp đó, new Date().toString() được gọi là. - kirb
tò mò là gì +nhà điều hành làm để làm cho nó đi ra như một chuỗi? - Grundizer


JavaScript hoạt động với số mili giây kể từ kỷ nguyên trong khi hầu hết các ngôn ngữ khác hoạt động với giây. Bạn có thể làm việc với mili giây nhưng ngay sau khi bạn chuyển một giá trị để nói PHP, các hàm gốc PHP có thể sẽ thất bại. Vì vậy, để chắc chắn tôi luôn luôn sử dụng giây, không phải mili giây.

Điều này sẽ cung cấp cho bạn một dấu thời gian Unix (tính bằng giây):

var unix = Math.round(+new Date()/1000);

Điều này sẽ cung cấp cho bạn mili giây kể từ kỷ nguyên (không phải dấu thời gian Unix):

var milliseconds = new Date().getTime();

230
2018-05-11 22:27



PHP sẽ hoạt động tốt với mili giây, vì nó sử dụng chính nó với hàm microtime (). - Nico Burns
Trong khi microtime () hiện diện, hầu hết các hàm liên quan đến thời gian trong php mong đợi dấu thời gian sẽ tính bằng giây và không phải là mili giây. Hơn nữa là microtime () trả về một float (nếu bạn chuyển đúng), trong đó phần thập phân là các phân số của một giây (chính xác đến micro giây), trong khi newDate (). GetTime () trả về một int mà nó chỉ đếm mili giây kể từ kỷ nguyên. Ví dụ (php) nếu bạn gọi tầng (microtime (true)), điều này có hiệu quả giống như thời gian gọi (), tính bằng giây và không phải là micro hoặc mili giây. Chia cho 1000 như trên là giải pháp dễ nhất cho việc này. - gregghz
Thay vì tròn, hãy dùng sàn. 700 ms vẫn không phải là toàn bộ thứ hai - Anagmate


var time = Date.now || function() {
  return +new Date;
};

time();

126
2017-10-21 10:05



Tại sao || nhà điều hành? Date.now () không có sẵn trên tất cả các trình duyệt không? - Chris Noe
Rõ ràng là không, tôi tìm thấy mã trong modulejs - Staale
Date.now () là từ JavaScript 1.5 và không được hỗ trợ trên IE 8. - Søren Løvborg
Các công cụ chưa được cập nhật để hỗ trợ phương thức Date.now có thể hoạt động xung quanh sự vắng mặt của nó bằng cách sử dụng shim sau: if (! Date.now) {Date.now = function now () {return + (new Date); }; } - Per Quested Aronsson
IE là ung thư toàn bộ. - SkuraZZ


Tôi cung cấp nhiều giải pháp với mô tả trong câu trả lời này. Vui lòng đặt câu hỏi nếu có bất kỳ điều gì không rõ ràng
PS: thật đáng buồn một người nào đó đã sáp nhập điều này vào câu trả lời hàng đầu mà không đưa ra tín dụng.


Giải pháp nhanh chóng và bẩn:

Date.now() /1000 |0

Cảnh báo: nó có thể phá vỡ vào năm 2038 và trả lại số âm nếu bạn thực hiện |0 ma thuật. Sử dụng Math.floor() thay vào đó vào thời điểm đó


95
2017-07-12 07:15



| 0 tương tự như Math.floor () vì nó là một thao tác bit (không hoạt động với các phao). thông thường nó thậm chí còn nhanh hơn Math.floor () vì nó không phải là một cuộc gọi hàm, nó là một toán tử javascript nguyên gốc. - GottZ
Date.now() tài liệu tham khảo: developer.mozilla.org/en-US/docs/JavaScript/Reference/… - Web_Designer
@Christophe tại sao bạn nghĩ vậy? vì bản sửa lỗi IE? ngoại trừ một phần của nó khá đơn giản và tùy biến tôi nghĩ. - GottZ
polyfills / shims không phức tạp. Họ là kết quả của việc phải hỗ trợ 9 phiên bản trình duyệt khác nhau và ngành công nghiệp quyết định chọn tiêu chuẩn nào họ chấp nhận và họ chỉ tạo nên những tiêu chuẩn nào. - rlemon
Để tham khảo nhỏ gọn nhất bạn có thể nhận được là new Date/1e3|0. - Derek 朕會功夫


var timestamp = Number(new Date()); // current time as number

69
2017-10-21 13:00





jQuery cung cấp phương pháp riêng của nó để có dấu thời gian:

var timestamp = $.now();

(bên cạnh nó chỉ thực hiện (new Date).getTime() biểu hiện)

REF:  http://api.jquery.com/jQuery.now/


50
2018-03-15 14:19



jQuery cũng sẽ chăm sóc bất kỳ vấn đề tương thích trình duyệt chéo nào với các API JavaScript khác nhau. - Henry Heleine
@VisioN Tôi đã tìm cách thực hiện dấu thời gian trong Node.js. Tôi tìm thấy một câu hỏi javascript trong stackoverflow và tôi nhận được một câu trả lời trong jQuery, mà không giúp đỡ. Javascript và jQuery là hai thứ. Nếu chúng ta đưa ra câu trả lời cho mọi khuôn khổ javascript trên mạng, chúng ta kết thúc với một số câu trả lời có thể vô hạn, điều này trái với triết lý của Q / A trong stackoverflow. Cũng thế: i.stack.imgur.com/Ledgt.gif : D - Pierre Arlaud
@PierreArlaud Bạn đang nói về loại triết lý nào? jQuery là một thế giới Nr. 1 thư viện được viết bằng JavaScript thuần túy, mục tiêu chính là cung cấp các phương thức tiện ích của trình duyệt chéo. Như bạn có thể thấy từ câu trả lời, jQuery sử dụng (new Date).getTime() cách tiếp cận, do đó nó đủ an toàn để sử dụng ngay cả trong IE6, ngược lại, Date.now(). Nếu không, nếu bạn đang phát triển một trang web và sử dụng jQuery tại sao không sử dụng một giải pháp hữu ích ngắn $.now() thay vì giảm thời gian của bạn và tìm kiếm một mã phổ quát trong JS thuần túy. Và điều này ít nhất khác với các câu trả lời nội dung khác được đưa ra ở đây. - VisioN
@VisioN Ai nói javascript cần được sử dụng trong trình duyệt? - Pierre Arlaud
@PierreArlaud Và ai nói rằng câu hỏi này chỉ nói về NodeJS? - VisioN


Chỉ cần thêm lên, đây là một hàm trả về một chuỗi dấu thời gian trong Javascript. Ví dụ: 15:06:38 CH

function displayTime() {
    var str = "";

    var currentTime = new Date()
    var hours = currentTime.getHours()
    var minutes = currentTime.getMinutes()
    var seconds = currentTime.getSeconds()

    if (minutes < 10) {
        minutes = "0" + minutes
    }
    if (seconds < 10) {
        seconds = "0" + seconds
    }
    str += hours + ":" + minutes + ":" + seconds + " ";
    if(hours > 11){
        str += "PM"
    } else {
        str += "AM"
    }
    return str;
}

36
2017-09-21 19:12



OP hỏi về một dấu thời gian nguyên; đây là biểu diễn chuỗi thời gian. - Brad Koch
"tương tự như dấu thời gian của Unix, nghĩa là, một số đại diện cho thời gian hiện tại" - Brad Koch
Tôi đã có một mã để hiển thị thời gian nhưng các phần của Úc cho thấy ngày đầy đủ, kịch bản này đã giúp tôi phá vỡ nó xuống và hiển thị ngay. (+1 cho điều đó) - Syfer


console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch


34
2018-04-30 16:53



Điều này bằng +new Date.. :) - Kenan Sulayman
cứ làm đi Date.now() - Orlando
@Orlando thấy các câu trả lời khác, vấn đề với bây giờ () là hỗ trợ trình duyệt - Christophe
@Christophe chỉ cần thực hiện một polyfill đơn giản, developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - Orlando
@Orlando chính xác, không chỉ làm Date.now () - Christophe


Ngoài các tùy chọn khác, nếu bạn muốn có một định dạng ISO dateformat, bạn có thể lấy nó trực tiếp

console.log(new Date().toISOString());


29
2018-01-29 15:08



Nó không trả lại một số nguyên với câu hỏi được yêu cầu! - Alex Ventura
@AlexVentura với một chuỗi dateformat ISO bạn có thể khởi tạo một đối tượng ngày tháng và trừ đi giữa chúng. Ví dụ: new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z") - Joaquinglezsantos


Tôi chưa thấy

Math.floor(Date.now() / 1000); // current time in seconds

Một cái khác mà tôi chưa thấy là

var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();

22
2018-03-31 08:18



Date.now() /1000 |0 làm như vậy và đã được trả lời trước - GottZ
tốt. tôi chắc chắn đã chỉnh sửa Math.floor() vào nó nhưng chỉ để làm rõ rằng nó có tác dụng tương tự như |0. tôi không muốn làm tổn thương bạn hay bất cứ điều gì. tôi chỉ muốn nói với bạn rằng câu trả lời của bạn theo một cách nào đó đã tồn tại. bằng cách nhìn vào tất cả các câu trả lời nhất định, có một số tầng thông báo đó theo một cách nào đó. - GottZ
Tôi nghĩ rằng nhập toàn bộ thư viện Lodash chỉ để sử dụng _.now() là một chút quá mức cần thiết. Tôi khuyên bạn chỉ nên nhập chức năng Lodash mà bạn cần sử dụng (trong trường hợp này, _.now () trên NPM), nhưng thậm chí họ đã phản đối gói của họ có lợi chỉ bằng cách sử dụng Date.now(). - mgthomas99