
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
ここそれは命令です。
ここフォーマットオプションです。