bashでYYYYMMDDHHMMSS形式にX年を追加するには?

bashでYYYYMMDDHHMMSS形式にX年を追加するには?

我慢してください。私は強くありませんbash。文字YYYYMMDDHHMMSS列形式の日付/時刻があります。20031005000000私は1年を加えることを好む。読みましたman dateが、内容を説明するのは少し難しいです。しかし、-d私はWWWで多くの例を基本的に理解して選択したと思います。-s

私が読んだ多くの内容のいくつかは次のとおりです。

それで、現在は現在の日付に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 datehttps://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これをテストしました。

関連情報