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オプションを使用してカスタム形式を入力として受け入れます。ただし、1時間経過すると、このオプションはタイムゾーン形式をサポートしません%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のため、通常の日付コマンドとは若干異なります。

関連情報