Đặt múi giờ từ thiết bị đầu cuối


210

Tôi muốn thay đổi múi giờ của đồng hồ hệ thống từ thiết bị đầu cuối.

Điều này có thể được thực hiện với

tzselect

"mở gui trong terminal"

hoặc là

sudo cp /usr/share/zoneinfo/Europe/London /etc/localtime

"sẽ đặt thành gmt"

Nhưng có cách nào để đặt múi giờ chỉ với phần bù tức là.-1 hoặc +5, v.v.?

Tôi cần phải làm điều này khi tôi đang viết một ứng dụng để điều chỉnh thời gian chờ hoặc báo cáo nhật ký và thông tin duy nhất tôi có là IP người dùng. Tôi có thể sử dụng một ứng dụng web để tìm vị trí của IP, nhưng sau đó tôi cần thiết lập bù trừ, điều này sẽ dễ dàng NẾU tôi có thể lấy phần bù của vị trí, nhưng nếu tôi cần tìm vùng và thành phố thì đó là một nỗi đau thực sự .

Nếu bất cứ ai biết câu trả lời cho cách đặt đồng hồ hệ thống với +/- giờ sẽ rất tuyệt.


Hãy giúp chúng tôi nhận câu trả lời được chấp nhận. Tôi nghĩ rằng câu trả lời của @ Mitch là câu hỏi hay nhất.com / 32/3163 / 22308
Nam G VU

1
@NamGVU Không, Mitch's không phải là giải pháp tốt nhất, đó là câu trả lời "GUI in a terminal". Ngay cả OP cũng nói rằng "điều này sẽ không hoạt động vì tôi cần phải lấy múi giờ từ một chương trình mà không cần người dùng nhập vào. Tôi cần một lệnh tôi có thể đưa vào thiết bị đầu cuối không phải là giải pháp gui" , và đó là mục tiêu tương tự mà hầu hết mọi người mong muốn khi tìm kiếm "giải pháp đầu cuối," "Một kịch bản thân thiện. Collin Anderson's sẽ tốt hơn nếu bạn biết một thành phố hoặc Ryan dành cho đồng bằng GMT + -n
Xen2050

Trong Ubuntu 18.04, tzselect không mở gui. Nó có một lựa chọn menu dựa trên thiết bị đầu cuối.
Tim Richardson

Câu trả lời:


321

Để thay đổi múi giờ từ thiết bị đầu cuối, chỉ cần nhấn Ctrl+ Alt+ Ttrên bàn phím để mở Terminal. Khi nó mở, chạy (các) lệnh bên dưới:

sudo dpkg-reconfigure tzdata

Sau khi mở, chỉ cần theo dõi màn hình để thay đổi múi giờ.


14
điều này sẽ không hoạt động vì tôi cần altr múi giờ từ một chương trình mà không cần người dùng nhập vào, tôi cần một lệnh tôi có thể đưa vào thiết bị đầu cuối không phải là giải pháp gui nhờ trả lời
user2155009 23/07/13

1
cám ơn!!! điều này giúp, bởi vì tôi đã thay đổi thủ công, v.v. / timezone =) như php.net/manual/en/timezones.php !!! hoàn toàn giống nhau !!!
Vladimir Ch

Cấu hình lại tzdata dường như cũng điều chỉnh đồng hồ phần cứng để thời gian hiển thị giữ nguyên sau khi chuyển đổi múi giờ. Bạn có thể muốn rằng nếu thời gian của bạn là chính xác nhưng múi giờ đã sai. Tuy nhiên, bạn chắc chắn không muốn chạm vào đồng hồ phần cứng của mình khi đi du lịch. Cách tiếp cận timedatectl dường như chỉ thay đổi múi giờ.
SnakE

@SnakE đối với tôi hiển thị thời gian thay đổi tương ứng
Rịa

tôi đã thay đổi nó từ putty từ dòng commad mà không có vấn đề gì tại sao bạn nói rằng bạn của tôi? @ADTC
saber tabatabaee yazdi

170

Bạn cũng có thể sử dụng cái mới timedatectlđể đặt thời gian trong 14.04.

sudo timedatectl set-timezone America/New_York

Làm thế nào để bạn cài đặt nó trên Ubuntu?
Phân chia số 0

1
Nó được cài đặt theo mặc định vào ngày 14.04.
Collin Anderson

6
Để xem tất cả các tùy chọn có sẵn, bạn có thể chạy ls -R --group-directories-first /usr/share/zoneinfo. (Hãy cẩn thận để không sửa đổi hoặc xóa bất kỳ tập tin nào ở đây.) Thông tin thêm về posixrighttiền tố ở đây .
ADTC

