Unixの日付を繰り返します。

Unixの日付を繰り返します。

かなり基本的な作業がありますが、適切な解決策が見つかりません。 2008年から現在までの日付間隔を繰り返し、各繰り返しに対してエポック値を繰り返す必要があります。私も年、半期、月を繰り返すことに興味があります。
私はこのようなスクリプトを書いた。

#!/bin/bash
initial_date=`date -d "2008-02-04 00:00:00 UTC" +%s`
end_date=`date +%s`
n=0
until [ $initial_date -gt $end_date ]; do
 echo $initial_date
 let n+=1
 readable_date=`date +"%Y-%m-%d %T" -d "1970-01-01 $initial_date sec"`
 echo $readable_date
 readable_date=`date -d "$readable_date + $n year"`
 initial_date=`date -d "$readable_date" +%s`
done

しかし、その出力は私にとってやや奇妙に見えます。

1202083200
2008-02-0400:00:00
1233702000
2009-02-03二十三:00:00
1265230800
2010-02-0320日:00:00
1296756000
2011-02-0318:00:00
1328277600
2012-02-0315:00:00
1359885600
2013-02-0311:00:00
1391403600
2014-02-0306:00:00
1422918000
2015-02-02二十三:00:00
1454425200
2016-02-0215:00:00

年が正しく増加しないのはなぜですか?私が見ると、タイムシフトはunix>> UTC>> unix変換の副作用のようです。これを行う直接的な(再送信なし)方法はありますか?

ポリスチレン
はい、確認しました。これこれそしてこれ質問はこれを行う明確な方法を見つけることができません。それらのすべては助けを借りて数字を加えて日付を変換することに基づいていますが、これは私にとって正確ではないようです。

はい、最初の日付を追加することを検討しましたが、60*60*24*30*365それは正しいですか?この方法は、うるう年、31日で構成される月などを考慮しません。

答え1

使用日:

$ dateA="2008-02-04 00:00:00 UTC"

時変日付を取得する最初の理由は、「ローカル」日付を要求することです。

$ date -d "$dateA"
Sun Feb  3 19:00:00 EST 2008

UTC時間を指定するとエラーが修正されます。

$ TZ=UTC0 date -d "$dateA"
Mon Feb  4 00:00:00 UTC 2008

または、より良い方法は(使用する習慣を聞く)-u日付オプションを使用することです。

$ date -ud "$dateA"
Mon Feb  4 00:00:00 UTC 2008

2番目の理由は、ロゴと共に「関連項目」を要求することです。

$ date -ud "$(date +"%Y-%m-%d %T" -ud "$dateA") +1 year"  ### wrong
Tue Feb  3 23:00:00 UTC 2009

$ date -ud "$(date +"%Y-%m-%d %T" -ud "$dateA") 1 year"  ### better
Mon Feb  4 00:00:00 UTC 2008

しかし、「timezone」(-z)を使用すると、通常、すべての時間問題が消えます。

$ date -ud "$(date +"%Y-%m-%d %T %z" -ud "$dateA") +1 year"  ### Best
Wed Feb  4 00:00:00 UTC 2009

$ date -ud "$(date +"%Y-%m-%d %T %z" -ud "$dateA") 1 year"  ### Preferred
Wed Feb  4 00:00:00 UTC 2009

問題は、日付文字列の解析方法に関するものです。 TZ値がないと、+ 1がタイムゾーン値として解釈される可能性があります。

$ date -ud "2008-02-04 00:00:00 +3 year"
Tue Feb  3 21:00:00 UTC 2009

TZの環境値が設定されていても:

$ TZ=UTC0 date -ud "2008-02-04 00:00:00 +3 year"
Tue Feb  3 21:00:00 UTC 2009

うん、太陽が増えた。一度(2008年の代わりに2009年)、+3提示された時間を変更するために使用されました(意図しない)。

繰り返します。問題は、+3タイムゾーンの値に解析できることです。


あるいは、(epoch)秒を日付に変換するには、GNU Dateで「@」を使用できます。

$ dateAsec="$( date -ud "$dateA" +"%s" )

$ date -ud @"$dateAsec"
Mon Feb  4 00:00:00 UTC 2008

(newdate)関数を使用するスクリプトは、次のように書くことができます。

#!/bin/bash
dateI="$(date -ud "2008-02-04 00:00:00 UTC" +%s)"
dateF="$(date -u +%s)"

newdate(){ date -ud "$(date +"%Y-%m-%d %T %z" -ud @"$dateI") $1 year" +"%s"; }

n=0
while 
    dateN="$( newdate "$n" )"
    (( dateN < dateF ));
do
    dateNhuman="$(date +"%Y-%m-%d %T %z" -ud @"$dateN")"
    echo "dateN=$dateN --- $dateNhuman ---> $dateF $(( $dateF - $dateN )) $n"
    (( n++ ))
done

結果:

dateN=1202083200 --- 2008-02-04 00:00:00 +0000 ---> 1470543626 268460426 0
dateN=1233705600 --- 2009-02-04 00:00:00 +0000 ---> 1470543626 236838026 1
dateN=1265241600 --- 2010-02-04 00:00:00 +0000 ---> 1470543626 205302026 2
dateN=1296777600 --- 2011-02-04 00:00:00 +0000 ---> 1470543626 173766026 3
dateN=1328313600 --- 2012-02-04 00:00:00 +0000 ---> 1470543626 142230026 4
dateN=1359936000 --- 2013-02-04 00:00:00 +0000 ---> 1470543626 110607626 5
dateN=1391472000 --- 2014-02-04 00:00:00 +0000 ---> 1470543626 79071626 6
dateN=1423008000 --- 2015-02-04 00:00:00 +0000 ---> 1470543626 47535626 7
dateN=1454544000 --- 2016-02-04 00:00:00 +0000 ---> 1470543626 15999626 8

歳月が流れ、すべてが正しいようです。

答え2

イテレータのオン相対日付出発点でもっと意味があるかもしれません。

#!/usr/bin/env bash

START='2008-02-04 00:00:00 UTC'
END=$( date +%s )

for yearnum in $( seq 1 999 ); do
  NUDATE=$( date -d "$START + $yearnum year" +%s )
  PUNY_HUMAN_DATE=$( date -d "@$NUDATE" "+%Y-%m-%d %T %Z" )
  if [[ $NUDATE -gt $END ]]; then
    break
  fi
  echo $NUDATE $PUNY_HUMAN_DATE
done

結果は次のとおりです。

-bash-4.1$ bash iter
1233705600 2009-02-04 00:00:00 UTC
1265241600 2010-02-04 00:00:00 UTC
1296777600 2011-02-04 00:00:00 UTC
1328313600 2012-02-04 00:00:00 UTC
1359936000 2013-02-04 00:00:00 UTC
1391472000 2014-02-04 00:00:00 UTC
1423008000 2015-02-04 00:00:00 UTC
1454544000 2016-02-04 00:00:00 UTC
-bash-4.1$ 

関連情報