我有一个将时区设置为UTC的服务器。看来这通常是个好习惯(如果我输入错误,请纠正我)。我需要以scp格式复制的文件

我看过尝试使用诸如find的EDT标志之类的东西来对/path/to/filename/data20120913文件进行最后一天修改的文件,但是我没有任何运气。 />
我不介意仅使用rsync复制当天的文件,但是截至目前为止,有一个4小时的窗口,运行-mtime -1会给每台服务器提供不同的日期,这给我带来了一些麻烦。

浏览scp,我看到我可以将时间输出为date +%Y%m%d,但是我看不到将其输出为man date这样的其他时区的方法

我假设我还可以使用类似UTC的日期扩展名EDT从纪元获取以秒为单位的日期,应用手动GNU进行第二次计算,然后参见ab会将其渲染为日期-但是当白天开始时,仍然需要一个小时的时间。设置为date -d 20100909 +%s

评论

至少在Linux中,EDT不是公认的时区。看到我的“小心!”以下是整个丑闻的答案。如果您的* NIX品牌认可EDT,则仍应谨慎行事,并仔细检查您的时区字符串。

另请参见此答案,该答案搜索/ usr / share / zoneinfo并在与您的查询匹配的区域中显示时间。

#1 楼

您可以设置查询持续时间的时区,从而:

TZ=America/New_York date


请注意TZ设置和date命令之间的空格。在类似Bourne和类似rc的外壳程序中,这仅为命令行设置TZ变量。在其他shell(cshtcshfish)中,您始终可以改用env命令:

env TZ=America/New_York date


tl; dr

在Linux上系统。时区在/usr/share/zoneinfo目录中的文件中定义。此结构通常被称为“ Olson数据库”,以表彰其创建者。

每个时区的规则都定义为文本文件行,然后将其编译为二进制文件。这样编译的行定义了区域名称;该区域适用的一系列数据和时间;在标准时间内偏离UTC的时间;

例如,目录“ America”在所使用的文件America/New_York中包含纽约的必要信息,

请注意,不存在的区域(文件名)的规范将被忽略,并且会报告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

评论


不知道我是不是错了,但是导出看起来比env命令好

–签名
17/12/23在15:58

@JRFerguson-如果列表中未包含时区,例如拉斯维加斯或内华达州,验证时间的其他方法是什么?

–有动力
19年1月31日在16:26

@动机如果您的城市或州不包括在内,请选择使用与您相同的区域信息的城市或州。例如,我在佛罗里达州,使用与纽约相同的时区,因此我的机器与纽约时间同步。

– JRFerguson
19年1月31日在17:45

@JRFerguson-假设此人知道各个时区,并能够使用其他方式,例如您的纽约。那将是唯一的选择吗?例如,我不住在欧洲,也不知道重叠的时区。

–有动力
19年1月31日在17:49

@Motivated您可以使用本网站之类的内容来帮助您查找区域中的其他点。

– JRFerguson
19年1月31日,17:53



#2 楼

您可以通过操作TZ环境变量来完成此操作。以下内容将为您提供美国/东部时间的本地时间,这也足够聪明,可以在DST滚动时处理DST:

# all on one line
TZ=":US/Eastern" date +%Y%m%d

/usr/share/zoneinfo内部的文件和目录。

#3 楼

小心!日期会愉快地吐出当前时区中的时间,如果您给它提供了一个无法识别的时区。

检查一下:

-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的区域中的时间,它将很乐意因此,使用nary作为退出值可以使您知道该区域不为人所知:

-bash-4.2$ TZ=Gobbledygook date
Wed Feb 18 19:37:36 Gobbledygook 2015
-bash-4.2$ echo $?
0


评论


YMMV:在我的MacOS / BSD机器上,格式错误的TZ字符串返回UTC时间。

–马克·哈德森(Mark Hudson)
19-09-20在17:40

+1为“ Gobbledygook的神秘土地”😂

– Leo Galleguillos
20-2-26在4:54

#4 楼

TODAY=$(TZ=":US/Eastern" date)
echo $TODAY


#5 楼

日期语法是不可思议且容易出错的,这使命令行调用很麻烦。因此,我编写了一个小脚本(我将其命名为worldtime),它将在其他一些时区中从基准时间zome(您本地的时区)打印指定的(或当前)时间,反之亦然。它是。调整它以适应您的需求,将其放在您的路径中,并使其可执行。

#!/bin/sh
#
# Print the specified (or current) time from base time in other time zones
# and the converse
#

# Base time zone from/to which to convert
TZBASE=Europe/Athens

# Time zones to display
# See /usr/share/zoneinfo/ for more names
TZONES='UTC America/Los_Angeles America/New_York Europe/London Europe/Paris'

# Display format
FORMAT='%H:%M (%p) %Z %a %m %b %Y'

if [ "" ] ; then
  time=""
else
  time=`date +%T`
fi

# Show the time from the specified input time zone in the specified output
# time zone
showtime()
{
  TZIN=
  TZOUT=

  TZ=$TZOUT date --date='TZ="'$TZIN'"'" $time" +"$time $TZIN is $TZOUT $FORMAT"
}

for tz in $TZONES ; do
  showtime $TZBASE $tz
done

echo

for tz in $TZONES ; do
  showtime $tz $TZBASE
done



#6 楼

通常,您在本地时区有时间戳,需要将其转换为远程tz。可以使用以下方法完成:

TZ=America/Curacao date -d 'Tue Nov 28 00:07:05 MSK 2016'


其中:

America/Curacao - remote timezone
MSK - local timezone


#7 楼

明天下午3点显示纽约时间
date --date='TZ="America/NewYork" 15:00 tomorrow'

打印:
ti 3.11.2020 17.00.00 +0200

(ti是tiistai的芬兰语缩写,意思是星期二,英语)。
我的本地时区是芬兰/赫尔辛基。
所以明天下午17点在芬兰/赫尔辛基是同一时间:纽约下午3点。