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
내가 원하는 것?
- 명령을 실행하는 시간의 분/초가 결과에 영향을 미치지 않도록 합니다.
- 어떤 시간대에서도 작동하도록 하세요
%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
있으므로zsh
strftime
zsh/datetime
strftime()
(+ 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시간 형식으로 나타낸 시간입니다. %I
12시간 형식을 사용하는 경우 필수입니다 %p
.
또한 날짜를 지정해야 합니다. 그렇지 않으면 기본값은 1900-01-01(및 반환된 다른 날짜 관련 필드의 값은 0 tm_year
)이므로 숫자는 음수입니다.struct tm
strptime()
또한 %p
로케일에 따라 다릅니다. 항상 인식되도록 C
로케일 을 설정해야 할 수도 있습니다 .PM
CST가 미국 중부 표준시(또는 여름?) 시간(중국 시간 또는 호주 중부 표준시와 반대)을 의미한다고 가정하면 예를 들어 자신과 관련된 다른 시간대 America/Los_Angeles
로 바꾸거나 항상 UTC 6시간 서쪽으로 표시된 시간대를 하드코딩 할 수 있습니다. , 이 시간은 계절(겨울/여름)에 관계없이 사용됩니다.America/Regina
TZ=CST6
CST