Những công việc này! ...
Dan Nissenbaum

3
Sử dụng sudo timedatectl set-timezone Etc/UTCcho UTC.
Zoltán

19

Bạn có thể sử dụng các tệp GMT ± x trong /usr/share/zoneinfo/Etc.

sudo ln -fs /usr/share/zoneinfo/Etc/GMT$offset /etc/localtime

cảm ơn allot đã trả lời tôi nhận được lỗi ln: không thể tạo liên kết tượng trưng `/ etc / localtime ': Tệp tồn tại oboiusly tôi không chắc tôi đang làm gì về hướng dẫn tốt cho điều này hoặc thậm chí một số từ khóa tôi có thể google cảm ơn sử dụng lệnh chính xác? tôi đang sử dụng sudo ln / usr / share / zoneinfo / Etc / GMT $ + 1 / etc / localtime để đặt đồng hồ thành + 1gmt
user2155009 22/07/13

9
Tôi đoán là đã quên cờ lực lượng -> sudo ln -sf ....
Tele

1
Điều này sẽ làm việc, nhưng sẽ không cập nhật tên tz trong /etc/timezone.
poolie

1
Để cập nhật / etc / múi giờ, hãy chạysudo dpkg-reconfigure --frontend noninteractive tzdata
Pierre Gramme

17

Tôi nhận ra luồng này hơi cũ, nhưng tôi đang tìm giải pháp tốt hơn vì tôi cần tự động đặt múi giờ trong VM sau khi người dùng tải xuống từ trang web của chúng tôi và triển khai nó. Đây là những gì tôi đã kết thúc với:

echo "Setting TimeZone..."
export tz=`wget -qO - http://geoip.ubuntu.com/lookup | sed -n -e 's/.*<TimeZone>\(.*\)<\/TimeZone>.*/\1/p'` &&  timedatectl set-timezone $tz
export tz=`timedatectl status| grep Timezone | awk '{print $2}'`
echo "TimeZone set to $tz"

Điều này sẽ truy vấn Geoip.ubfox.com từ máy chủ sau khi nó được khởi động trên mạng mới (tập lệnh của tôi kiểm tra khóa học kết nối đầu tiên) và sau đó đặt múi giờ của máy chủ dựa trên phản hồi.

"Wget -q0 -" cho biết wget chỉ xuất kết quả cho thiết bị xuất chuẩn mà sau đó được dẫn đến biến $ tz.

Hy vọng nó sẽ giúp được ai đó!


1
Tuyệt quá! Trên Ubuntu 16.04, nó phải là "vùng grep" và "in $ 3" ​​thay vào đó.
dùng334639

Tôi đề xuất một cli khác để có được múi giờ. Một cái nhìn sạch hơn một chút trong quan điểm của tôi: curl -s ' Geoip.ubfox.com/lookup ' | xmllint --xpath '/ Phản hồi / TimeZone / text ()' -
Darko Miletic

11

TL; DR /etc/localtime là một liên kết tượng trưng chỉ đến một tệp trong /usr/share/zoneinfo/Continent/City. Bằng cách thay đổi nơi nó chỉ ra, bạn có thể thay đổi múi giờ của mình.

Để thay đổi múi giờ, hãy xóa /etc/localtimevà gán liên kết tượng trưng cho thành phố bạn muốn. Ví dụ, ls -l /etc/localtimebáo cáo rằng tập tin này trỏ đến /usr/share/zoneinfo/America/Denver. Để đổi nó thành New York, tôi làm

  1. sudo rm /etc/localtime
  2. sudo ln -s /usr/share/zoneinfo/America/New_York /etc/localtime
  3. Đợi một chút để đồng hồ của tôi được cập nhật

Ảnh chụp màn hình dưới đây cho thấy các bước và xác nhận từ timedatectl

nhập mô tả hình ảnh ở đây


Thật tuyệt khi hiểu những gì đang xảy ra đằng sau bức màn, nhưng bạn không nghĩ sẽ tốt hơn nếu đề xuất các công cụ được chỉ định cho việc này như dpkg-cấu hình lại tzdata, v.v.?
Patrick Cornelissen

@PatrickCornelissen Trước hết, đã có câu trả lời tzdata, vì vậy đề xuất điều tương tự là vô nghĩa. Thứ hai, tzdatalàm khá nhiều như nhau. Tùy thuộc vào người dùng quyết định những gì họ thích, vì vậy nó không tốt hơn cũng không tệ hơn - chỉ là sở thích của một người.
Sergiy Kolodyazhnyy

