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時間の遅延があります。

おすすめ記事