จะตรวจสอบเขตเวลาใดใน Linux?


คำตอบ:


19

โดยปกติแล้วTZตัวแปรสภาพแวดล้อมจะบอกคุณว่ามีประโยชน์ อย่างไรก็ตามมันเป็นการดีที่สุดที่จะใช้ฟังก์ชั่นเช่นmktime()และlocaltime()เพื่อแปลงระหว่างtime_tและเป็นตัวแทนเขตเวลาท้องถิ่น นั่นคือไม่พยายามที่จะทำแปลงตัวเอง


2
มีคำสั่งใดบ้างที่บอกเกี่ยวกับเขตเวลาที่ผู้ใช้อยู่

26
แน่นอนว่าdateจะบอกคุณ
Greg Hewgill

ฉันมีสองอินสแตนซ์ของเซิร์ฟเวอร์ถ้าฉันให้คำสั่ง "วันที่" ในเซิร์ฟเวอร์ทั้งสองจะแสดงเวลาที่แตกต่างกัน เขตเวลาสำหรับเซิร์ฟเวอร์ทั้งสองคือ IST เวลาของเซิร์ฟเวอร์หนึ่งเครื่อง: จันทร์ 11 ก.ค. 10:39:31 IST 2011 และเซิร์ฟเวอร์อื่นจันทร์ 11 ก.ค. 10:35:31 IST 2011 .. มีความแตกต่าง 4 นาที

8
On Precise Pangolin echo $TZไม่ทำอะไรเลยสำหรับฉัน
เลนซามูเอลแมคลีนผู้อาวุโส

3
@GregHewgill คำตอบของคุณไม่มีประโยชน์ในการดูครั้งแรก โปรดพิจารณาแก้ไขคำตอบของคุณ ดูคำตอบที่โหวตมากที่สุดด้านล่าง ฉันจะลงคะแนนให้คำตอบของคุณในตอนนี้ นอกจากนี้ยังไม่มีค่าเริ่มต้น TZ env บนเครื่องของฉัน
therealmarv

244

หากคุณหมายถึงจากคอนโซลเพียงพิมพ์:

date +%Z

2
ดีใช้งานได้ดี
Silver Moon

15
นี่ควรเป็นคำตอบที่ยอมรับ
KalenGi

จุดดี ... เปลี่ยนคำตอบของเอฟเฟ็กต์นั้น
Rasman

และเพื่อตั้งเขตเวลาจากบรรทัดคำสั่งใน Ubuntu ลิงก์ต่อไปนี้จะให้คำสั่งเล็กน้อย 1 บรรทัดที่ต้องทำ: askubuntu.com/a/524362/182454
Dan Nissenbaum

สิ่งนี้ให้+07สำหรับฉัน หากต้องการRegion/Cityใช้ Linux ที่ใช้ Debian / Arch ให้ดูคำตอบนี้
Tom Hale

54

หากคุณต้องการเขตเวลาที่เป็นตัวเลข:

date +'%:z %Z'

ตัวอย่างผลลัพธ์:

-05:00 EST

7
บน OS X ผลลัพธ์นี้:z EST
สงสัย

7
นี้ถ้าสำหรับลินุกซ์
Paul Vargas

1
แม่นยำมากขึ้นนี้ใช้กับ dateGNU เวอร์ชั่น BusyBox พิมพ์บางอย่างที่ไม่ไวต่อความรู้สึก "%: z CEST" ในกรณีของฉัน
Léo Lam

อย่างไรก็ตามวันที่ +% z ทำงานได้ดีบน OS X ฉันขอแนะนำให้คุณแก้ไขคำตอบ
Neil Mayhew

1
สวัสดี @ NeilMayhew ขอบคุณ! ฮัม ... แต่คำถามมีแท็กlinux ubuntu-10.04
พอลวาร์กัส

24

ฉันต้องการค้นหาเขตเวลาในรูปแบบ "US / Eastern" หรือ "Europe / London" แทน คุณสามารถค้นหาได้ใน:

  • / etc / timezone (แสดงบน Ubuntu และ Red Hat? แต่ไม่ใช่เช่น Amazon Linux)
  • (บนระบบสไตล์ Red Hat) เช่นเดียวกับ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 {}" \;

    เพื่อค้นหาไฟล์ที่ตรงกัน - อาจมีวิธีที่ดีกว่าในการทำเช่นนั้น แต่ก็ใช้งานได้ จะมีการแข่งขันหลายรายการ


4
find /usr/share/zoneinfo/ -type f| xargs md5sum | grep $(md5sum /etc/localtime | cut -d' ' -f1)
Freiheit

11

สำหรับอูบุนตูให้ลองสิ่งนี้:

$ cat /etc/timezone

ตัวอย่างผลลัพธ์:

Asia/Kolkata

