如何让“date”输出不同时区的时间?

如何让“date”输出不同时区的时间?

我有一台运行的服务器,时区设置为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格式输出日期?EDTUTC

答案1

您可以这样设置查询持续时间的时区:

TZ=America/New_York date

TZ请注意设置和命令之间的空格date。在类似 Bourne 和类似 shell 中,仅为当前命令rc设置变量。TZ在其他 shell ( cshtcshfish) 中,您始终可以使用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)。和时间字段指示标准/日光转换发生的时间startend

例如,在美国东部,标准时间比 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
完毕

相关内容