Làm cách nào tôi có thể có dấu thời gian trong JavaScript?
Một cái gì đó tương tự như dấu thời gian Unix , 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.
Làm cách nào tôi có thể có dấu thời gian trong JavaScript?
Một cái gì đó tương tự như dấu thời gian Unix , 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.
Câu trả lời:
+ new Date()
Một toán tử đơn nguyên như plus
kích hoạt valueOf
phương thức 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 tất cả các trình duyệt hiện tại, bạn có thể sử dụng Date.now()
để lấy dấu thời gian UTC tính bằng mili giây ; một ngoại lệ đáng chú ý là IE8 trở 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(); }
}
Để lấy dấu thời gian tính bằng giây , bạn có thể sử 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 nhanh hơn một chút, nhưng cũng ít đọc hơn (cũng xem câu trả lời này ).
Tôi sẽ khuyên bạn nên sử dụng Date.now()
(với shim tương thích). Nó tốt hơn một chút vì nó ngắn hơn & không tạo ra một Date
đối tượng mới . Tuy nhiên, nếu bạn không muốn tương thích tối đa và tối đa, bạn có thể sử dụng phương pháp "cũ" để lấy dấu thời gian tính bằng mili giây :
new Date().getTime()
Mà sau đó bạn có thể chuyển đổi thành giây như thế này:
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());
Date.now() / 1000 | 0
bị ảnh hưởng từ những năm 2038 vấn đề Năm ? new Date('Jan 1, 2039') / 1000 | 0 == -2117514496
~~(Date.now() / 1000)
Date.now()
+new Data
thông minh, nó không thể đọc được bởi các nhà phát triển khác. Date.now()
rõ ràng hơn và đảm bảo mọi người khác biết những gì đang xảy ra.
Tôi thích điều này, vì nó nhỏ:
+new Date
Tôi cũng thích điều này, vì nó chỉ 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ình chọn rằng nó tốt hơn:
Date.now()
new Date().getTime()
. May mắn cho tôi, giải pháp nhanh hơn đã là giải pháp rõ ràng!
new Date().toString()
được gọi.
+
vận hành đang làm gì để biến nó thành một chuỗi?
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 khi bạn vượt qua một giá trị để nói PHP, các hàm riêng của PHP có thể sẽ thất bại. Vì vậy, để chắc chắn tôi 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 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 một phần nghìn giây kể từ epoch (không phải dấu thời gian Unix):
var milliseconds = new Date().getTime();
Unix timestamp
vs Seconds since the Epoch
. Không phải hai cái này có nghĩa là giống nhau sao?
var time = Date.now || function() {
return +new Date;
};
time();
Tôi cung cấp nhiều giải pháp với các mô tả trong câu trả lời này. Vui lòng đặt câu hỏi nếu bất cứ điều gì không rõ ràng
PS: thật đáng buồn khi ai đó đã hợp nhất điều này với câu trả lời hàng đầu mà không cung cấp tín dụng.
Giải pháp nhanh và bẩn:
Date.now() /1000 |0
Cảnh báo : nó có thể bị hỏng vào năm 2038 và trả về số âm nếu bạn thực hiện
|0
phép thuật. Sử dụngMath.floor()
thay thế vào thời điểm đó
Math.floor()
giải pháp:
Math.floor(Date.now() /1000);
Một số thay thế kỳ lạ của Derek 朕 會 功夫 được lấy từ các bình luận bên dưới câu trả lời này:
new Date/1e3|0
Polyfill để có được Date.now()
làm việc:
Để làm cho nó hoạt động trong IE, bạn có thể làm điều này (Polyfill từ MDN ):
if (!Date.now) {
Date.now = function now() {
return new Date().getTime();
};
}
Nếu bạn không quan tâm đến thời gian tiết kiệm năm / ngày trong tuần / ngày, bạn có thể loại bỏ nó và sử dụng nó sau năm 2038:
var now = (function () {
var year = new Date(new Date().getFullYear().toString()).getTime();
return function () {
return Date.now() - year
}
})();
Một số đầu ra trông như thế nào:
new Date() Thu Oct 29 2015 08:46:30 GMT+0100 (Mitteleuropäische Zeit ) new Date(now()) Thu Oct 29 1970 09:46:30 GMT+0100 (Mitteleuropäische Zeit )
Tất nhiên nó sẽ phá vỡ thời gian tiết kiệm ánh sáng ban ngày, nhưng tùy thuộc vào những gì bạn đang xây dựng, điều này có thể hữu ích cho bạn nếu bạn cần thực hiện các thao tác nhị phân trên dấu thời gian sau khi int32 sẽ phá vỡ vào năm 2038.
Điều này cũng sẽ trả về giá trị âm nhưng chỉ khi người dùng của PC mà bạn đang chạy mã của bạn đang thay đổi đồng hồ PC của họ ít nhất là đến ngày 31 tháng 12 của năm trước.
Nếu bạn chỉ muốn biết thời gian tương đối kể từ thời điểm mã được chạy qua trước tiên, bạn có thể sử dụng một cái gì đó như thế này:
var relativeTime = (function () {
var start = Date.now();
return function () {
return Date.now() - start
}
})();
Trong trường hợp bạn đang sử dụng jQuery, bạn có thể sử dụng $.now()
như được mô tả trong Tài liệu của jQuery, điều này làm cho polyfill trở nên lỗi thời vì $.now()
bên trong cũng làm điều tương tự:(new Date).getTime()
Nếu bạn hài lòng về phiên bản của jQuery, hãy cân nhắc việc nâng cao câu trả lời này vì tôi không tự mình tìm thấy nó.
Bây giờ một lời giải thích nhỏ về những gì |0
không:
Bằng cách cung cấp |
, bạn bảo người phiên dịch thực hiện thao tác HOẶC nhị phân. Các phép toán bit yêu cầu số tuyệt đối biến kết quả thập phân từ Date.now() / 1000
thành một số nguyên.
Trong quá trình chuyển đổi đó, số thập phân được loại bỏ, dẫn đến kết quả tương tự như sử dụng Math.floor()
nhưng sử dụng ít mã hơn.
Mặc dù được cảnh báo: nó sẽ chuyển đổi gấp đôi 64 bit thành số nguyên 32 bit. Điều này sẽ dẫn đến mất thông tin khi xử lý số lượng lớn. Dấu thời gian sẽ bị hỏng sau năm 2038 do tràn số nguyên 32 bit.
Để biết thêm thông tin về việc Date.now
theo liên kết này: Date.now()
@ MDN
Date.now()
tham khảo: developer.mozilla.org/en-US/docs/JavaScript/Reference/,
new Date/1e3|0
.
jQuery cung cấp phương thức riêng để lấy dấu thời gian:
var timestamp = $.now();
(bên cạnh đó nó chỉ thực hiện (new Date).getTime()
biểu thức)
parseInt
, vì giá trị kết quả sẽ luôn là a Number
.
console.log(new Date().valueOf()); // returns the number of milliseconds since the epoch
+new Date
.. :)
Date.now()
Ngoài các tùy chọn khác, nếu bạn muốn có ISO dạng định dạng, bạn có thể lấy trực tiếp
console.log(new Date().toISOString());
new Date("2017-05-04T07:11:28.940Z") - new Date("2017-05-04T07:11:14.092Z")
Chỉ cần thêm, đây là một hàm để trả về chuỗi dấu thời gian trong Javascript. Ví dụ: 15:06:38 chiều
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;
}
Ngày , một đối tượng gốc trong JavaScript là cách chúng ta nhận được tất cả dữ liệu về thời gian.
Chỉ cần cẩn thận trong JavaScript dấu thời gian phụ thuộc vào bộ máy khách, vì vậy nó không phải là dấu thời gian chính xác 100%. Để có kết quả tốt nhất, bạn cần lấy dấu thời gian từ phía máy chủ .
Dù sao, cách ưa thích của tôi là sử dụng vanilla. Đây là một cách phổ biến để làm điều đó trong JavaScript:
Date.now(); //return 1495255666921
Trong MDN, nó được đề cập như dưới đây:
Phương thức Date.now () trả về số mili giây đã trôi qua kể từ ngày 1 tháng 1 năm 1970 00:00:00 UTC.
Bởi vì now () là một phương thức tĩnh của Date, nên bạn luôn sử dụng nó như Date.now ().
Nếu bạn sử dụng phiên bản dưới ES5, Date.now();
không hoạt động và bạn cần sử dụng:
new Date().getTime();
Một cái tôi chưa thấy
Math.floor(Date.now() / 1000); // current time in seconds
Một cái khác tôi chưa thấy là
var _ = require('lodash'); // from here https://lodash.com/docs#now
_.now();
Date.now() /1000 |0
cũng làm như vậy và đã được trả lời trước đó
Math.floor()
nó nhưng chỉ để làm rõ rằng nó có tác dụng tương tự |0
. tôi không muốn làm tổn thương bạn hoặc 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 đã cho, có một số thông báo sàn theo một cách nào đó.
_.now()
là hơi 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 là _.now () trên NPM ), nhưng ngay cả họ cũng không chấp nhận gói của họ vì chỉ sử dụng Date.now()
.
Các Date.getTime()
phương pháp có thể được sử dụng với một tinh chỉnh nhỏ:
Giá trị được trả về bởi phương thức getTime là số mili giây kể từ ngày 1 tháng 1 năm 1970 00:00:00 UTC.
Chia kết quả cho 1000 để lấy dấu thời gian Unix, floor
nếu cần:
(new Date).getTime() / 1000
Các Date.valueOf()
phương pháp có chức năng tương đương với Date.getTime()
, mà làm cho nó có thể sử dụng các toán số học trên đối tượng ngày để đạt được kết quả giống hệt nhau. Theo tôi, cách tiếp cận này ảnh hưởng đến khả năng đọc.
new Date().getTime() / 1000
()
sau new Date
và .getTime()
kể từ đó /
sẽ chuyển đối tượng Date thành một số.
Mã Math.floor(new Date().getTime() / 1000)
có thể được rút ngắn thành new Date / 1E3 | 0
.
Xem xét để bỏ qua việc getTime()
gọi trực tiếp và sử dụng | 0
như là một thay thế cho Math.floor()
chức năng. Cũng cần nhớ 1E3
là một từ tương đương ngắn hơn 1000
(chữ hoa E được ưu tiên hơn chữ thường để chỉ 1E3
là hằng số).
Kết quả là bạn nhận được như sau:
var ts = new Date / 1E3 | 0;
console.log(ts);
"Math.floor(new Date().getTime()/1000)".length == 37;
"new Date/1E3|0".length == 14;
37 -14 = 23 byte;
Math.floor()
bằng cách |0
làm cho mã này "rõ ràng và dễ hiểu". Giải thích cho tôi đâu là điểm để lưu 1 byte bằng cách thay thế 1000
bằng 1E3
. Chuyện này thật vớ vẩn. Tôi thấy mã xấu.
Hôm nay - 2020.04,23 tôi thực hiện các thử nghiệm cho các giải pháp được lựa chọn. Tôi đã thử nghiệm trên MacOs High Sierra 10.13.6 trên Chrome 81.0, Safari 13.1, Firefox 75.0
Date.now()
(E) nhanh nhất trên Chrome và Safari và nhanh thứ hai trên Firefox và đây có lẽ là lựa chọn tốt nhất cho giải pháp trình duyệt chéo nhanhperformance.now()
(G), điều đáng ngạc nhiên, nhanh hơn 100 lần so với các giải pháp khác trên Firefox nhưng chậm nhất trên ChromeKết quả cho chrome
Bạn có thể thực hiện kiểm tra trên máy của mình TẠI ĐÂY
Mã được sử dụng trong các bài kiểm tra được trình bày dưới đây đoạn trích
performance.now()
vì nó được cho là chính xác nhất về mặt tem.
privacy.reduceTimerPrecision
làm tròn kết quả đến mili giây gần nhất. Nó cũng được bật theo mặc định nhưng có thể bị tắt. developer.mozilla.org/en-US/docs/Web/API/Performance/now
Tôi rất khuyên bạn nên sử dụng moment.js
. Để có được số mili giây kể từ thời kỳ UNIX, hãy làm
moment().valueOf()
Để có được số giây kể từ thời kỳ UNIX, hãy làm
moment().unix()
Bạn cũng có thể chuyển đổi thời gian như vậy:
moment('2015-07-12 14:59:23', 'YYYY-MM-DD HH:mm:ss').valueOf()
Tôi làm việc đó mọi lúc. Không có ý định chơi chữ.
Để sử dụng moment.js
trong trình duyệt:
<script src="moment.js"></script>
<script>
moment().valueOf();
</script>
Để biết thêm chi tiết, bao gồm các cách cài đặt và sử dụng MomentJS khác, hãy xem tài liệu của họ
Đối với dấu thời gian có độ phân giải micro giây, có performance.now
:
function time() {
return performance.now() + performance.timing.navigationStart;
}
Điều này có thể ví dụ năng suất 1436140826653.139
, trong khi Date.now
chỉ cung cấp 1436140826653
.
Bạn chỉ có thể sử dụng
var timestamp = new Date().getTime();
console.log(timestamp);
để có được dấu thời gian hiện tại. Không cần phải làm gì thêm.
Đây là một hàm đơn giản để tạo dấu thời gian theo định dạng: mm / dd / yy hh: mi: ss
function getTimeStamp() {
var now = new Date();
return ((now.getMonth() + 1) + '/' +
(now.getDate()) + '/' +
now.getFullYear() + " " +
now.getHours() + ':' +
((now.getMinutes() < 10)
? ("0" + now.getMinutes())
: (now.getMinutes())) + ':' +
((now.getSeconds() < 10)
? ("0" + now.getSeconds())
: (now.getSeconds())));
}
(new (chain (-date) (to-i-s-o-string)))
.
// The Current Unix Timestamp
// 1443534720 seconds since Jan 01 1970. (UTC)
// seconds
console.log(Math.floor(new Date().valueOf() / 1000)); // 1443534720
console.log(Math.floor(Date.now() / 1000)); // 1443534720
console.log(Math.floor(new Date().getTime() / 1000)); // 1443534720
// milliseconds
console.log(Math.floor(new Date().valueOf())); // 1443534720087
console.log(Math.floor(Date.now())); // 1443534720087
console.log(Math.floor(new Date().getTime())); // 1443534720087
// jQuery
// seconds
console.log(Math.floor($.now() / 1000)); // 1443534720
// milliseconds
console.log($.now()); // 1443534720087
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
Bất kỳ trình duyệt nào không được hỗ trợ Date.now, bạn có thể sử dụng trình duyệt này để nhận thời gian ngày hiện tại:
currentTime = Date.now() || +new Date()
Date.now
thực sự tồn tại (và là một hàm), trước khi cố gắng gọi nó : currentTime = typeof Date.now === "function" ? Date.now() : +new Date()
.
Tôi đã học được một cách thực sự thú vị khi chuyển đổi một đối tượng Date đã cho thành dấu thời gian Unix từ mã nguồn của Cookie JQuery vào ngày khác.
Đây là một ví dụ:
var date = new Date();
var timestamp = +date;
Nếu muốn một cách cơ bản để tạo dấu thời gian trong Node.js thì điều này hoạt động tốt.
var time = process.hrtime();
var timestamp = Math.round( time[ 0 ] * 1e3 + time[ 1 ] / 1e6 );
Nhóm của chúng tôi đang sử dụng điều này để phá vỡ bộ đệm trong môi trường localhost. Đầu ra là /dist/css/global.css?v=245521377
nơi 245521377
dấu thời gian được tạo bởi hrtime()
.
Hy vọng điều này có ích, các phương thức trên có thể hoạt động tốt nhưng tôi thấy đây là cách tiếp cận đơn giản nhất cho nhu cầu của chúng tôi trong Node.js.
Điều này dường như làm việc.
console.log(clock.now);
// returns 1444356078076
console.log(clock.format(clock.now));
//returns 10/8/2015 21:02:16
console.log(clock.format(clock.now + clock.add(10, 'minutes')));
//returns 10/8/2015 21:08:18
var clock = {
now:Date.now(),
add:function (qty, units) {
switch(units.toLowerCase()) {
case 'weeks' : val = qty * 1000 * 60 * 60 * 24 * 7; break;
case 'days' : val = qty * 1000 * 60 * 60 * 24; break;
case 'hours' : val = qty * 1000 * 60 * 60; break;
case 'minutes' : val = qty * 1000 * 60; break;
case 'seconds' : val = qty * 1000; break;
default : val = undefined; break;
}
return val;
},
format:function (timestamp){
var date = new Date(timestamp);
var year = date.getFullYear();
var month = date.getMonth() + 1;
var day = date.getDate();
var hours = date.getHours();
var minutes = "0" + date.getMinutes();
var seconds = "0" + date.getSeconds();
// Will display time in xx/xx/xxxx 00:00:00 format
return formattedTime = month + '/' +
day + '/' +
year + ' ' +
hours + ':' +
minutes.substr(-2) +
':' + seconds.substr(-2);
}
};
Khoảnh khắc có thể trừu tượng hóa rất nhiều nỗi đau khi đối phó với Ngày Javascript.
Xem: http://momentjs.com/docs/#/displaying/unix-timestamp/
moment().unix();
moment().valueOf()
. Xem câu trả lời của tôi.
Khi viết bài này, câu trả lời hàng đầu là 9 năm và rất nhiều thứ đã thay đổi kể từ đó - không kém phần quan trọng, chúng tôi có sự hỗ trợ gần như phổ biến cho một giải pháp không hack:
Date.now()
Nếu bạn muốn hoàn toàn chắc chắn rằng điều này sẽ không bị hỏng trong một trình duyệt cổ (trước tức là 9), bạn có thể đặt nó phía sau một tấm séc, như vậy:
const currentTimestamp = (!Date.now ? +new Date() : Date.now());
Điều này sẽ trả về mili giây kể từ thời gian kỷ nguyên, tất nhiên, không phải giây.
cách đơn giản hơn:
var timeStamp=event.timestamp || new Date().getTime();
event
đến. Bạn cần đưa ra một lời giải thích tốt hơn về cách bạn giải quyết nó thay vì bạn viết một câu trả lời. Xin vui lòng!