我慢してください。私は強くありませんbash
。文字YYYYMMDDHHMMSS
列形式の日付/時刻があります。20031005000000
私は1年を加えることを好む。読みましたman date
が、内容を説明するのは少し難しいです。しかし、-d
私はWWWで多くの例を基本的に理解して選択したと思います。-s
私が読んだ多くの内容のいくつかは次のとおりです。
- https://stackoverflow.com/questions/46411970/add-x-days-to-a-pspecial-date-in-bash
- https://stackoverflow.com/questions/25619923/bash-convert-date-to-timestamp
- https://stackoverflow.com/questions/18706823/how-to-increment-a-date-in-a-bash-script
それで、現在は現在の日付に1年を加える方法を知っています。
myDatePlusOneYr=$(date -d "+365 days" '+%Y%m%d%H%M%S')
one year
期間(HHMMSS)なしで日付を追加できます。
myDate="20031005"
date -d "$myDate +365 day"
Mon Oct 4 00:00:00 GMT 2004
しかし、日付/時刻形式に年を追加する方法が見つかりませんでした。期間で2番目のオプションを使用しようとすると、次のエラーメッセージが表示されます。
date: invalid date `20031005000000 +365 day'
backtick
日付/時刻の開始と終了を確認しましたsingle quote
。エラーメッセージを解釈する方法がわかりません。アドバイスありがとうございます。
更新:次の質問に対する答えが見つかりましたinvalid date
。https://stackoverflow.com/questions/4197606/how-to-convert-yyyymmddhhmmss-to-a-date-reader-by-date
答え1
過度に単純化したかもしれませんが、
% expr 20091005000000 + 10000000000
20101005000000
答え2
文字列を数値として扱うことができます。
#/bin/sh
date='20000229000000'
echo "$((date + 10000000000))"
Print20041005000000
もちろん、日付がうるう年2月29日の場合は動作しませんが、唯一の例外です。文字列を複数の部分に分割し、うるう日を特別なケースにすることで、この問題を処理できます。
#!/bin/bash
date='20000229000000'
# assume it's correctly formatted
y=${date:0:4}
m=${date:4:2}
d=${date:6:2}
t=${date:8}
if [[ $m == 02 && $d == 29 ]]; then
m=03
d=01
fi
echo "$((y+1))$m$d$t"
一部のシェル(Bashを含む)では、算術演算はゼロで始まる数字を次のように処理します。8進数しかし、私たちは年に対してのみ算術を行い、前にゼロがあってはいけません。
答え3
この答えは3つのシェルコマンドを呼び出して行うので、気に入らないがうまくいきます。から始まるmyDate="20031005010203"
私はそれに別の1年を追加したいと思います。醜い方法は、解凍し、最初の8文字をYYYYMMDDとして処理し、年を追加してから、dateコマンドを使用して結果をフォーマットすることです。時間を時間値に再接続します。私のテストデータには20040229(有効なうるう年)を使用してください。
myDate="20040229010203"
datebit=$(echo $myDate | cut -c 1-8)
timebit=$(echo $myDate | cut -c 9-)
newdate=$(date -d "$datebit +1 year" +"%Y%m%d${timebit}")
echo "${newdate}"
入力はで、20040229010203
出力はでなければなりません20050301010203
。
したがって、「2004年2月29日01:02:03に始まる年度」は「2005年3月1日01:02:03」となります。
標準コマンドを使用してUbuntuでdate
これをテストしました。