1
Chà, làm việc "chống lại" các công cụ phân phối thường dẫn đến các vấn đề, vì vậy tôi sẽ tránh cách tiếp cận của bạn nếu có thể, nhưng công bằng mà giải pháp của bạn sẽ hoạt động (hiện tại)
Patrick Cornelissen

Giải pháp này theo tôi hiểu, hoạt động trên các bản phân phối khác nhau. Nhưng vẫn cần cơ sở dữ liệu múi giờ có sẵn trong thư mục / usr / share / zoneinfo. Có cách nào để có được cơ sở dữ liệu múi giờ mà không cần cài đặt gói tzdata không?
andho

@andho Vì /var/lib/dpkg/info/tzdata.listgợi ý rằng tất cả các mặt hàng /usr/share/zoneinfođi kèm với gói đó, tôi cho rằng bạn cần phải cài đặt gói để có tất cả các mặt hàng, nhưng thật lòng tôi không chắc lắm, cộng với không hoàn toàn quen thuộc với cách thức hoạt động của nó phân phối. Hãy xem xét việc hỏi điều này như một câu hỏi trên Unix & Linux và thoải mái tham khảo bài đăng này nếu bạn muốn cung cấp ngữ cảnh cho câu hỏi.
Sergiy Kolodyazhnyy

10

Cách dễ dàng để cập nhật múi giờ là sử dụng sudo dpkg-reconfigure tzdata. Nhưng điều này không dễ dàng như vậy.

Nếu bạn muốn đặt múi giờ rõ ràng thông qua tập lệnh (ví dụ: để thiết lập VM), đây là một công thức:

Đặt một biến cho múi giờ bạn muốn, ví dụ: một trong những

tz=Europe/London
tz=America/Anchorage
tz=Etc/GMT+6

Các giá trị hợp lệ là các thư mục và tên tệp bên dưới /usr/share/zoneinfo.

Sau đó, đơn giản

sudo cp -vf /usr/share/zoneinfo/$tz /etc/localtime
echo $tz | sudo tee /etc/timezone

Lưu ý rằng cả hai /etc/localtime/etc/timezonephải nhất quán.

Có lẽ bây giờ khởi động lại để tất cả các dịch vụ của bạn được cập nhật (ví dụ: cron).


-1: Đừng bao giờ sử dụng cpđể đặt / etc / localtime. / etc / localtime là một liên kết tượng trưng cho tệp chính xác. Nếu bạn sử dụng cpđể thay đổi nó, bạn thực sự sẽ ghi lại nội dung của bất kỳ tệp tzdata nào mà nó hiện đang trỏ đến, vì vậy, đột nhiên (ví dụ) tệp tTC Uzata chứa dữ liệu múi giờ cho Châu Âu / Luân Đôn thay vì cho UTC, điều này rất tệ (và gây phiền nhiễu để khắc phục sự cố, như tôi có thể nói từ kinh nghiệm cá nhân)
Foogod

5

Đây là phương pháp tôi sử dụng, là trung tâm của Hoa Kỳ vì tôi không cần phải lo lắng về múi giờ ngoài Hoa Kỳ.

Nếu tôi cần xác định múi giờ hiện tại, tôi sẽ làm:

cat /etc/timezone  

hoặc là

sudo hwclock --show  

Sau đó tôi làm:

timedatectl set-timezone <_designation_>

nơi <_designation_>là một trong những điều sau đây:

Hoa Kỳ / Đông
Hoa Kỳ / Trung
Mỹ / Núi
Hoa Kỳ / Thái Bình Dương
Hoa Kỳ / Alaska
US / Aleutian
US / Arizona
US / East-Indiana
US / Hawaii
US / Indiana-Starke
US / Michigan
US / Pacific-New
US / Samoa

VÍ DỤ:

timedatectl set-timezone US/Eastern  

Chỉ định múi giờ khác có thể được tìm thấy ở đây: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones


tzselectlà một cách hay để lấy chuỗi múi giờ
Martin Thoma

0

Bạn không thể làm điều này trừ khi bạn chọn tệp múi giờ bạn muốn tương ứng với từng khoảng thời gian bù.

Một số câu trả lời được đề xuất bằng cách sử dụng các tệp trong / usr / share / zoneinfo / Etc, nhưng vấn đề với chúng là chúng không tin tưởng DST.

Vì vậy, trừ khi bạn chọn một số cấu hình múi giờ để khớp với từng phần bù hoặc bạn không quan tâm đến DST, không có cách nào để làm điều đó một cách khái quát.

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.