다른 시간대에서 "날짜" 출력 시간을 만드는 방법은 무엇입니까?

다른 시간대에서 "날짜" 출력 시간을 만드는 방법은 무엇입니까?

시간대를 으로 설정하여 실행 중인 서버가 있습니다 UTC. 이는 일반적으로 좋은 습관인 것 같습니다(틀렸다면 정정해 주세요).

어쨌든 파일 때문에 scp제가 연결된 서버 중 하나가 EDT복사해야 할 형식으로 파일을 실행하고 저장하고 있습니다 /path/to/filename/data20120913.

rsync마지막 날에 수정된 파일을 찾기 위해 find 플래그 같은 것을 사용해 보았지만 -mtime -1전혀 성공하지 못했습니다.

오늘의 파일 만 복사하는 것은 괜찮지만 scp현재로서는 4시간의 창이 있고 실행은 date +%Y%m%d각 서버에서 다른 날을 제공하므로 약간 짜증이 납니다.

살펴보면서 man date시간을 다음과 같이 출력할 수 있다는 것을 알았지 UTC만 이를 다른 시간대로 출력하는 방법을 찾지 못했습니다.EDT

date나는 또한 GNU 확장과 같은 것을 사용하여 date -d 20100909 +%s신기원 이후의 초 단위 날짜를 얻고, 수동 초 계산을 적용하고 , 그것이 어떻게 날짜로 렌더링되는지 볼 수 있다고 생각합니다 4 * 60 * 60. 그러나 일광 절약 시간제가 시작되면 여전히 1시간이 될 것입니다.

YYYYMMDD로 설정된 서버에서 날짜를 형식으로 출력하는 더 쉬운 방법이 있습니까 ?EDTUTC

답변1

다음과 같이 쿼리 기간에 대한 시간대를 설정할 수 있습니다.

TZ=America/New_York date

TZ설정과 명령 사이의 공백에 유의하십시오 date. Bourne과 유사한 쉘에서는 rc변수가 현재 명령에 대해서만 설정됩니다. TZ다른 쉘( csh, tcsh, fish)에서는 항상 다음을 사용할 수 있습니다 env.

env TZ=America/New_York date

너무 길어요.

리눅스 시스템에서. 시간대는 디렉토리의 파일에 정의되어 있습니다 /usr/share/zoneinfo. 이런 구조를 흔히들 부릅니다."올슨 데이터베이스"창립 공헌자들을 기리기 위해.

각 시간대에 대한 규칙은 텍스트 파일 행으로 정의된 다음 이진 파일로 컴파일됩니다. 이러한 방식으로 컴파일된 행은 해당 구역이 적용되는 데이터 및 시간 범위, 그리고 해당되는 경우 일광 절약 시간제 간 변환 방법을 정의하는 표기법을 정의합니다.

America/New_York예를 들어, "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는 일광 절약 시간 구성 요소 이름입니다. 각 이름은 3자 이상의 문자로 구성됩니다. offset본초자오선 서쪽 시간대는 양수 값을 가지며, 자오선 동쪽 시간대는 음수 값을 갖습니다. UTC(이전 GMT)를 얻으려면 현지 시간에 오프셋을 추가하세요. 및 시간 필드는 표준/일광 변환이 발생하는 시기를 나타냅니다 start.end

예를 들어, 미국 동부에서는 표준시가 UTC보다 5시간 빠르며 대신 EST5EDT이를 지정할 수 있습니다 America/New_York. 그러나 이러한 대안은 특히 미국 이외의 지역에서는 항상 인식되지 않으므로 피하는 것이 가장 좋습니다.

HP-UX(SUSv3 호환 UNIX)는 /usr/lib/tztabEST5EDT, CST6CDT, MST7MDT, PST8PDT와 같은 텍스트 규칙과 POSIX 이름을 사용합니다. 이 파일에는 Olson 데이터베이스와 유사하게 각 시간대에 대한 모든 기록 규칙이 포함되어 있습니다.

노트:다음 디렉토리를 확인하면 모든 시간대를 찾을 수 있습니다. /usr/share/zoneinfo.

답변2

TZ환경 변수를 조작하여 이를 수행 할 수 있습니다 . 다음은 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 아메리카/Los_Angeles 아메리카/New_York 유럽/런던 유럽/파리'

# 표시 형식
형식='%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
완벽한

관련 정보