BSD의 date 명령을 사용하여 Unix 시간 오후 11시와 오늘 밤 11시 CST를 얻는 방법은 무엇입니까?

BSD의 date 명령을 사용하여 Unix 시간 오후 11시와 오늘 밤 11시 CST를 얻는 방법은 무엇입니까?

BSD는 여전히 시간 형식을 date -j -f수용하면서 현재 시간의 초와 분을 혼합하는 것 같습니다 . '%H%p'내가 원하는 것은 입력 형식을 올바른 UNIX 시간으로 변환하는 것뿐입니다. 또한 %Z값을 시스템 시간대 이외의 값으로 변경하면 오류가 발생합니다.

❯ /bin/date -j -f '%H%p %Z' '11PM PDT' '+%s'; gdate -d '11PM' '+%s'
1653546964
1653544800
# Run again
❯ /bin/date -j -f '%H%p %Z' '11PM PDT' '+%s'; gdate -d '11PM' '+%s'
1653546965
1653544800

내가 원하는 것?

  1. 명령을 실행하는 시간의 분/초가 결과에 영향을 미치지 않도록 합니다.
  2. 어떤 시간대에서도 작동하도록 하세요%Z

날짜에 불필요한 어려움이 있는 경우 이 작업을 수행하기 위해 다른 POSIX 호환 방법을 사용할 수 있습니다.

저는 zsh를 사용하고 있으므로 가능한 경우 zsh 솔루션도 작동합니다. strftime -r은 유망해 보이지만 음수 값을 생성합니다.

답변1

형식 문자열의 일부로 :%M:%S를 지정하고 시간으로 :00:00을 지정할 수 있어야 합니다.

% /bin/date -j -f '%H:%M:%S%p %Z' '11:00:00PM GMT'
Wed May 25 19:00:00 EDT 2022

FreeBSD 명령 맨페이지 date표시구문 분석을 완료하려면 strptime(3)을 사용하십시오.맨 페이지에는 다음과 같은 내용이 있습니다.

 The %Z format specifier only accepts time zone abbreviations of the local
 time zone, or the value "GMT".  This limitation is because of ambiguity
 due to of the over loading of time zone abbreviations.  One such example
 is EST which is both Eastern Standard Time and Eastern Australia Summer
 Time.

따라서 date이러한 시간대 변환을 수행하는 데 사용할 수 없습니다.

대신 GMT 오프셋을 계산하여 와 함께 사용할 수 있습니다 %z.

예를 들어

% /bin/date -j -f '%H:%M:%S%p %z' "11:00:00PM $(TZ=America/Los_Angeles date +%z)"
Thu May 26 02:00:00 EDT 2022

그리고 정확하게 말하면 오늘 밤 11시(현재 PDT) 로스앤젤레스는 뉴욕의 다음날 오전 2시입니다.

답변2

다음 을 사용하여 태그를 지정 하고 zsh있으므로zshstrftimezsh/datetimestrftime()(+ localtime()) 및strptime() (+ mktime()) 표준 기능(초 미만을 지원하는 확장 포함).

따라서 여기에서 포팅할 수 있습니다(BSD, GNU 또는 GNU나 BSD가 없는 모든 시스템에서 date):

zmodload zsh/datetime
TZ=America/Los_Angeles strftime -s today %Y-%m-%d
TZ=America/Los_Angeles strftime -r "%Y-%m-%d %I%p" "$today 11PM"

오늘은 2022-05-26 내 시간이지만 여전히 2022-05-25 로스앤젤레스 시간은 1653544800(2022-05-26T06:00:00+00:00)입니다.

이는 %H하루를 24시간 형식으로 나타낸 시간입니다. %I12시간 형식을 사용하는 경우 필수입니다 %p.

또한 날짜를 지정해야 합니다. 그렇지 않으면 기본값은 1900-01-01(및 반환된 다른 날짜 관련 필드의 값은 0 tm_year)이므로 숫자는 음수입니다.struct tmstrptime()

또한 %p로케일에 따라 다릅니다. 항상 인식되도록 C로케일 을 설정해야 할 수도 있습니다 .PM

CST가 미국 중부 표준시(또는 여름?) 시간(중국 시간 또는 호주 중부 표준시와 반대)을 의미한다고 가정하면 예를 들어 자신과 관련된 다른 시간대 America/Los_Angeles로 바꾸거나 항상 UTC 6시간 서쪽으로 표시된 시간대를 하드코딩 할 수 있습니다. , 이 시간은 계절(겨울/여름)에 관계없이 사용됩니다.America/ReginaTZ=CST6CST

관련 정보