Tính ngày kể từ 1/1/1970


10

Làm thế nào bạn có thể tính toán số ngày kể từ 1/1/1970? Đây là để cập nhật thuộc tính ShadowLastChange trên OpenLDAP.

Có cách nào để làm điều này bằng cách sử dụng lệnh ngày linux ?


Trong Bash và hầu hết các shell có nguồn gốc Bourne hiện đại, $()được ưa thích hơn backticks vì khả năng đọc và các lý do khác . echo $(( $(date ...) / 86400 ))
Tạm dừng cho đến khi có thông báo mới.

Chưa có 2000 nhưng ai đó có thể chỉnh sửa và sửa tiêu đề :-)
Đổ chuông Ø

Câu trả lời:


20

ring0 đánh bại tôi trong vài giây, nhưng lệnh đầy đủ là:

echo $(($(date --utc --date "$1" +%s)/86400))

Điều này đi theo thời gian UTC. Kết quả:

root@hostname:~# echo $((`date --utc --date "$1" +%s`/86400))
14984

Một kiểm tra nhanh chóng với WolframAlpha cho thấy đây là giá trị chính xác.


1
Còn giây nhuận thì sao? :)
netvope 21/2/2015

1
@netvope Sau một bước nhảy vọt thứ hai, thời gian unix được đặt lại một lần nữa. Vì vậy, mỗi ngày thêm chính xác 86400 giây. Tuy nhiên, thời gian unix 915148800 có thể là viết tắt của cả UTC 1998-12-31T23: 59: 60 và 1999-01-01T00: 00: 00 en.wikipedia.org/wiki/Unix_time#Leap_seconds
Debilski

9

Các datelệnh có thể cung cấp cho bạn số giây kể từ 1970-01-01 00:00:00 UTC.

  date +"%s"

Bạn có thể chia kết quả 3600*24cho để có được số ngày (UTC).

Ví dụ trong Bash

  x=`date +"%s"` ; echo $(( $x / 3600 / 24 ))

để hiển thị số ngày.


9

Tôi nghĩ rằng đây là phương pháp đơn giản nhất:

expr $(date +%s) / 86400

Tại sao điều này bị hạ cấp? Đó là câu trả lời hay nhất và ngắn nhất và đơn giản nhất
Tom Corelis

1

Tôi cũng cần phải giải quyết vấn đề này, nhưng tôi muốn nhận được cùng một giá trị cho ngày # bất kể thời gian trong ngày. Với các cách tiếp cận như được hiển thị ở đây, giá trị sẽ thay đổi vào nửa đêm UTC thay vì nửa đêm theo giờ địa phương. Điều này có vẻ giống như một vấn đề ở EU hoặc Bờ Đông Hoa Kỳ, gần với UTC đến mức giá trị ngày sẽ không thay đổi vào giữa ngày làm việc thông thường, nhưng, ví dụ, California, ngày thay đổi sẽ xảy ra lúc 4 giờ chiều PST, có thể bất tiện. Tôi tưởng tượng người Úc sẽ đặc biệt khó chịu khi thay đổi giá trị ngày vào cuối buổi sáng.

Nếu chúng ta muốn sửa lỗi đó, chúng ta cần thêm phần bù từ UTC trước khi chia cho giây / ngày. May mắn thay, lệnh ngày Linux bao gồm chuỗi định dạng % z báo cáo phần bù từ UTC. Mặc dù định dạng chuẩn (kết quả này dành cho giờ Denver, MDT):

$ date +%z
-0600

. . . không thể sử dụng trực tiếp trong một phép tính, các công cụ sửa đổi đúng sẽ mang lại những gì chúng ta muốn:

$ date +%-:::z
-6

Đặt điều đó cùng với các chuyển đổi giây / giờ / ngày thông thường và tôi tin rằng những điều sau đây sẽ tạo ra các ngày kể từ 1/1/1970, với 1/1/1970 là ngày 0 và giá trị tăng vào nửa đêm theo giờ địa phương:

echo $(( ( $(date +"%s + ( %-:::z * 3600)") ) / 86400 ))

Tính toán đơn giản này sẽ không hoạt động đối với các múi giờ không được bù từ UTC cả giờ (ví dụ: Ấn Độ, TZ = Châu Á / Kolkata), do "+5: 30" được tạo bởi date +%-:::zsẽ tạo ra lỗi "ký tự không hợp lệ trong biểu thức" khi được sử dụng trong tuyên bố trên.

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.