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 ?
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 ?
Câu trả lời:
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.
Tôi nghĩ rằng đây là phương pháp đơn giản nhất:
expr $(date +%s) / 86400
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 +%-:::z
sẽ 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.
$()
được ưa thích hơn backticks vì khả năng đọc và các lý do khác .echo $(( $(date ...) / 86400 ))