สำหรับการอ้างอิง distro อื่น ๆ : https://unix.stackexchange.com/questions/110522/timezone-setting-in-linux


บางครั้งไม่ได้ปรับปรุงtimedatectl set-timezone /etc/timezoneดูคำตอบนี้/etc/localtimeสำหรับการแก้ปัญหาเป็นไปตาม
Tom Hale

6

บางครั้งคุณอาจจะมองหาเขตเวลาที่ยอมรับมากกว่าแบบสั้นเป็นที่ผลิตโดยเช่น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

4
$ strings /etc/localtime | tail -n 1
MST7MDT,M3.2.0,M11.1.0

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



2
  • / etc / sysconfig / clock ตั้งค่าว่าจะเก็บนาฬิกาของฮาร์ดแวร์เป็น UTC หรือเวลาท้องถิ่น
  • Symlink / etc / localtime เป็น / usr / share / zoneinfo / ... เพื่อตั้งค่าเขตเวลาของคุณ
  • พิมพ์/sbin/hwclock --systohc [--utc]เพื่อตั้งค่านาฬิกาฮาร์ดแวร์

เคอร์เนล Linux เก็บและคำนวณเวลาตามจำนวนวินาทีเสมอตั้งแต่เที่ยงคืนของวันที่ 1 มกราคม 1970 UTC โดยไม่คำนึงว่านาฬิกาฮาร์ดแวร์ของคุณจะถูกเก็บเป็น UTC หรือไม่ การแปลงเวลาท้องถิ่นของคุณเสร็จสิ้นแล้ว สิ่งหนึ่งที่เรียบร้อยเกี่ยวกับเรื่องนี้คือถ้ามีคนใช้คอมพิวเตอร์ของคุณจากเขตเวลาอื่นพวกเขาสามารถตั้งค่าตัวแปรสภาพแวดล้อม TZ และวันที่และเวลาทั้งหมดจะปรากฏขึ้นถูกต้องสำหรับเขตเวลาของพวกเขา

หากจำนวนวินาทีตั้งแต่วันที่ 1 มกราคม 1970 UTC ถูกเก็บเป็นจำนวนเต็ม 32 บิตที่เซ็นชื่อ (เนื่องจากอยู่ในระบบ Linux / Intel ของคุณ) นาฬิกาของคุณจะหยุดทำงานในปี 2038 บางครั้ง Linux ไม่มีปัญหา Y2K โดยธรรมชาติ แต่มันมีปัญหาปี 2038 หวังว่าเราทุกคนจะใช้งาน Linux บนระบบ 64 บิตได้ในตอนนี้ เลขจำนวนเต็ม 64 บิตจะทำให้นาฬิกาของเราทำงานได้ค่อนข้างดีจนถึงประมาณ 292271 ล้านปี


1

โซลูชั่นสองข้อ:

date +"%Z %z"
timedatectl | grep "Time zone"
cat /etc/timezone

ให้ฉัน (ตามลำดับ):

UTC +0000
Time zone: Etc/UTC (UTC, +0000)
Etc/UTC

คอมพิวเตอร์ของฉันใช้งาน UTC


0

การใช้ TZ หรือวันที่ไม่น่าเชื่อถือเพราะจะบอกเขตเวลาของ USER ไม่ใช่เขตเวลาระบบเริ่มต้น

เขตเวลาระบบเริ่มต้นจะถูกเก็บไว้ใน / etc / เขตเวลา (ซึ่งมักจะเป็นลิงค์สัญลักษณ์ไปยังไฟล์ข้อมูลเขตเวลาที่เฉพาะเจาะจงกับเขตเวลา) หากคุณไม่มี / etc / timezone ให้ดูที่ / etc / localtime โดยทั่วไปนั่นคือเขตเวลา "เซิร์ฟเวอร์" / etc / localtime มักจะเชื่อมโยงไปยังไฟล์เขตเวลาใน / usr / share / zoneinfo เส้นทางดังกล่าวไปยังไฟล์เขตเวลาที่ถูกต้องมักจะให้ข้อมูลทางภูมิศาสตร์แก่คุณเช่นกัน

ลินุกซ์ที่ใหม่กว่ามี "timedatectl" ซึ่งให้ข้อมูลจำนวนมากเมื่อรันคำสั่ง

(เป็น side-node, ถ้าคุณมีระบบโบราณที่ยังคงใช้เขตเวลาแบบกำหนดค่าตายตัวของ OLD คุณสามารถคัดลอกไฟล์เขตเวลาที่ทันสมัยลงบนมันและมันจะทำงานได้ฉันต้องทำหลายครั้งเพื่อแก้ไขเขตเวลาที่เปลี่ยนแปลง สำหรับอุปกรณ์รุ่นเก่า)


0

บางครั้ง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

ข้อมูลอ้างอิง: ในคำตอบนี้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.