우리가 시간을 재는 방식은 좀 엉망이에요. 1분은 60초이고, 1시간은 60분이에요. 이것은 60을 수 체계의 기반으로 삼았던 고대 바빌로니아에서 비롯되었어요. 하루는 24시간이고, 일주일은 7일이며, 한 달은 며칠일까요? 글쎄요, 한 달의 날짜 수는 어느 달인지뿐만 아니라 사는 나라에서 어떤 종류의 달력을 사용하는지에 따라서도 달라져요.
그렇다면 시간 간격을 표현할 때 초만 사용하면 어떨까요? 그러면 많은 수의 초를 훨씬 알아보기 쉬운 단위로 적기 위해 미터법 접두사를 사용할 수 있어요.
언젠가 화성이나 다른 행성을 개척하게 된다면, 시간을 재는 일은 훨씬 더 엉망이 될 거예요. 누군가 "year"라고 말할 때 지구의 1년을 뜻하는 걸까요, 아니면 화성의 1년을 뜻하는 걸까요?
이 연습 문제의 아이디어는 작가 Vernor Vinge의 SF 소설 "A Deepness in the Sky"에서 나왔어요. 소설에서 작가는 미터법을 시간 측정의 기반으로 사용해요.
특정 날짜로부터 기가초가 하나 지난 뒤의 날짜와 시간을 구하는 것이 과제예요.
기가초는 10억 초예요. 1 뒤에 0이 아홉 개 붙은 수죠.
2015년 1월 24일 22:00(오후 10시) 에 태어났다면, 기가초가 되는 날은 2046년 10월 2일 23:46:40(오후 11시 46분 40초) 예요.
bash에는 날짜와 시간 문자열을 파싱하는 내장 기능이 없어요.
이 연습 문제에서는 외부 도구를 호출해야 해요.
date 명령의 -d 옵션은 다양한 형식을 파싱할 수 있어요.date 명령과 그 -f 옵션을 참고해요.Time::Piece 모듈로 타임스탬프를 파싱할 수 있어요.bash는 외부 도구 없이도 날짜를 포맷할 수 있어요.
정수 시간 값(에포크 이후 초)이 주어지면, printf의 %()T 포맷터로 "strftime" 스타일 포맷팅을 적용할 수 있어요.
epoch=1234567890
printf '%(%Y-%m-%d %H:%M:%S)T\n' "$epoch"
# ==> 2009-02-13 18:31:30
# bash uses the `TZ` environment variable for the timezone.
TZ=Asia/Kolkata printf '%(%Y-%m-%d %H:%M:%S)T\n' "$epoch"
# ==> 2009-02-14 05:01:30