2012-09-20 40 views
10

Có cách nào lấy tên Múi giờ Canonical từ tập lệnh shell Linux không? ví dụ: nếu múi giờ được định cấu hình của tôi là PDT, thì tôi muốn nhận được "America/Los_Angeles".Lấy tên Múi giờ của Canonical trong tập lệnh shell

Tôi biết tôi có thể nhận được từ liên kết tượng trưng/etc/localtime nếu nó được cấu hình, nhưng vì nó có thể không được cấu hình trong tất cả các máy chủ, tôi không thể dựa vào đó.
Mặt khác, tôi có thể nhận được tên múi giờ ngắn với ngày lệnh +% Z, nhưng tôi vẫn cần tên chuẩn.

Có cách nào để lấy tên chuẩn của múi giờ hiện tại hoặc chuyển đổi múi giờ nhận được với ngày +% Z, ngay cả khi liên kết tượng trưng/etc/localtime không được đặt?

+1

tôi sẽ nói 'PDT' là gần gũi hơn với một tên kinh điển, trong khi 'Mỹ/Los_Angeles' chỉ là một nhãn mô tả để giúp lập bản đồ vị trí vào múi giờ chính xác. – chepner

+1

Tôi không nghĩ rằng điều này là có thể; một chữ viết tắt duy nhất, ngay cả khi được mở rộng rõ ràng (ví dụ: "Giờ ban ngày Thái Bình Dương"), có thể có nhiều mục nhập cơ sở dữ liệu TZ tương ứng. Ví dụ: PDT không chỉ là 'America/Los_Angeles', mà còn là' America/Dawson', 'America/Ensenada',' America/Sitka', 'America/Tijuana',' America/Vancouver', 'America/Whitehorse' và 'US/Pacific'. (Trong thực tế, nếu bạn không chỉ định rằng bạn muốn 'America/Los_Angeles', tôi sẽ giả sử bạn muốn' US/Pacific'.) – ruakh

Trả lời

19

Điều này phức tạp hơn âm thanh. Hầu hết các bản phân phối Linux làm điều đó khác nhau vì vậy không có cách nào đáng tin cậy 100% để lấy tên Olson TZ.

Dưới đây là dựa trên kinh nghiệm mà tôi đã sử dụng trong quá khứ:

  1. Đầu tiên kiểm tra/etc/múi giờ, nếu nó tồn tại sử dụng nó.
  2. séc Tiếp theo nếu/etc/localtime là một liên kết tượng trưng đến cơ sở dữ liệu múi giờ
  3. Nếu không tìm thấy một tập tin trong/usr/share/zoneinfo với cùng nội dung như các tập tin/etc/localtime

chưa được kiểm tra mã ví dụ:

if [ -f /etc/timezone ]; then 
    OLSONTZ=`cat /etc/timezone` 
elif [ -h /etc/localtime ]; then 
    OLSONTZ=`readlink /etc/localtime | sed "s/\/usr\/share\/zoneinfo\///"` 
else 
    checksum=`md5sum /etc/localtime | cut -d' ' -f1` 
    OLSONTZ=`find /usr/share/zoneinfo/ -type f -exec md5sum {} \; | grep "^$checksum" | sed "s/.*\/usr\/share\/zoneinfo\///" | head -n 1` 
fi 

echo $OLSONTZ 

Lưu ý rằng ví dụ nhanh này không xử lý trường hợp nhiều tên TZ khớp với tệp nhất định (khi tìm trong/usr/share/zoneinfo). Việc định hướng tên TZ thích hợp sẽ tùy thuộc vào đơn đăng ký của bạn.

-nick

+0

Vâng, nó không chính xác những gì tôi đang tìm kiếm, nhưng nó sẽ hoạt động. Cảm ơn :) –

Các vấn đề liên quan