web-dev-qa-db-ja.com

非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システムはGNU Dateに同梱されておらず、「Xdaysago」のような値をサポートしていません。

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

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

# 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以外のシステムで古い日付を計算できますか?または、より強力なスクリプト言語を使用する必要がありますか?

6

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

 $ echo "` date +%s`-(1125 * 24 * 60 * 60) "| bc 
 1194478815 
 $ date -r 1194478689 
 Wed、 2007年11月7日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 
     2007年11月7日水曜日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 から参照

7
gabe.

以前の答えはあまりにも複雑でした。 FreeBSD/macOSには-vフラグ、dateMANページ (省略形の説明)から:

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

だからあなたの目的のために、date -v1125dあなたが必要なことをするだけです

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

私はOpenBSD6.4で 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

ここ はコマンドです。

ここ はフォーマットオプションです。

0
babyPenguin