다른 날짜에서 시간을 어떻게 출력 할 수 있습니까?


115

시간대가로 설정된 서버가 실행 중입니다 UTC. 그것은 일반적으로 좋은 습관처럼 보입니다 (잘못되면 정정하십시오).

어쨌든 scp파일을 연결하기 위해 연결하는 서버 중 하나 가 실행 중이며 EDT파일을 형식으로 복사해야합니다./path/to/filename/data20120913

마지막 날에 수정 된 파일에 대해 rsyncfind의 -mtime -1플래그 와 같은 것을 사용하여 파일 을 찾으려고 시도 했지만 운이 없었습니다.

나는 scp현재 날짜의 파일을 복사하는 데 신경 쓰지 않지만 지금 당장 실행 date +%Y%m%d하면 각 서버마다 다른 날을 제공하는 4 시간 창이 있으며 약간 버그가 있습니다.

살펴본 man date결과 시간 출력을으로 볼 수는 UTC있지만 다른 시간대로 출력하는 방법은 없습니다.EDT

나는 GNU날짜 확장 과 같은 것을 사용 date -d 20100909 +%s하여 신기원에서 날짜를 초 단위로 가져 와서 수동 4 * 60 * 60초 계산을 적용 하고 날짜로 렌더링하는 방법을 볼 수 있다고 생각하지만 일광 시간이 걸리면 여전히 1 시간이 지날 것입니다 .

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


EDT는 Linux에서 인식되는 표준 시간대가 아닙니다. 내 "조심해!" 전체 추악한 이야기에 대해 아래 답변하십시오. * NIX 브랜드에서 EDT가 인식되면 여전히주의를 기울이고 시간대 문자열을 다시 확인해야합니다.
Mike S

답변:


175

쿼리 기간 동안 시간대를 설정할 수 있습니다.

TZ=America/New_York date

TZ설정과 date명령 사이에 공백이 있습니다. Bourne과 rc같은 쉘 TZ에서 명령 행에 대해서만 변수 를 설정합니다 . 다른 쉘 (년 csh, tcsh, fish), 당신은 항상 사용할 수있는 env대신 명령을 :

env TZ=America/New_York date

tl; dr

Linux 시스템에서. 시간대는 /usr/share/zoneinfo디렉토리의 파일에 정의되어 있습니다 . 이 구조는 창립 기고자를 기리기 위해 "올슨 데이터베이스"라고도합니다.

각 시간대에 대한 규칙은 텍스트 파일 행으로 정의 된 다음 이진 파일로 컴파일됩니다. 이렇게 컴파일 된 행은 영역 이름을 정의합니다. 영역이 적용되는 데이터 및 시간 범위; 표준 시간에 대한 UTC로부터의 오프셋; 해당되는 경우 일광 절약 시간으로 전환하는 방법을 정의하는 표기법.

예를 들어, "America"디렉토리에는 America/New_York위에서 사용한 파일에 뉴욕에 대한 필수 정보가 들어 있습니다 .

존재하지 않는 영역 (파일 이름)의 사양은 자동으로 무시되고 UTC 시간이보고됩니다. 예를 들어 잘못된 시간을보고합니다.

TZ="America/New York" date ### WRONG ###

SUSv3 또는 POSIX-2001로 알려진 단일 UNIX 사양 버전 3은 이식성을 위해 표준 시간대 설명을 식별하는 문자열이 콜론 문자로 시작해야한다고 언급합니다. 따라서 다음과 같이 쓸 수도 있습니다.

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과 EST5EDT, CST6CDT, MST7MDT, PST8PDT와 같은 POSIX 이름을 사용합니다. 파일에는 Olson 데이터베이스와 유사하게 각 시간대에 대한 모든 히스토리 규칙이 포함됩니다.

참고 : 다음 디렉토리를 검사하여 모든 시간대를 찾을 수 있어야합니다 /usr/share/zoneinfo..


내가 틀렸다면 확실하지 않지만 명령 export보다 좋아 보인다env
insign

@JRFerguson-시간대가 목록에 포함되어 있지 않은 경우 (예 : Las Vegas 또는 Nevada), 시간을 확인하는 대안은 무엇입니까?
동기 부여

@ 동기 도시 또는 주가 포함되어 있지 않은 경우 귀하와 동일한 지역 정보를 사용하는 도시 또는 주를 선택하십시오. 예를 들어, 저는 뉴욕과 동일한 시간대를 사용하는 플로리다에 있습니다. 따라서 내 컴퓨터는 뉴욕 시간과 동기화됩니다.
JR 퍼거슨

1
@JRFerguson-그 사람은 다양한 시간대를 알고 있으며 귀하의 경우 뉴욕과 같은 대안을 사용할 수 있다고 가정합니다. 이것이 유일한 옵션일까요? 예를 들어, 나는 유럽에 살고 있지 않으며 중복되는 시간대를 알지 못합니다.
동기 부여

1
@ 동기화 된 이 사이트 와 같은 것을 사용 하여 영역의 다른 지점을 찾는 데 도움을 줄 수 있습니다.
JR 퍼거슨

33

TZ환경 변수 를 조작하여이를 수행 할 수 있습니다 . 다음은 미국 / 동부 지역의 현지 시간으로, DST를 처리 할 수있을 정도로 똑똑합니다.

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

영역 이름은 내부 파일 및 디렉토리에서 가져옵니다 /usr/share/zoneinfo.


17

조심해! 날짜는 현재 시간대에서 시간을 행복하게 내뱉습니다. 인식 할 수없는 시간대를 지정하면.

이것 좀 봐:

-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 시간을 반환합니다.
마크 허드슨

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

6

날짜 구문은 명령 행 호출 고통 만드는, 비전 및 오류가 발생하기 쉬운입니다. 따라서 작은 시간대의 스크립트 (저는 worldtime 이라고 함 )를 작성했습니다.이 스크립트 는 다른 시간대 및 컨버스의 기본 시간대 (지역 시간)에서 지정된 (또는 현재) 시간을 인쇄합니다.

여기있어. 필요에 맞게 조정하고 경로에 넣고 실행 가능하게 만드십시오.

#! / bin / sh
#
# 다른 시간대의 기준 시간에서 지정된 (또는 현재) 시간을 인쇄합니다
#와 대화
#

# 변환 할 기본 시간대
TZBASE = 유럽 / 아테네

# 표시 할 시간대
# 자세한 내용은 / usr / share / zoneinfo /를 참조하십시오
TZONES = 'UTC 아메리카 / 로스 앤젤레스 미국 / 뉴욕 유럽 / 런던 유럽 / 파리'

# 표시 형식
FORMAT = '% H : % M (% p) % Z % a % m % b % Y'

만약 [ "$ 1"]; 그때
  time = "$ 1"
그밖에
  시간 =`날짜 + % T`
fi

# 지정된 입력 시간대의 시간을 지정된 출력에 표시
# 시간대
상영 시간 ()
{
  TZIN = $ 1
  TZOUT = $ 2

  TZ = $ TZOUT 날짜 --date = 'TZ = "'$ TZIN '"' "$ time"+ "$ time $ TZIN은 $ TZOUT $ FORMAT"
}

$ TZONES의 tz; 하다
  상영 시간 $ TZBASE $ tz
끝난

에코

$ TZONES의 tz; 하다
  상영 시간 $ tz $ TZBASE
끝난


3

종종 현지 시간대에 타임 스탬프가 있으며이를 원격 tz로 변환해야합니다. 다음과 같이 할 수 있습니다 :

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

어디:

America/Curacao - remote timezone
MSK - local timezone
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.