日付変数を使用しますが、書式を指定してください。

日付変数を使用しますが、書式を指定してください。

シェルスクリプトには次の変数があります。
datestamp=$(date '+%Y-%m-%d_T%H-%M-%S')
datestamp_pretty=$(date '+%m/%d/%Y at %I:%M:%S %p')

1つ目は出力ファイル名の一部として使用され、2つ目はファイルの内容内で読みやすい日付と時刻を表示するために使用されます。個別に作成されるため、秒が若干ずれる場合があります。単一の日付変数を生成してから、2つの異なる方法でフォーマットする方法はありますか?それでは、これはどのように達成されますか?

答え1

GNUを使用している場合、これは非常に簡単ですdate

まず、で最も一般的な時間形式を取得しますdate。私はエポックの時間を取得することを選択しました。

epoch=$(date +%s)

次に、所望の回数に関係なく、所望の形式にエポックを変換する。

datestamp=$(date -d @$epoch '+%Y-%m-%d_T%H-%M-%S')
datestamp_pretty=$(date -d @$epoch '+%m/%d/%Y at %I:%M:%S %p')

これは常に最初のキャプチャ時間を示す必要があります$epoch

GNUがなければ、date時代を人間の日付に変換する別の方法が必要です。

答え2

これはGNUを必要とせず、何度もdate 実行する必要がない方法です。date

日付/時刻文字列に決して表示されない文字列を選択してください。単一文字にすることができます(たとえば、~および^)  |。しかし、デモ用に使います  /foo/

日付文字列形式を選択した文字列に関連付けます。 (2番目の形式から削除されました  +。)出力をdate変数としてキャプチャし、区切り文字列から分割します。

combined=$(date '+%Y-%m-%d_T%H-%M-%S/foo/%m/%d/%Y at %I:%M:%S %p')
datestamp="${combined%/foo/*}"
datestamp_pretty="${combined#*/foo/}"

関連情報