非GNUシステムで1125日前からの日付を計算しますか?

Unix Bashコマンドラインで、基本オペレーティングシステム(PerlやPythonなしなど)を使用して1125日前の日付を計算したい。

GNU Date を実行しているシステムでは、次のようなことができます:

ubuntu $ date --date="1125 days ago" Wed Nov 7 15:12:33 PST 2007 

FreeBSDまたはMacOSXシステムはGNUDateに同梱されておらず、「X日前」のような値をサポートしていません。

freebsd81 $ date --date="+1125 days ago" date: illegal option -- - 

I MacまたはFreeBSDシステムで数日前の日付を計算できますが、これは数日に制限されています:

# Today is really Dec 6, 2010. 4 days ago it was: macosx $ TZ=GMT+96 date +%Y%m%d 20101202 # But that doesn"t work if I want to see the date 8 days ago: macosx $ TZ=GMT+192 date +%Y%m%d 20101206 

できますかPerlやPythonなどのツールを調べずに、GNU以外のシステムで古い日付を計算しますか?または、より強力なスクリプト言語を使用する必要がありますか?

回答

まあ、次のような卑劣なことをすることができます:

 $ echo "`date +%s` - (1125 * 24 * 60 *60)" |bc 1194478815 $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 

OpenBSD(gnuベースではない日付)でテストされ、動作しているようです。

段階的に分解します:

  • 現在のUNIX時間を取得します(UNIXエポックの開始からの秒数):
 $ date +%s 1291679934 
  • 1125の秒数を取得します日
 $ echo "1125 * 24 * 60 *60" | bc 97200000 
  • 一方を他方から差し引く(1291679934-97200000)= 1194478815

  • 新しいunixtime(1194478815)を使用して、きれいな日付を印刷します

     $ date -r 1194478689 Wed, 07 Nov 2007 18:38:09 -0500 
  • 代わりに、solarisでこれを実行して日付を印刷できます*:

    /bin/echo "0t1194478815>Y\n<Y=Y" |adb

* http://www.sun.com/bigadmin/shellme/

また、dateコマンド**から現在のタイムスタンプを取得するためのSolarisの代替手段は次のとおりです。

/usr/bin/truss /usr/bin/date 2>&1 | nawk -F= "/^time()/ {gsub(/ /,"",$2);print $2}"

** http://www.commandlinefu.com/commands/view/7647/unix-timestamp-solaris

コメント

<から参照ul class = "comments">

  • %sdate -rはBSDismであることに注意してください(ごく初期の頃から、'すべてのBSDプラットフォームにあります)。 ' System Vプラットフォームでそれらが表示されることを期待しないでください(たとえば、Solarisにはどちらもありません)。
  • ああ、Solaris、私があなたを愛している方法…(;
  • @Gilles:よろしいですか?Solarisには、/ usr / ucb / binなど、unixの他のバリエーションのバージョンを含むbinディレクトリが多数あります。SunOS4.Xは結局BSDベースでした。
  • うるう秒やカレンダーの変更など、間にある日のいずれかが60 * 60 * 24秒を超えるか下回る場合、これは失敗します。
  • @Sparr:良い点です。安全です。アプローチは、現在の絶対日付から現在の時刻を減算し、12 * 60 * 60を追加することです。これにより、10:59から13:01までの時刻が返されます。これに24時間の期間を追加して、対応する日付は安全です。
  • 回答

    前の回答は複雑すぎました。FreeBSD/ macOSにはivがあります MANページからのdateのid = “5d3ae13b14″>

    フラグ(簡略説明):

    調整します(つまり、現在の日付を取得して、調整の結果を表示します。実際には日付を設定しません)valに応じて、秒、分、時、月日、曜日、月、または年。 valの前にプラス記号またはマイナス記号が付いている場合、日付は残りの文字列に従って前方または後方に調整されます。それ以外の場合は、日付の関連部分が設定されます。これらのフラグを使用して、日付を必要な回数だけ調整できます。フラグは指定された順序で処理されます。

    したがって、目的に応じて、date -v1125dは必要な処理を実行します。

    $ date; date -v-1125d Thu 19 Oct 2017 11:35:25 EDT Sat 20 Sep 2014 11:35:25 EDT 

    回答

    同様の問題が発生していました

    dateutils pkg 。それは私にとって単純なpkg_adddateutilsでした。

    #!/bin/ksh # Using dateutils dadd (get current date) -1month -f (format to strftime) # Set Year in YYYY formant y is YY format lastMonth=$(dadd date -1mo -f "%Y.%m") echo $lastMonth mkdir /home/$usr/History/$lastMonth 

    ここに出力されるのは

    #2018.11 

    UPDATE 1

    2018.12.10にこのコマンドを実行しています

    HostNameHere# dadd date -1125d -f "%Y.%m" 

    結果

     2015.11 

    時間の加算または減算をサポートしています。印刷に役立つコマンドは次のとおりです。 #dadd -h(これは印刷物全体ではありません。オプションの詳細があります。

     Usage: dadd [OPTION]... [DATE/TIME] [DURATION] Add DURATION to DATE/TIME and print the result. If DATE/TIME is omitted but DURATION is given, read a list of DATE/TIMEs from stdin. If DURATION is omitted but DATE/TIME is given, read a list of DURATIONs from stdin. Durations are specified as nY, nMO, nW, or nD for years, months, weeks, or days respectively, or nH, nM, nS for hours, minutes, and seconds, where N is a (possibly negative) number. The unit symbols can be written lower-case as well (y, mo, w, d, h, m, s) and the unit symbol `d" can be omitted. Note that duration addition is not commutative! 2000-03-30 +1mo +1d -> 2000-05-01 2000-03-30 +1d +1mo -> 2000-04-30 

    ここにコマンドがあります。

    ここにフォーマットオプションがあります。

    コメント

    • (1)このプログラムが-1mo。質問のとおり、ユーザーが1125日前の日付を計算できることを示すことができますか?(2)質問にはベースを使用して"と書かれています。オペレーティングシステム(例:PerlまたはPythonなし)。"これにより、新しいパッケージを追加できなくなるようです。
    • @ G-Manコメントありがとうございます。 StackExchangeに貢献するのは初めてです。 お手伝いありがとう。 UPDATE1を参照してください

    コメントを残す

    メールアドレスが公開されることはありません。 * が付いている欄は必須項目です