問題を単純化するために、変数(2015年10月15日を表す)があるとしましょう。
dat="10152015"
結果は次のdat
とおりです。10142015
今日の日付は使用しません。
私が経験している問題は、日付を1日減らす方法を見つけることです。 4番目の桁だけを減らしても構いませんが、これはカレンダーです。
私の現在のアイデアは、それをUnixが理解する形式(それが何でも)に変換し、そこで作業を試みてから答えを再変換することです。
答え1
GNU日付が必要です。
dat="10152015"
date -d "${dat:4}${dat:0:4} yesterday" +%m%d%Y
YYYYMMDD
ISO 9601日付形式であり、MMDDYYYY
圧縮されたUS形式は、通常の部分文字列拡張を使用して半分を交換するだけでその形式に変換できます。
これにはgnuの日付が必要ですが、他のバージョンの日付は現在ではない時刻表示をサポートしていないと思います。
答え2
最初は、sed
ユーザーが提供した10152015形式をコマンドとそのオプションmm/dd/yyyy
のGNU実装で理解できる形式に変換するために使用されました。これはスラッシュを挿入して元の日付を反映することによって行われます。このフォーマットされた日付値はに保存されます。次に、印刷出力形式を「mmddyyyy」と呼び、現在の日付として使用されている日付を印刷するように指示します。date
-d
sed
/
D
date
yesterday
$D
#!/bin/sh
D=$(echo "${1-10152015}" | sed 's,^\(..\)\(..\)\(....\)$,\1/\2/\3,')
date +%m%d%Y -d"$D yesterday"
答え3
bash
日付操作機能は非常に制限されているため、日付の計算に最適なシェルではありません。
そしてzsh
:
zmodload zsh/datetime
d=03012012
strftime -rs d %m%d%Y%H ${d}12
strftime %m%d%Y $((d-86400))
そしてksh93
:
d=03012012
printf "%(%m%d%Y)T\n" "${d:4}${d:0:4} yesterday"
を使用するには、bash
手動で計算を実行するか、perl
このユーティリティの一部のGNUまたはFreeBSD拡張に依存する必要がありますdate
。
答え4
注: 以下は、GNU coreutils の GNU 日付を想定しています。他のユーティリティがある場合は、システムの日付に合わせて調整してくださいdate
。
あなたの考えが正しいです。エポック(1970年1月1日00:00:00)以降の秒単位に変換する必要があります。
GNU Dateは解釈する日付形式が非常に柔軟ですが、MMDDYYYYはそのうちの1つではありません。幸いなことに、sedを使用して日付をYYYY-MM-DD形式に再フォーマットした後、データに入力できます。date -d
dat="10152015"
secs=$(date +%s -d $(echo "$dat" | sed -e 's/\(..\)\(..\)\(....\)/\3-\1-\2/'))
newsecs=$((secs - 86400))
date -d "@$newsecs"