Thời gian tính bằng mili giây kể từ kỷ nguyên trong thiết bị đầu cuối


40

Làm cách nào để tôi có được thời gian kể từ kỷ nguyên, tính bằng mili giây, trong thiết bị đầu cuối OSX?

Tương đương với Linux / Ubuntu là date +%s.%N:

Linux $ date +%s.%N
1403377762.035521859

Mà không hoạt động trong thiết bị đầu cuối OSX của tôi:

OSX $ date +%s.%N
1403377800.N

Câu trả lời:


45

Các datechương trình trong OS X khác với coreutils GNU của datechương trình. Bạn có thể cài đặt coreutils (bao gồm cả ngày gnu), sau đó bạn sẽ có phiên bản datehỗ trợ mili giây.

Vì việc cài đặt từ nguồn có thể gây rắc rối cho người dùng OS X gốc, tôi khuyên bạn nên sử dụng Homebrew .

Để cài đặt các công cụ này bằng Homebrew, hãy chạy oneliner này trong thiết bị đầu cuối của bạn:

ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Homebrew hiện đã được cài đặt (nên làm theo các đề xuất của người cài đặt sau khi cài đặt). Bây giờ chúng tôi sẽ cài đặt coreutils bằng cách sử dụng brew.

brew install coreutils

Như cài đặt nói, tất cả các lệnh đã được cài đặt với tiền tố 'g' (ví dụ: gdate, gcat, gln, v.v.). Nếu bạn thực sự cần sử dụng các lệnh này với tên thông thường của chúng, bạn có thể thêm thư mục "gnubin" vào PATH ( ~/.bash_profile) của mình như:

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

Bây giờ bạn có thể chạy

gdate +%s.%N

và điều này sẽ tạo ra thời gian của bạn kể từ kỷ nguyên tính bằng mili giây.


3
Tốt đẹp. Tôi thậm chí không phải thêm đường dẫn, gdateđã được cài đặt /usr/local/bin/gdate.
Adam Matan

Đó là những gì bạn mong đợi. Tất cả các nhị phân được cài đặt với tiền tố g. Trong đường dẫn tôi đã cung cấp tất cả các gnu-coreutils giống nhau mà không có tiền tố g. Vì vậy, nếu bạn thêm nó vào đường dẫn của mình như PATH = "/ usr / local / opt / coreutils / libexec / gnubin: $ PATH", nó sẽ thay thế bản gốc. Vì vậy, OS X datetrở thành GNU date(thay vì gdate)
CousinCocaine

Tốt mà nó làm việc ra.
CousinCocaine

3
Về mặt kỹ thuật, +%s.%Nđịnh dạng cho độ chính xác đến từng giây, chứ không phải mili giây. Sau khi tôi sử dụng brew để cài đặt gdate, tôi đã kiểm tra trang web để xem liệu mili giây có sẵn hay không. Không phải vậy. Nó cũng không nói rằng độ chính xác %Ncó thể được chỉ định, nhưng dù sao tôi cũng đã thử nó. Tôi thấy rằng lệnh để giảm số giây xuống chính xác đến mili giây (nghĩa là ba chữ số thập phân) là gdate +%s.%3N.
LS

9

Trong OS X, chỉ chạy date +%svì OS X không hỗ trợ độ chính xác cao hơn dateđầu ra của nó và bất kỳ độ chính xác vượt quá nào không được hỗ trợ bởi biểu diễn bên trong sẽ bị cắt giảm xuống vô cùng.

Nếu bạn muốn đầu ra mili giây, bạn có thể sử dụng lệnh sau, mặc dù đầu ra chỉ được sửa bằng cách nối các số 0 thay vì thêm độ chính xác do lý do đã nói ở trên. Sau đây không xuất ra mili giây chính xác trên các hệ thống hỗ trợ độ chính xác cần thiết.

echo $(($(date +'%s * 1000 + %-N / 1000000')))

Nguồn cho lệnh trên: Unix.SE - Cách nhận mili giây kể từ Unix epoch

Nếu bạn chỉ muốn một lệnh nối thêm số không đúng trong OS X, bạn có thể sử dụng:

date +%s000

OS X không hỗ trợ %-N, do đó không làm gì cả (và có thể gây rắc rối nếu biến shell $Nđược đặt). Chỉ cần sử dụng date +%s000(hoặc date +%s.000nếu bạn muốn dấu thập phân).
Gordon Davisson

@Gordon Vâng, tôi đã đề cập đến vấn đề này, nhưng nếu OP đang tìm kiếm một giải pháp di động hoạt động thành công trên các hệ thống có khả năng chính xác đó, lệnh trên sẽ hoạt động. Tất nhiên bạn chỉ có thể nối các số không vào đầu ra nhưng sao chép nó sang các hệ thống khác có thể hỗ trợ độ chính xác bổ sung sẽ không lý tưởng.
grg

Ah tôi thấy. Nhưng vì datelệnh của OS X chỉ đi %-Nqua N, nên nó có thể can thiệp vào tính toán. Hãy thử cài đặt N=7000000000000000000, sau đó thử lệnh ... Đây là trường hợp không thể thực hiện trong thực tế, nhưng tôi cảm thấy an toàn hơn với những thứ không phụ thuộc vào môi trường.
Gordon Davisson

@Gordon Thật vậy, việc đặt biến sẽ phá vỡ nó. Tôi cho rằng biến cụ thể có thể được đặt lại ngay trước khi lệnh được chạy, nhưng đặt lại các biến như thế là điều mà mọi kịch bản tốt nên làm trước khi chạy lệnh, dù sao đi nữa, chỉ trong trường hợp. Tất nhiên, tất cả đều dựa trên giả định của tôi rằng OP muốn có một câu trả lời được chỉnh sửa theo kịch bản để bao gồm cả phần bổ sung bằng chữ.
grg

2
OP đã yêu cầu "thời gian kể từ kỷ nguyên, tính bằng mili giây", đây là câu trả lời về cách thêm số 0 vào chuỗi. Không giống nhau. Mặc dù được giải thích trong bài, không phải là một câu trả lời cho câu hỏi.
CousinCocaine

5

giải pháp này hoạt động trên macOS.

nếu bạn cân nhắc sử dụng tập lệnh bash và có sẵn python, bạn có thể sử dụng mã này:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

Hoặc viết pythonkịch bản trực tiếp:

#!/usr/bin/python

from time import time
print int(round(time() * 1000)) 

4

Perl có mặt khắp nơi.

$ perl -MTime::HiRes=time -e 'printf "%.9f\n", time'
1557390839.244920969
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.