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

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

Unix Bashコマンドラインでデフォルトのオペレーティングシステム(PerlやPythonなど)を使用して1125日前の日付を計算したいと思います。

実行中のシステムでGNU日付、次のようにすることができます。

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

GNU DateはFreeBSDやMacOSXシステムには付属しておらず、「X日前」などの値はサポートしていません。

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

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

答え1

さて、次のような巧妙な作業を行うことができます。

$ echo "`日付+%s` - (1125 * 24 * 60 *60)" |bc
1194478815
$日付-r 1194478689
2007年11月7日水曜日18:38:09 -0500

OpenBSD(確かに現在まではGNUベースではない)でテストされており、動作しているようです。

段階的に分析してみてください。

  • 現在のunixtime(unix epochが開始されてからの秒数)を取得します。
  $日付+%s
  1291679934
  
  • 1125日の秒数を求めてください。
  $echo "1125*24*60*60" BC |
  97200000
  
  • 1つ減算 もう1つ (1291679934 - 97200000) = 1194478815

  • 新しいUnixtimeを使用して良い日付を印刷してください(1194478815)。

    $日付-r 1194478689
    2007年11月7日水曜日18:38:09 -0500
    
  • あるいは、Solaris では次のようにして日付を印刷できます*:

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

*参考資料http://www.sun.com/bigadmin/shellme/

また、Solarisのdateコマンドから現在のタイムスタンプを取得する別の方法は次のとおりです。

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

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

答え2

以前の回答はとても複雑でした。 FreeBSD/macOS には次の、-vフラグがあります。dateマニュアルページ(簡単な説明):

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

だからあなたの目的のために必要なdate -v1125dものだけをしてください

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

答え3

同様の問題があったことがわかりました。デートキットOpenBSD 6.4の場合。私にとって、それは単純なpkg_add dateutilsでした。

#!/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

アップデート1

2018.12.10でこのコマンドを実行しました。

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

結果

 2015.11

いつでも加算または減算をサポートします。これがhelpコマンドが出力する内容です。#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

ここそれは命令です。

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

関連情報