busybox의 날짜 명령이 형식화된 입력 날짜를 허용하지 않습니다.

busybox의 날짜 명령이 형식화된 입력 날짜를 허용하지 않습니다.

datebusybox 명령(BusyBox v1.21.0)을 사용하여 날짜를 설정하고 싶습니다. 내 컴퓨터에 설정하려는 사용자 정의 날짜는 다음과 같은 형식입니다.

Tue, 15 Jan 2019 10:46:13 GMT

date명령은 다음 문자열을 사용하여 동일한 형식으로 날짜를 인쇄할 수 있습니다.

date +"%a, %d %b %Y %T %Z"

위와 동일한 형식으로 날짜를 반환합니다. 하지만 -s옵션을 사용하여 날짜를 설정하면 이를 허용하지 않습니다.

예를 들어 다음은 실패합니다.

date -u +"%a, %d %b %Y %T %Z" -s "Wed, 17 Feb 2010 19:14:32 UTC"
date: invalid date 'Wed, 17 Feb 2010 19:14:32 UTC'

busybox 명령의 기능이 축소되었다는 것을 알고 있지만 형식 문자열을 처리하여 현재 날짜를 원하는 형식으로 인쇄할 수 있으면서도 이를 사용하여 입력 문자열을 해석할 수 있어야 한다고 생각합니다.

답변1

busybox는 date임의의 시간 형식이 아닌 매우 구체적인 시간 형식만 허용합니다.

$ busybox date --help
[...]
    [-s,--set] TIME Set time to TIME
[...]
Recognized TIME formats:
    hh:mm[:ss]
    [YYYY.]MM.DD-hh:mm[:ss]
    YYYY-MM-DD hh:mm[:ss]
    [[[[[YY]YY]MM]DD]hh]mm[.ss]
    'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead

date -s 2010.02.17-19:14:32따라서 다음과 같이 (또는 원하는 형식으로) 작성하면 됩니다 .

답변2

-D입력 형식을 지정하고 일반적으로 +...출력 형식을 지정하여 -d참조 날짜와 시간을 제공하기 위해 비지박스 날짜가 형식 변환을 수행하도록 할 수 있습니다 . 예를 들어,

r='Tue, 15 Jan 2019 09:16:53 GMT'
d=$(busybox date -d "$r" -D "%a, %d %b %Y %T %Z" +'%Y-%m-%d %H:%M:%S')
# d becomes 2019-01-15 09:01:53
busybox date -s "$d"

답변3

일부 버전의 busybox 날짜는 -D옵션을 사용하여 사용자 정의 형식을 입력으로 허용합니다. 그러나 한 시간이 지나면 이 옵션은 시간대 형식을 지원하지 않습니다 %Z.

C 지원되는 모든 형식 목록 strftime:C 라이브러리 함수 - strftime()

참고: +입력 형식으로 사용하려면 먼저 출력 형식의 시작 부분에서 제거 해야 합니다 -D. 예를 "+%FT%T%z"들어 -D "%FT%T%z".

일반직 전환

## Date context for other commands
# date -Iminutes
2021-04-01T13:30+0000

# date -u -D '%b %e %Y' -d "Apr 1 2021"
Thu Apr  1 00:00:00 UTC 2021

# date -u -d "2021 04xx25" -D '%Y %mxx%d'
Sun Apr 25 00:00:00 UTC 2021

# date -u -d "5 12:35:58" -D "%e %H:%M:%S"
Mon Apr  5 12:35:58 UTC 2021

시간대 포함

## Format returned by `openssl x509 -enddate`
# date -u +"%b %e %H:%M:%S %Y %Z"
Apr  1 13:33:58 2021 UTC

# # date -u -D "%b %e %H:%M:%S %Y %Z" -d "Apr  1 13:33:58 2021 UTC"
date: invalid date 'Apr  1 13:33:58 2021 UTC'


## removing the %Z timezone from the input:
# date -u -D "%b %e %H:%M:%S %Y" -d "Apr  1 13:33:58 2021 UTC"
Thu Apr  1 13:33:58 UTC 2021

## yet providing %Z in output format works well
# date -u -D "%b %e %H:%M:%S %Y" -d "Apr  1 13:33:58 2021 UTC" +"%F %T %Z"
2021-04-01 13:33:58 UTC

Busybox 버전 및 날짜 도움말

Alpine Linux를 실행하는 컨테이너busybox v1.32.1

# uname -a
Linux f4d750b1edf8 4.19.121-linuxkit #1 SMP Thu Jan 21 15:36:34 UTC 2021 x86_64 Linux
# busybox date --help
BusyBox v1.32.1 () multi-call binary.

Usage: date [OPTIONS] [+FMT] [TIME]

Display time (using +FMT), or set time

        [-s,--set] TIME Set time to TIME
        -u,--utc        Work in UTC (don't convert to local time)
        -R,--rfc-2822   Output RFC-2822 compliant date string
        -I[SPEC]        Output ISO-8601 compliant date string
                        SPEC='date' (default) for date only,
                        'hours', 'minutes', or 'seconds' for date and
                        time to the indicated precision
        -r,--reference FILE     Display last modification time of FILE
        -d,--date TIME  Display TIME, not 'now'
        -D FMT          Use FMT (strptime format) for -d TIME conversion

Recognized TIME formats:
        hh:mm[:ss]
        [YYYY.]MM.DD-hh:mm[:ss]
        YYYY-MM-DD hh:mm[:ss]
        [[[[[YY]YY]MM]DD]hh]mm[.ss]
        'date TIME' form accepts MMDDhhmm[[YY]YY][.ss] instead

답변4

netinstall을 통해 Debian 11.2를 설치할 때 시스템 날짜가 실제 날짜보다 45일 빨라서 문제가 발생했습니다. 다음 명령을 통해 날짜를 업데이트해야 합니다 date +"2021-12-20 12:37:00" . 이는 busybox로 인해 일반적인 날짜 명령과 약간 다릅니다.

관련 정보