为了在 red hat Linux 机器(版本 5 和 6)上配置时区需要配置文件:
/etc/sysconfig/clock
Run Code Online (Sandbox Code Playgroud)
并在它们之间创建符号链接
/etc/localtime to /usr/share/zoneinfo/America/New_York
Run Code Online (Sandbox Code Playgroud)
但/etc/sysconfig/clock还需要将ZONE变量设置为以下示例:
ZONE="America/New_York"
Run Code Online (Sandbox Code Playgroud)
那么,什么是需要设置的变量ZONE=America/New_York时,它是从链路很清楚/etc/localtime的是指向/usr/share/zoneinfo/**America/New_York**?
那么有什么需要ZONE用“ America/New_York”值来设置参数呢?
我在特定日期[客户时间而非本地时间] 运行一项工作以向我的客户发送电子邮件。我使用 cpanel cron 作业我尝试使用带时区的 cron 作业
但它仍然以我当地的时区发送
32 16 08 05 * /usr/bin/curl CRON_TZ=Africa/Algiers https://www.example.com/SendCron.php?CronID=382 #CronID382END # z93v66
Run Code Online (Sandbox Code Playgroud)
我使用 Cron_TZ 做错了什么?
一个月后,我的 VPS 上的大量服务停止工作。折腾了一个小时左右后,我发现时间已经冻结了。我认为这是某种虚拟化错误,重启很快修复了它。
但是,今天我试图运行我的 S3 备份,但由于时间错误,SSL 失败了。在检查我得到的时间时:
Current default timezone: 'Europe/London'
Local time is now: Sat Jul 11 22:03:02 BST 2009.
Universal Time is now: Sat Jul 11 21:03:02 UTC 2009.
tim@vps:~$ sudo ntpdate ntp.ubuntu.com
11 Jul 22:03:30 ntpdate[3901]: step time server 91.189.94.4 offset -14404.833448 sec
Run Code Online (Sandbox Code Playgroud)
现在我现在在英国,很明显它只是在 18:03 才离开。
我试过手动设置日期:
sudo date +%T -s "18:03:30"
Run Code Online (Sandbox Code Playgroud)
当我读回来时,它并没有改变
我搞砸了什么?
编辑:
我跑了:
tim@vps:/var/log$ sudo hwclock --utc
Cannot access the Hardware Clock via any known method.
Use the --debug option to see the details …Run Code Online (Sandbox Code Playgroud) 我在服务器上有几个月前的日期的一些文件,但它们是不可见的find -mtime 7搜索。
当我用 列出它们时ls -l,它们看起来完全正常:
-rw-r--r-- 1 root root 347253 Jun 12 16:26 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 Nov 24 16:26 gsmforum_main.2010-11-24-04-25-02.sql.gz
Run Code Online (Sandbox Code Playgroud)
“find .-mtime 1”看不到顶层文件,但底层可见。
我几乎把头撞在墙上试图理解为什么。我尝试了一些随机的东西并遇到了ls --full-time命令。它表明这两者在某种程度上有点不同
-rw-r--r-- 1 root root 347253 2010-06-12 16:26:20.000000000 +0400 pedia_main.2010-06-12-04-25-02.sql.gz
-rw-r--r-- 1 root root 490144578 2010-11-24 16:26:12.000000000 +0300 gsmforum_main.2010-11-24-04-25-02.sql.gz
Run Code Online (Sandbox Code Playgroud)
日期好像没问题。一个位+0400作为时区,另一个位是+0300. 为什么find找不到带有 的那些+0400?
操作系统是最新更新的CentOS 5.5 Final,ls版本是(GNU coreutils) 5.97.
另外,问题是我不明白文件的这个“时区”存储在哪里。该索引节点没有任何额外的属性来存储它们看起来。服务器上的文件系统是ext4。
我们有一个运行 CentOS 5.5 的 VDS,它是使用 EDT 时区创建和配置的。我已替换etc/localtime为指向Australia/Melbourne(UTC+10) 时区文件的链接。运行该date命令会显示正确的日期和时间。
问题是 cron 作业正在运行,就好像服务器仍在使用 EDT 时区一样,即使在重新启动后也是如此。例如,本应在凌晨 1:01 运行的作业在下午 3:01 运行。
我错过了什么?
在 FreeBSD 中,我想以无人值守的方式将时区设置为 UTC。如果我运行tzsetup,并在对话框中选择“是”和“a”以选择 UTC,我会看到没有/etc/localtime文件存在。
因此,如果我想以无人值守的方式在服务器上设置 UTC,我可以rm /etc/localtime不运行tzsetup吗?
对于 Ansible,我有一个角色来设置时区并填充 (Ubuntu) 基本系统的设置,
- name: set timezone
copy: content='Europe/Berlin'
dest=/etc/timezone
owner=root
group=root
mode=0644
backup=yes
- name: update timezone
command: dpkg-reconfigure --frontend noninteractive tzdata
Run Code Online (Sandbox Code Playgroud)
这两个命令无论如何都会执行。这意味着当 Ansible 为同一个目标运行两次时,changed=2结果摘要中仍然会得到一个,
default : ok=41 changed=2 unreachable=0 failed=0
Run Code Online (Sandbox Code Playgroud)
理想情况下,一切都应该ok在第二次运行中。
虽然我猜测update timezone应该对 有某种依赖set timezone,但我不太确定如何最好地实现这一点。
这曾经用于设置时区。我在 Alpine 3.9.4 上有一个容器,它可以工作:
RUN apk add --no-cache tzdata
ENV TZ America/Chicago
RUN apk del tzdata
Run Code Online (Sandbox Code Playgroud)
我现在正在使用 Alpine Linux v3.10.3 创建一个 Docker 容器,但它不再工作了。一位用户建议我需要复制到 /etc/localtime:
RUN apk add --no-cache tzdata
ENV TZ America/Chicago
RUN cp /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone
RUN apk del tzdata
Run Code Online (Sandbox Code Playgroud)
如果tzdata被删除,这些都不起作用。但是,如果tzdata不删除它们,它们会起作用。为什么是这样?
为什么 timezonectl 没有列出所有可用的时区?
$ timedatectl
?
Timezone: UTC (UTC, +0000)
?
$ timedatectl list-timezones | grep -i utc
-no output-
$ timedatectl list-timezones | wc -l
417
Run Code Online (Sandbox Code Playgroud)
ls /usr/share/zoneinfo 包括 UTC、UCT、GMT、Universal 等。但这些也不包括在列表中。
我在 CentOS 7 中特别注意到了这一点,并且在两台不同的机器上得到了相同的结果。然而,有趣的是,Ubuntu 显示“UTC”而不是“GMT”。./zoneinfo 中确实存在。所以整件事让我很困惑。
在巴西,今年总统决定我们不应该实行夏令时。因为我的 Centos 8 服务器时间不对,我的意思是,当我使用date时,显示的时间错了 1 小时。通常,当我设置服务器时,我会执行以下操作:
ln -s /usr/share/zoneinfo/Brazil/East /etc/localtime
Run Code Online (Sandbox Code Playgroud)
巴西东部时区现在是 -3,但使用时区上方的文件会得到 -2(因为出于某种原因,它错误地认为我们今年应该有夏令时,就像往常一样)。
那么我该如何解决这个问题?有没有一种方法可以告诉我的服务器每天根据政府的决定更新 zoneinfo 文件?让我们假设巴西总统今天决定我们明天应该进入夏令时。是否有国际组织提供根据当地政府决定更新的区域文件?
obs:我试过nano文件 /usr/share/zoneinfo/Brazil/East 但是奇怪的字符出现在屏幕上所以我放弃了编辑它。