특정 초를 날짜로 변환하고 싶습니다. 내 경우에는 0001년 1월 1일 이후 경과된 초 수입니다.
에포크 이후 몇 초가 지났다면 쉽습니다 $ date -r nr_of_seconds
. date
특정 날짜에 시작하도록 알려주는 방법이 있으면 좋을 것 같습니다. 그러한 옵션이 있습니까( -v
내 요구 사항을 거의 충족하는 것 같습니다...제 생각에는)?
저는 Mac을 사용하고 있습니다.
답변1
date -r
작업이 거의 완료되었습니다. 여러분이 해야 할 일은 원점을 이동하는 것뿐입니다. 이는 가산적입니다.
date -r $((number_of_seconds - epoch))
epoch
1970년 1월 1일과 1970년 1월 1일 사이의 초 수는 어디에 있습니까? 값은 epoch
달력에 따라 다릅니다.
그레고리력에서는 1년부터 1970년까지 477번의 윤년이 있으므로 365 * 1969 + 477 = 719162일 = 62135596800초가 됩니다. 이 숫자는 2 32 보다 크므 로 이를 처리하려면 64비트 연산이 가능한 셸이 필요합니다. 그것이 서기 2세기 이후의 날짜를 나타낸다면 어쨌든 당신은 232number_of_seconds
세 이상입니다 . 내 생각에는 bash가 이전 32비트 OSX에서도 64비트 산술을 지원한다고 생각하지만 확실하지는 않습니다.
date -r $((number_of_seconds - 62135596800))
답변2
다음을 사용할 수 있습니다.
echo $(( `date +%s` - ` date --date=yesterday +%s ` ))
86400
"어제"를 원하는 날짜로 바꿀 수 있습니다. 예를 들어:
echo $(( `date +%s` - ` date --date='Tue Aug 9 11:44:34 CEST 2014' +%s ` ))
259209
GNU/Linux에서 테스트되었습니다.
답변3
문제는 모든 사람이 1923년 이전 날짜에 동의하는 것은 아니라는 것입니다. 우리(서구인)는 이제 그레고리력을 사용합니다. 1582년 이전에는 사람들이 율리우스력을 사용했습니다. 일부 사람들은 1582년에서 1923년 사이에 이들 중 하나를 사용했습니다.
예를 들어, 영국은 1752년에 그레고리력으로 전환했는데, 이것이 cal
이 명령에서 사용되는 전환점입니다. 출력을 봅니다 cal 9 1752
.
따라서 1654년 11월 3일을 언급하는 오래된 영어 문서를 찾는 경우 해당 날짜는 1654년 11월 3일을 언급하는 프랑스 문서와 반드시 동일하지는 않습니다 . 당시 프랑스와 영국은 모두 0001-01-01이 무슨 날짜인지(즉, 그날 무슨 일이 일어났는지)에 동의했지만, GNU가 date
날짜로 간주한 날짜는 아니었습니다.
나는 동일한 달력 스위치를 사용 cal
하고 윤초를 무시하여 임의의 날짜 계산을 수행하는 일부 POSIX 쉘 함수를 작성한 적이 있습니다. 다음에서 찾을 수 있습니다:https://github.com/stephane-chazelas/misc-scripts/blob/master/wide_strftime.sh
예를 들어, 0001-01-01 00:00:00 GMT 율리우스력 이후 10G초의 날짜를 알고 싶다면(하루에 86400초를 가정하므로 모든 초가 같은 시간 동안 지속되는 것은 아닙니다):
$ timegm 1 1 1 0 0 0
$ wide_strftime "%c" "$((REPLY + 10000000000))"
echo "$REPLY"
$ echo "$REPLY"
Mon Nov 18 17:46:40 0317