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-03이십 일: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

두 번째 이유는 로고와 함께 "관련 항목"을 요구하기 위한 것입니다.

$ 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$ 

관련 정보