روش ما برای اندازهگیری زمان کمی درهموبرهم است. در یک دقیقه ۶۰ ثانیه داریم و در یک ساعت ۶۰ دقیقه. این از بابل باستان میآید، جایی که ۶۰ را مبنای دستگاه اعداد خود قرار میدادند. یک روز ۲۴ ساعت دارد، یک هفته ۷ روز. اما یک ماه چند روز دارد؟ خب، تعداد روزهای یک ماه نه تنها به این بستگی دارد که کدام ماه است، بلکه به این هم بستگی دارد که در کشور محل زندگی شما از چه نوع تقویمی استفاده میشود.
چه میشود اگر بهجای این، برای بیان بازههای زمانی فقط از ثانیه استفاده کنیم؟ در آن صورت میتوانیم برای نوشتن تعداد زیادی ثانیه به شکل کمیتهایی که فهمشان راحتتر است، از پیشوندهای دستگاه متریک استفاده کنیم.
اگر روزی مریخ یا سیارهی دیگری را مستعمره کنیم، اندازهگیری زمان حتی درهموبرهمتر هم میشود. اگر کسی بگوید «سال»، منظورش سال روی زمین است یا سال روی مریخ؟
ایدهی این تمرین از رمان علمیتخیلی «A Deepness in the Sky» نوشتهی نویسنده ورنر وینج گرفته شده است. در آن، نویسنده از دستگاه متریک به عنوان مبنای اندازهگیری زمان استفاده میکند.
وظیفهی شما تعیین تاریخ و زمانی است که یک «گیگاثانیه» پس از یک تاریخ مشخص رخ میدهد.
گیگاثانیه برابر است با هزار میلیون ثانیه. یعنی عدد ۱ و بعد از آن ۹ صفر.
اگر در ۲۴ ژانویه ۲۰۱۵، ساعت ۲۲:۰۰ (۱۰:۰۰:۰۰ شب) به دنیا آمده باشید، در ۲ اکتبر ۲۰۴۶، ساعت ۲۳:۴۶:۴۰ (۱۱:۴۶:۴۰ شب) یک گیگاثانیه سن خواهید داشت.
bash هیچ روش توکاری برای تجزیهی رشتههای تاریخ و زمان ندارد.
این تمرین میخواهد که سراغ یک ابزار بیرونی بروید.
-d در دستور date گنو میتواند انواع گستردهای از قالبها را تجزیه کند.date در BSD و گزینهی -f آن را ببینید.Time::Piece آن برای تجزیهی مهرهای زمانی استفاده کرد.bash میتواند بدون هیچ ابزار بیرونی، تاریخها را قالببندی کند.
اگر یک مقدار زمانی صحیح (ثانیه از مبدأ زمان) داشته باشید، قالببند %()T در printf میتواند قالببندیای به سبک «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