มีวิธีตรวจสอบโซนเวลาที่ฉันใช้งานบน Linux หรือไม่?
มีวิธีตรวจสอบโซนเวลาที่ฉันใช้งานบน Linux หรือไม่?
คำตอบ:
โดยปกติแล้วTZ
ตัวแปรสภาพแวดล้อมจะบอกคุณว่ามีประโยชน์ อย่างไรก็ตามมันเป็นการดีที่สุดที่จะใช้ฟังก์ชั่นเช่นmktime()
และlocaltime()
เพื่อแปลงระหว่างtime_t
และเป็นตัวแทนเขตเวลาท้องถิ่น นั่นคือไม่พยายามที่จะทำแปลงตัวเอง
date
จะบอกคุณ
echo $TZ
ไม่ทำอะไรเลยสำหรับฉัน
หากคุณหมายถึงจากคอนโซลเพียงพิมพ์:
date +%Z
หากคุณต้องการเขตเวลาที่เป็นตัวเลข:
date +'%:z %Z'
ตัวอย่างผลลัพธ์:
-05:00 EST
:z EST
date
GNU เวอร์ชั่น BusyBox พิมพ์บางอย่างที่ไม่ไวต่อความรู้สึก "%: z CEST" ในกรณีของฉัน
linux
ubuntu-10.04
ฉันต้องการค้นหาเขตเวลาในรูปแบบ "US / Eastern" หรือ "Europe / London" แทน คุณสามารถค้นหาได้ใน:
ZONE="US/Eastern"
ใน / etc / sysconfig / clockหรือคุณสามารถลองจับคู่ / etc / localtime กับไฟล์ใดไฟล์หนึ่งภายใต้ / usr / share / zoneinfo; น่ารำคาญนี่ดูเหมือนจะไม่ใช่ symlink แต่คุณสามารถทำได้
cd / usr / share / zoneinfo
ค้นหา * -type f -exec sh -c "diff -q / etc / localtime '{}'> / dev / null && echo {}" \;
เพื่อค้นหาไฟล์ที่ตรงกัน - อาจมีวิธีที่ดีกว่าในการทำเช่นนั้น แต่ก็ใช้งานได้ จะมีการแข่งขันหลายรายการ
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
สำหรับอูบุนตูให้ลองสิ่งนี้:
$ cat /etc/timezone
ตัวอย่างผลลัพธ์:
Asia/Kolkata
สำหรับการอ้างอิง distro อื่น ๆ : https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux
timedatectl set-timezone
/etc/timezone
ดูคำตอบนี้/etc/localtime
สำหรับการแก้ปัญหาเป็นไปตาม
บางครั้งคุณอาจจะมองหาเขตเวลาที่ยอมรับมากกว่าแบบสั้นเป็นที่ผลิตโดยเช่นdate %Z
US/Eastern
สำหรับระบบที่มีtimedatectl
เช่น Fedora timedatectl
แสดงข้อมูลที่เป็นประโยชน์มากมายรวมถึงโซนปัจจุบัน:
# timedatectl
Local time: Tue 2016-09-13 17:10:26 EDT
Universal time: Tue 2016-09-13 21:10:26 UTC
RTC time: Tue 2016-09-13 21:10:26
Time zone: US/Eastern (EDT, -0400)
Network time on: yes
NTP synchronized: yes
RTC in local TZ: no
แต่น่าเสียดายที่timedatectl
ใช้เวลาset-timezone
เป็นคำสั่ง get-timezone
แต่ไม่เคยมีใครที่สอดคล้องกัน แยกมันดังนี้
# timedatectl status | grep "zone" | sed -e 's/^[ ]*Time zone: \(.*\) (.*)$/\1/g'`
US/Eastern
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0
ดังนั้นฉันอยู่ในเวลาที่ภูเขา แม้ว่าคำแนะนำข้างต้นเกี่ยวกับการใช้ตัวแปรสภาพแวดล้อมหรือเพียงแค่ออกคำสั่งวันที่บางครั้งก็ทำงานได้ดีขึ้นทั้งนี้ขึ้นอยู่กับวิธีที่คุณต้องการใช้
สำหรับเขตเวลาคุณสามารถใช้ตำแหน่งทางภูมิศาสตร์:
$ curl https://ipapi.co/timezone
America/Chicago
หรือ:
$ curl http://ip-api.com/line?fields=timezone
America/Chicago
/sbin/hwclock --systohc [--utc]
เพื่อตั้งค่านาฬิกาฮาร์ดแวร์เคอร์เนล Linux เก็บและคำนวณเวลาตามจำนวนวินาทีเสมอตั้งแต่เที่ยงคืนของวันที่ 1 มกราคม 1970 UTC โดยไม่คำนึงว่านาฬิกาฮาร์ดแวร์ของคุณจะถูกเก็บเป็น UTC หรือไม่ การแปลงเวลาท้องถิ่นของคุณเสร็จสิ้นแล้ว สิ่งหนึ่งที่เรียบร้อยเกี่ยวกับเรื่องนี้คือถ้ามีคนใช้คอมพิวเตอร์ของคุณจากเขตเวลาอื่นพวกเขาสามารถตั้งค่าตัวแปรสภาพแวดล้อม TZ และวันที่และเวลาทั้งหมดจะปรากฏขึ้นถูกต้องสำหรับเขตเวลาของพวกเขา
หากจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 UTC ถูกเก็บเป็นจำนวนเต็ม 32 บิตที่เซ็นชื่อ (เนื่องจากอยู่ในระบบ Linux / Intel ของคุณ) นาฬิกาของคุณจะหยุดทำงานในปี 2038 บางครั้ง Linux ไม่มีปัญหา Y2K โดยธรรมชาติ แต่มันมีปัญหาปี 2038 หวังว่าเราทุกคนจะใช้งาน Linux บนระบบ 64 บิตได้ในตอนนี้ เลขจำนวนเต็ม 64 บิตจะทำให้นาฬิกาของเราทำงานได้ค่อนข้างดีจนถึงประมาณ 292271 ล้านปี
โซลูชั่นสองข้อ:
date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone
ให้ฉัน (ตามลำดับ):
UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC
คอมพิวเตอร์ของฉันใช้งาน UTC
การใช้ TZ หรือวันที่ไม่น่าเชื่อถือเพราะจะบอกเขตเวลาของ USER ไม่ใช่เขตเวลาระบบเริ่มต้น
เขตเวลาระบบเริ่มต้นจะถูกเก็บไว้ใน / etc / เขตเวลา (ซึ่งมักจะเป็นลิงค์สัญลักษณ์ไปยังไฟล์ข้อมูลเขตเวลาที่เฉพาะเจาะจงกับเขตเวลา) หากคุณไม่มี / etc / timezone ให้ดูที่ / etc / localtime โดยทั่วไปนั่นคือเขตเวลา "เซิร์ฟเวอร์" / etc / localtime มักจะเชื่อมโยงไปยังไฟล์เขตเวลาใน / usr / share / zoneinfo เส้นทางดังกล่าวไปยังไฟล์เขตเวลาที่ถูกต้องมักจะให้ข้อมูลทางภูมิศาสตร์แก่คุณเช่นกัน
ลินุกซ์ที่ใหม่กว่ามี "timedatectl" ซึ่งให้ข้อมูลจำนวนมากเมื่อรันคำสั่ง
(เป็น side-node, ถ้าคุณมีระบบโบราณที่ยังคงใช้เขตเวลาแบบกำหนดค่าตายตัวของ OLD คุณสามารถคัดลอกไฟล์เขตเวลาที่ทันสมัยลงบนมันและมันจะทำงานได้ฉันต้องทำหลายครั้งเพื่อแก้ไขเขตเวลาที่เปลี่ยนแปลง สำหรับอุปกรณ์รุ่นเก่า)
บางครั้งtimedatectl set-timezone
ไม่อัปเดต/etc/timezone
ดังนั้นจึงเป็นการดีที่สุดที่จะได้รับ tiemzone จากชื่อของไฟล์ที่ symlink /etc/timezone
ชี้ไปที่:
#!/bin/bash
set -euo pipefail
if filename=$(readlink /etc/localtime); then
# /etc/localtime is a symlink as expected
timezone=${filename#*zoneinfo/}
if [[ $timezone = "$filename" || ! $timezone =~ ^[^/]+/[^/]+$ ]]; then
# not pointing to expected location or not Region/City
>&2 echo "$filename points to an unexpected location"
exit 1
fi
echo "$timezone"
else # compare files by contents
# https://stackoverflow.com/questions/12521114/getting-the-canonical-time-zone-name-in-shell-script#comment88637393_12523283
find /usr/share/zoneinfo -type f ! -regex ".*/Etc/.*" -exec \
cmp -s {} /etc/localtime \; -print | sed -e 's@.*/zoneinfo/@@' | head -n1
fi
ข้อมูลอ้างอิง: ในคำตอบนี้
คุณสามารถแสดงวันที่และเขตเวลาพร้อมกัน:
date +'%d/%m/%Y %H:%M:%S [%:z %Z]'