"%d/%m/%Y %H:%M" 형식의 날짜를 초로 변환합니다.

"%d/%m/%Y %H:%M" 형식의 날짜를 초로 변환합니다.

다음 오류가 발생합니다.

date: invalid date '23/07/2021 14:44'

이 코드를 실행할 때

start="23/07/2021 14:44"
startSec=`date +%s -d "${start}"`

나도 시도했다

start="23/07/2021 14:44"
startSec=`date -d "${start}" +%s`

문자열 날짜($start)를 '%d/%m/%Y %H:%M' 형식으로 지정한 다음 초로 변환하려면 어떻게 해야 합니까?

감사해요.

답변1

문자열 작업을 사용하여 입력을 date.

또는 Perl에서는 정확한 입력 형식을 지정해야 합니다.

start='23/07/2021 14:44'
perl -MTime::Piece -sE '
    say Time::Piece->strptime($input, "%d/%m/%Y %H:%M")->epoch
' -- -input="$start"
1627051440

문자열 조작: 문자를 필드 종결자로 read사용하여 문자열을 변수로 나누는 데 사용합니다 .$IFS

start='23/07/2021 14:44'
IFS='/ ' read -r day month year time <<<"$start"
date -d "$year-$month-$day $time"
Fri Jul 23 14:44:00 EDT 2021

<<<여기에는 문자열 리디렉션 이라는 bashism이 있습니다 . 더 많은 POSIX 쉘을 보려면:

IFS='/ ' read -r day month year time <<END_START
$start
END_START

답변2

-d옵션은 표준 옵션이 아닙니다 date. date표준한 형식으로 날짜를 가져와서 다른 형식으로 다시 포맷하는 규정은 없습니다.

BSD, GNU, ast-open 및 busybox에는 date모두 이에 대한 옵션이 있지만 구문과 4가 다르기 때문에 date주어진 오류 메시지의 표현을 사용하는 것처럼 보이는 GNU는 입력을 지정할 수 없는 유일한 것입니다. 체재.

따라서 필요한 휴대용 작업을 혼자서는 수행할 수 없습니다 date.

perl여기서는 적절한 프로그래밍 언어(예: / python/ ...) 를 사용하는 대신 내장 인터페이스가 있는 언어 tcl에서 다음 언어로 전환할 수 있습니다 .bashzshstrptime()

$ zmodload zsh/datetime
$ start='23/07/2021 14:44'
$ strftime -r '%d/%m/%Y %H:%M' $start
1627047840

이는 현지 시간(저에게는 유럽/런던 시간) 14:44:00으로 해석되는 해당 날짜의 신기원 시간을 제공합니다. 타임스탬프가 UTC 시간인 경우 다음으로 변경합니다.

$ TZ=UTC0 strftime -r '%d/%m/%Y %H:%M' $start
1627051440

스칼라 변수에 저장하려면 이 -s옵션을 사용할 수 있습니다.

$ strftime -s startSec -r '%d/%m/%Y %H:%M' $start
$ echo $startSec
1627047840

ksh93 셸은 printf내장 기능(또는 dateast-open의 일부로 내장된 경우 내장 기능)을 사용하여 날짜를 구문 분석할 수도 있지만 요즘은 드물지만 Stores가 필요하기 때문에 입력 형식을 지정하는 것이 약간 번거롭습니다. 다음을 사용하는 시스템에서는 변수를 사용하여 지정된 파일의 형식 목록 $DATEMSK(standard 의 경우 getdate()) /dev/fd/x:

$ { DATEMSK=/dev/fd/3 printf '%(%s)T\n' "$start"; } 3<<< '%d/%m/%Y %H:%M'
1627047840

(ksh93 버전(Ubuntu 20.04 ksh 패키지)의 명령 그룹 없이는 작동하지 않았으며 최신 버전에서는 버그가 수정되었습니다.https://github.com/ksh93/ksh).

해당 시간대의 현지 시간은 명확할 가능성이 높지만 23/07/2021 14:44이 타임스탬프 형식을 사용하면 시간대가 DST를 구현하는 경우 모호함이 발생할 수 있습니다.

예를 들어, 내 유럽/런던 시간대에는 다음에 해당하는 두 가지 Unix 시대 시간이 있습니다 25/10/2020 01:30.

$ strftime '%d/%m/%Y %H:%M' 1603585800
25/10/2020 01:30
$ strftime '%d/%m/%Y %H:%M' 1603589400
25/10/2020 01:30

내 시스템에서는 zsh strftime -r(system's strptime())가 후자를 선택합니다.

$ strftime -r '%d/%m/%Y %H:%M' '25/10/2020 01:30'
1603589400

답변3

GNU 날짜(및 기타)는 원하는 형식의 날짜 문자열을 허용할 수 없습니다. 주로 미국 날짜 형식을 허용합니다.

가변 형식을 사용하려면 가장 간단한 솔루션을 사용하는 것입니다. busybox date옵션에 형식을 지정하면 됩니다(이미 가지고 있음).%d/%m/%Y %H:%M-D

$ busybox date -u +%s -D '%d/%m/%Y' -d "23/07/2021"
1626998400

현지 시간으로 모호한 결과가 나오는 것보다 초 단위로 주어진 정확한 시간이 답이 되도록 -u( ) 옵션을 포함시키는 것이 좋습니다 . utc현지 시간은희미한일광 절약 시간제, 예상치 못한 시간 변경 등으로 인해

가변 날짜 문자열 형식(BSD)을 허용하는 다른 날짜 구현이 있습니다. 그러나 busybox는 매우 작은 실행 파일이며 많은 유틸리티를 대체할 수 있어 매우 유용합니다.

답변4

GNU 날짜가 있으므로 GNU awk도 있거나 얻을 수 있습니다.

$ start="23/07/2021 14:44"
$ awk -v start="$start" 'BEGIN{split(start,d,"[/ :]"); print mktime(d[3]" "d[2]" "d[1]" "d[4]" "d[5]" 0")}'
1627069440

위의 내용은 TZ 설정을 사용하거나 UTC의 경우 mktime()에서 UTC 플래그를 설정할 수 있습니다.

$ awk -v start="$start" 'BEGIN{split(start,d,"[/ :]"); print mktime(d[3]" "d[2]" "d[1]" "d[4]" "d[5]" 0",1)}'
1627051440

관련 정보