การตั้งค่าเขตเวลาใน Linux [ปิด]


157

ฉันตั้งเขตเวลาเพื่อ GMT + 6 บนเครื่อง Linux ของฉันโดยการคัดลอกไฟล์ zoneinfo ไป/etc/localtimeแต่คำสั่งยังคงแสดงเวลาเป็นdate UTCtime-6มีใครสามารถอธิบายพฤติกรรมนี้ให้ฉันได้บ้าง

ฉันสมมติว่าdateคำสั่งควรแสดงUTCtime+6เวลา นี่คือขั้นตอนที่ฉันกำลังติดตาม:

date
Wed Jan 22 17:29:01 IST 2014

date -u
Wed Jan 22 11:59:01 UTC 2014

cp /usr/share/zoneinfo/Etc/GMT+6 /etc/localtime

date
Wed Jan 22 05:59:21 GMT+6 2014

date -u
Wed Jan 22 11:59:01 UTC 2014

มีการตั้งค่าตัวแปรสภาพแวดล้อม TZ ( echo $TZสร้างบางอย่างยกเว้นบรรทัดว่าง) หรือไม่ นอกจากนี้อาจเป็นความคิดที่ดีกว่าในการสร้าง symlink /etc/localtimeแทนการคัดลอกไฟล์จริง (ในแบบที่คุณจะปลอดภัยในกรณีที่ข้อมูล zoneinfo เปลี่ยนแปลงซึ่งมันไม่น่าจะเป็นไปได้)
Sami Laine

distro คืออะไร? distros ที่แตกต่างกันจัดการสิ่งนี้แตกต่างกัน!
slm

@slm: ฉันใช้อูบุนตู 12.04
Rahul Dhobi

คุณอาจไม่ทราบนโยบายนี้ แต่คุณไม่ควรข้ามโพสต์คำถามเดียวกันในเว็บไซต์ SE ที่แตกต่างกัน stackoverflow.com/questions/21282367/timezone-setting-in-linux
slm

2
"คำถามนี้ถูกโพสต์ในเว็บไซต์หลายแห่ง" หืมนั่นเป็นคำถามใหม่สำหรับฉัน ไม่เคยพบไซต์ SE ด้วยเหตุผลใกล้ชิดเช่นนั้น อย่างไรก็ตามนี่เป็นคำถามแรกที่เกิดขึ้นกับ Google เมื่อค้นหาวิธีการเปลี่ยนเขตเวลาใน Linux และเป็นคำถามที่ได้รับการโหวตมากที่สุดสำหรับคำถามทั้งหมดที่ฉันเคยเห็นบางทีมันควรจะเปิดใหม่?
Ajedi32

คำตอบ:


272

ลองดูที่โพสต์บล็อกนี้หัวข้อ: วิธีการ: 2 วิธีในการเปลี่ยนเขตเวลาในลินุกซ์

หมวกสีแดง

หากคุณใช้การแจกจ่ายเช่น Red Hat วิธีการคัดลอกไฟล์ของคุณจะเป็นที่ยอมรับได้เป็นส่วนใหญ่

หมายเหตุ:หากคุณกำลังมองหาวิธีแก้ปัญหาแบบไม่เชื่อเรื่องพระเจ้านี่ยังใช้งานได้กับ Debian แม้ว่าจะมีวิธีการที่ง่ายกว่าด้านล่างหากคุณจำเป็นต้องเกี่ยวข้องกับเครื่อง Debian เท่านั้น

$ ls /usr/share/zoneinfo/
Africa/      CET          Etc/         Hongkong     Kwajalein    Pacific/     ROK          zone.tab
America/     Chile/       Europe/      HST          Libya        Poland       Singapore    Zulu
Antarctica/  CST6CDT      GB           Iceland      MET          Portugal     Turkey       
Arctic/      Cuba         GB-Eire      Indian/      Mexico/      posix/       UCT          
Asia/        EET          GMT          Iran         MST          posixrules   Universal    
Atlantic/    Egypt        GMT0         iso3166.tab  MST7MDT      PRC          US/          
Australia/   Eire         GMT-0        Israel       Navajo       PST8PDT      UTC          
Brazil/      EST          GMT+0        Jamaica      NZ           right/       WET          
Canada/      EST5EDT      Greenwich    Japan        NZ-CHAT      ROC          W-SU         

ฉันอยากจะแนะนำให้เชื่อมโยงกับมันมากกว่าการคัดลอกอย่างไรก็ตาม

$ sudo unlink /etc/localtime 
$ sudo ln -s /usr/share/zoneinfo/Etc/GMT+6 /etc/localtime

ตอนนี้วันที่แสดงเขตเวลาที่แตกต่างกัน:

$ date -u
Thu Jan 23 05:40:31 UTC 2014

$ date 
Wed Jan 22 23:40:38 GMT+6 2014

Ubuntu / Debian Distros

