BSDで自然言語の日付を解析します。

BSDで自然言語の日付を解析します。

私はGNU dateコマンドを使って任意の自然言語の日付を解析します。たとえば、特定の時代のタイムスタンプが最後の週であるかどうかを検出するには、次のようにします。

if [ "$timestamp" -lt "$(date +"%s" -d "last sunday")" ]; then ...

これで、スクリプトをFreeBSDに移植しようとすると、同じ機能をどのように取得できますか?man date私が何か明確なものを見逃していない限り、私は約束を示していません。

答え1

たくさんありますFreeBSDのコマンドは、GNUと同じAPIを使用してdateユーザーの自然言語の日付を入力します。。私はちょうどその日付をUnixの時代に変換することを欺く方法を見つけました。

/usr/sbin/fifolog_reader -B 'last sunday' /dev/null 2>&1 |
  sed 's/^From[[:blank:]]*\([0-9]*\).*/\1/p'

(少なくとも私が試したFreeBSD 9.1-RELEASE-p2では、UTCタイムゾーンにあり、認識する日付仕様がGNUが認識する日付仕様と必ずしも同じではない場合にのみ安定して動作するようです。日付)。

一部のシェルにはこの機能が組み込まれています。

ksh93:

if (( timestamp < $(printf '%(%s)T' 'last sunday') )); then

zsh:

autoload calendar_scandate
calendar_scandate 'last sun'
if (( timestamp < REPLY)); then...

またはインストールされている場合は、perl次のものを使用できます。Date::Manip

last_sun=$(perl -MDate::Manip -e 'print UnixDate("last sunday","%s")')
if [ "$timestamp" -lt "$last_sun" ]; then...

または:

if perl -MDate::Manip -e 'exit 1 unless $ARGV[0] < UnixDate("last sunday","%s")
    ' "$timestamp"; then....

ファイルタイムスタンプを確認することが目的であれば、FreeBSDは次のものをサポートしているfindことに注意してください。

find file -prune -newermt 'last sunday'

この場合、今週の開始(日曜日から始まる週)が必要な場合は、次のことができます。

week_start=$(($(date '+%s - 86400*%w - 3600*%H - 60*%M - %S')))

これはGNUとFreeBSD(またはサポートされているシステム)で機能します%s

夏時間を使用する時間帯では、夏時間の切り替え前後に1時間の遅延があります。

答え2

おそらく互換性を保証する最良の方法は、FreeBSDシステムにGNU日付をインストールすることです。

coreutilsFreeBSDポートコレクションからこのパッケージをインストールできます。その後、GNU dateコマンドが/usr/local/bin/gdate

答え3

自然言語で簡単に表現できるすべての操作では機能しない場合がありますが、FreeBSDには個々の日付フィールドにランダム値と相対値を設定できる演算子があり、date必要-vに応じて繰り返すことでほとんどの効果を生成できます。

たとえば、最後の日曜日を取得するには、次のようにフルタイムフィールド0を適用し、次に平日0を適用します。

date -v0S -v0M -v0H -v0w

したがって、Bashで「Linuxで実行しているのかBSDで実行しているのか、前の日曜日以降の秒数を教えてください」は次のようになります.

last_sunday_start() {
    if [ "$(uname)" = "Linux" ]; then
        date +"%s" -d "next sunday -1 week"
    else
        date -v0S -v0M -v0H -v0w +"%s"
    fi
}

date「日曜日に00:00:00が発生した最後の時間」を取得しようとすると、質問のGNUの例は正しくありません。日曜日に呼び出すと、前の日曜日の開始時刻が返されます。上記のコードはGNU日付/時刻仕様も変更します。

関連情報