我有一台运行的服务器,时区设置为UTC
。看起来这通常是一个很好的做法(如果我错了,请纠正我)。
无论如何,为了scp
文件,我连接到的其中一台服务器正在运行EDT
并以 格式存储我需要复制的文件/path/to/filename/data20120913
。
我尝试rsync
使用类似于 find-mtime -1
标志的文件来查找最后一天修改的文件,但我没有任何运气。
我不介意只使用scp
复制当天的文件,但截至目前有一个 4 小时的窗口,运行date +%Y%m%d
将在每个服务器上提供不同的一天,这让我有点烦恼。
通过查看man date
我发现我可以将时间输出为UTC
,但我没有找到将其输出为另一个时区的方法,例如EDT
我想我还可以使用 GNUdate
扩展之类的东西date -d 20100909 +%s
来获取自纪元以来的秒数日期,应用手动4 * 60 * 60
秒计算,并查看如何将其渲染为日期 - 但当夏令时开始时,它仍然会是一个小时。
是否有更简单的方法在设置为 的服务器上以YYYYMMDD
格式输出日期?EDT
UTC
答案1
您可以这样设置查询持续时间的时区:
TZ=America/New_York date
TZ
请注意设置和命令之间的空格date
。在类似 Bourne 和类似 shell 中,仅为当前命令rc
设置变量。TZ
在其他 shell ( csh
、tcsh
、fish
) 中,您始终可以使用env
以下命令:
env TZ=America/New_York date
太长了;博士
在 Linux 系统上。时区在目录中的文件中定义/usr/share/zoneinfo
。这种结构通常被称为“奥尔森数据库”以纪念其创始贡献者。
每个时区的规则被定义为文本文件行,然后编译成二进制文件。如此编译的行定义了区域名称;该区域适用的数据和时间范围;标准时间与 UTC 的偏移量;以及定义夏令时之间如何转换的符号(如果适用)。
America/New_York
例如,目录“America”包含上面使用的文件中纽约的必要信息。
请注意,不存在的区域(文件名)的规范将被静默忽略并报告 UTC 时间。例如,这会报告错误的时间:
TZ="America/New York" date ### WRONG ###
单一 UNIX 规范版本 3(称为 SUSv3 或 POSIX-2001)指出,为了可移植性,标识时区描述的字符串应以冒号字符开头。因此,我们也可以这样写:
TZ=":America/New_York" date
TZ=":America/Los_Angeles" date
作为使用描述文件路径指定时区的替代方法,SUSv3 描述了 POSIX 模型。在这种格式中,字符串定义为:
std offset [dst[offset][,start-date[/time],end-date[/time]]]
其中std
是标准组件名称,dst
是夏令时组件名称。每个名称由三个或更多字符组成。offset
本初子午线以西的时区为正值,子午线以东的时区为负值。将偏移量添加到本地时间即可获得 UTC(以前称为 GMT)。和时间字段指示标准/日光转换发生的时间start
。end
例如,在美国东部,标准时间比 UTC 早 5 小时,我们可以指定EST5EDT
代替America/New_York
。然而,这些替代方案并不总是得到认可,特别是对于美国以外的地区,最好避免使用。
HP-UX(兼容 SUSv3 的 UNIX)使用文本规则/usr/lib/tztab
和 POSIX 名称,例如 EST5EDT、CST6CDT、MST7MDT、PST8PDT。该文件包含每个时区的所有历史规则,类似于 Olson 数据库。
笔记:您应该能够通过检查以下目录找到所有时区:/usr/share/zoneinfo
。
答案2
您可以通过操作TZ
环境变量来做到这一点。下面将为您提供美国/东部地区的当地时间,该时间也将足够智能地在 DST 到来时处理 DST:
# all on one line
TZ=":US/Eastern" date +%Y%m%d
区域名称来自内部的文件和目录/usr/share/zoneinfo
。
答案3
当心!如果您给它提供了一个它无法识别的时区,Date 会很高兴地输出您当前时区的时间。
看一下这个:
-bash-4.2$ env TZ=EDT date
Wed Feb 18 19:34:41 EDT 2015
-bash-4.2$ date
Wed Feb 18 19:34:43 UTC 2015
请注意,没有称为 EDT 的时区。事实上,
-bash-4.2$ find /usr/share/zoneinfo -name "*EDT*"
回报
/usr/share/zoneinfo/EST5EDT
/usr/share/zoneinfo/posix/EST5EDT
/usr/share/zoneinfo/right/EST5EDT
这有效:
-bash-4.2$ TZ=EST5EDT date
Wed Feb 18 14:36:59 EST 2015
-bash-4.2$ date
Wed Feb 18 19:37:01 UTC 2015
然而,如果你的朋友住在 Gobbledygook 的神秘土地上,并且它的区域信息与你自己的一致,你可以让日期输出 Gobbledygook 区域的时间,它会很乐意这样做,并且没有任何退出值来让你知道它不知道区域:
-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0
答案4
这日期语法晦涩难懂且容易出错,这使得命令行调用变得很痛苦。因此我写了一个小脚本(我将其命名为世界时间),它将打印一些其他时区的基准时间区(您的本地时间)的指定(或当前)时间,反之亦然。
这里是。调整它以满足您的需要,将其放入您的路径中并使其可执行。
#!/bin/sh # # 从其他时区的基准时间打印指定的(或当前的)时间 # 以及相反的情况 # # 转换的基准时区 TZBASE=欧洲/雅典 # 显示时区 # 有关更多名称,请参见 /usr/share/zoneinfo/ TZONES='UTC America/Los_Angeles America/New_York Europe/London Europe/Paris' # 显示格式 格式='%H:%M (%p) %Z %a %m %b %Y' 如果[“$1”];然后 时间=“$1” 别的 时间=`日期+%T` 菲 # 在指定输出中显示指定输入时区的时间 # 时区 开演时间() { TZIN=$1 TZOUT=$2 TZ=$TZOUT 日期 --date='TZ="'$TZIN'"'" $time" +"$time $TZIN 是 $TZOUT $FORMAT" } 对于 $TZONES 中的 tz ;做 放映时间 $TZBASE $tz 完毕 回声 对于 $TZONES 中的 tz ;做 放映时间 $tz $TZBASE 完毕