ในการเปลี่ยนเขตเวลาใน distros เหล่านี้คุณสามารถใช้คำสั่งนี้:

$ sudo dpkg-reconfigure tzdata

    เอสเอส # 1

$ sudo dpkg-reconfigure tzdata

Current default time zone: 'Etc/GMT-6'
Local time is now:      Thu Jan 23 11:52:16 GMT-6 2014.
Universal Time is now:  Thu Jan 23 05:52:16 UTC 2014.

ตอนนี้เมื่อเราตรวจสอบมัน:

$ date -u
Thu Jan 23 05:53:32 UTC 2014

$ date 
Thu Jan 23 11:53:33 GMT-6 2014

หมายเหตุ:นอกจากนี้ยังมีตัวเลือกนี้ใน Ubuntu 14.04 และสูงกว่าด้วยคำสั่งเดียว (ที่มา: ถาม Ubuntu - การตั้งค่าเขตเวลาจากเทอร์มินัล ):

$ sudo timedatectl set-timezone Etc/GMT-6

เกี่ยวกับการใช้ "Etc / GMT + 6"

ตัดตอนมาจากคำตอบของ @ MattJohnson บน SO

Zones like Etc/GMT+6ถูกย้อนกลับโดยเจตนาเพื่อให้เข้ากันได้กับมาตรฐาน POSIX ย้อนหลัง ดูความคิดเห็นในไฟล์นี้

คุณไม่จำเป็นต้องใช้โซนเหล่านี้ แต่คุณควรจะใช้โซนเวลาการตั้งชื่ออย่างเต็มที่เหมือนAmerica/New_YorkหรือEurope/Londonหรือสิ่งที่มีความเหมาะสมสำหรับตำแหน่งของคุณ อ้างถึงรายการที่นี่


1
อ้างถึงคำตอบของคำถามนี้ที่นี่stackoverflow.com/questions/21282367/timezone-setting-in-linux
Rahul Dhobi

@ user3184706 - คุณทำสิ่งสกปรกที่นี่ Q ของคุณที่นี่เป็นวิธีการเปลี่ยนเขตเวลาที่ฉันตอบ บิตเกี่ยวกับการใช้ GMT .. เขตเวลาหรือไม่ว่า SO A ที่ให้นั้นมีความถูกต้อง แต่ฉันไม่ได้รวมไว้ที่นี่เนื่องจากคุณไม่ได้ถามจริง ๆ ถึงแม้ว่าฉันจะคิด ฉันสามารถเพิ่มบิตนั้นลงใน A นี้หรือคุณสามารถคัดลอก / วางข้อมูลนี้ที่นี่เป็นของคุณเอง A.
slm

@ user3184706 - เพื่อลองและทำความสะอาดสิ่งนี้ฉันได้รวม Matt's A ไว้ในเหมืองเพื่อทำให้เสร็จสมบูรณ์
slm

1
โปรดทราบว่าหากคุณอยู่ในคอนเทนเนอร์ด้วย Ubuntu คุณจะต้องติดตั้งแพ็กเกจtzdataมิฉะนั้น/usr/share/zoneinfoจะไม่มีไฟล์อยู่ในนั้น
Elliott Slaughter

1
timedatectlใช้งานได้กับSLES 12 เช่นกัน
Alexander Malakhov

24

นี่คือวิธีที่ฉันทำใน Ubuntu เพียงแทนที่Asia/Tokyoด้วยเขตเวลาของคุณเอง

echo 'Asia/Tokyo' | sudo tee /etc/timezone

sudo dpkg-reconfigure -f noninteractive tzdata

มีเป็นข้อผิดพลาดในtzdataบางค่าได้ปกติโดย: dpkg-reconfigure:

echo 'US/Central' >/etc/timezone
dpkg-reconfigure -f noninteractive tzdata
# Current default time zone: 'America/Chicago'

echo 'US/Eastern' >/etc/timezone
apt-get install --reinstall tzdata
# Current default time zone: 'America/New_York'

นอกจากนี้ยังทำงาน แต่ใน Debian / Ubuntu คำตอบ SLM เป็นอาจจะง่ายและมีความเสี่ยงน้อยกว่า (โอกาสที่จะผิดพลาดไม่ได้)
แอนเดรีอาร์ตมันน์

17

คำสั่งtzselectถูกสร้างขึ้นเพื่อทำสิ่งที่คุณต้องการ


1
และรวมตัวที่เป็นเส้นเดียวที่กำหนดTZตัวแปรเขตเวลาท้องถิ่นของคุณ - เช่นอเมริกา / Los_Angeles export TZ=`printf "2\n49\n21\n1\n" | tzselect 2>&1 | tail -1` - คุณสามารถใส่บรรทัดนี้ใน. profile , as tzselect` ของคุณที่เป็นประโยชน์แนะนำให้คุณเรียกใช้ที่พรอมต์
Sameers
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.