সেকেন্ড
অতিবাহিত সময় পরিমাপ করতে (সেকেন্ডে) আমাদের প্রয়োজন:
- একটি পূর্ণসংখ্যা যা অতিবাহিত সেকেন্ড এবং এর গণনা উপস্থাপন করে
- যেমন পূর্ণসংখ্যাকে একটি ব্যবহারযোগ্য বিন্যাসে রূপান্তর করার উপায়।
অতিবাহিত সেকেন্ডের একটি পূর্ণসংখ্যা মান:
এই জাতীয় পূর্ণসংখ্যাকে একটি ব্যবহারযোগ্য বিন্যাসে রূপান্তর করুন
ব্যাশ অভ্যন্তরীণ printf
সরাসরি এটি করতে পারে:
$ TZ=UTC0 printf '%(%H:%M:%S)T\n' 12345
03:25:45
একভাবে
$ elapsedseconds=$((12*60+34))
$ TZ=UTC0 printf '%(%H:%M:%S)T\n' "$elapsedseconds"
00:12:34
তবে এটি 24 ঘন্টােরও বেশি সময়কালের জন্য ব্যর্থ হবে, কারণ আমরা আসলে কোনও দেয়ালের ঘড়ির সময় মুদ্রণ করি, সত্যিকার অর্থে কোনও সময়কাল নয়:
$ hours=30;mins=12;secs=24
$ elapsedseconds=$(( ((($hours*60)+$mins)*60)+$secs ))
$ TZ=UTC0 printf '%(%H:%M:%S)T\n' "$elapsedseconds"
06:12:24
বিশদ প্রেমীদের জন্য, বাশ-হ্যাকারস.আর্গ.এ. থেকে :
%(FORMAT)T
ফরমেট এর জন্য বিন্যাসের স্ট্রিং হিসাবে ব্যবহারের ফলে তারিখ-সময়ের স্ট্রিং আউটপুট করে strftime(3)
। সম্পর্কিত আর্গুমেন্টটি ইপোক , বা -1 (বর্তমান সময়) বা -2 (শেল প্রারম্ভকালীন সময়) থেকে সেকেন্ডের সংখ্যা । যদি কোনও সম্পর্কিত যুক্তি সরবরাহ না করা হয় তবে বর্তমান সময়টি ডিফল্ট হিসাবে ব্যবহৃত হয়।
সুতরাং আপনি কেবল কল করতে চাইতে পারেন textifyDuration $elpasedseconds
যেখানে আরও textifyDuration
একটি সময়কাল মুদ্রণের বাস্তবায়ন রয়েছে:
textifyDuration() {
local duration=$1
local shiff=$duration
local secs=$((shiff % 60)); shiff=$((shiff / 60));
local mins=$((shiff % 60)); shiff=$((shiff / 60));
local hours=$shiff
local splur; if [ $secs -eq 1 ]; then splur=''; else splur='s'; fi
local mplur; if [ $mins -eq 1 ]; then mplur=''; else mplur='s'; fi
local hplur; if [ $hours -eq 1 ]; then hplur=''; else hplur='s'; fi
if [[ $hours -gt 0 ]]; then
txt="$hours hour$hplur, $mins minute$mplur, $secs second$splur"
elif [[ $mins -gt 0 ]]; then
txt="$mins minute$mplur, $secs second$splur"
else
txt="$secs second$splur"
fi
echo "$txt (from $duration seconds)"
}
জিএনইউ তারিখ।
গঠনের সময় পেতে আমাদের প্রায় এক বছরের দৈর্ঘ্য এবং ন্যানোসেকেন্ড সহ বেশ কয়েকটি উপায়ে একটি বাহ্যিক সরঞ্জাম (জিএনইউ তারিখ) ব্যবহার করা উচিত।
তারিখের ভিতরে গণিত।
বাহ্যিক গাণিতিকের কোনও প্রয়োজন নেই, এটি সমস্ত ভিতরে এক ধাপে করুন date
:
date -u -d "0 $FinalDate seconds - $StartDate seconds" +"%H:%M:%S"
হ্যাঁ, 0
কমান্ড স্ট্রিংয়ে একটি শূন্য রয়েছে। এটি দরকার.
এটি ধরে নিয়েছে যে আপনি date +"%T"
কমান্ডকে কমান্ডে পরিবর্তন করতে পারেন date +"%s"
তাই মানগুলি সেকেন্ডে সংরক্ষণ করা (মুদ্রিত) হয়ে যাবে।
লক্ষ্য করুন যে কমান্ডটি সীমাবদ্ধ:
$StartDate
এবং $FinalDate
সেকেন্ডের ইতিবাচক মান ।
- এর মান এর
$FinalDate
চেয়ে বড় (পরে সময়ে) $StartDate
।
- সময়ের পার্থক্য 24 ঘন্টাের চেয়ে ছোট।
- আপনি ঘন্টা, মিনিট এবং সেকেন্ডের সাথে একটি আউটপুট ফর্ম্যাট গ্রহণ করেন। পরিবর্তন করা খুব সহজ।
- এটি ইউটিসি বারের জন্য গ্রহণযোগ্য। "ডিএসটি" এবং স্থানীয় সময় সংশোধন এড়াতে।
আপনার যদি স্ট্রিংটি অবশ্যই ব্যবহার করা উচিত তবে 10:33:56
ভাল, কেবল এটি সেকেন্ডে রূপান্তর করুন, সেকেন্ডে
শব্দটি সেকেন্ড হিসাবে সংক্ষেপিত হতে পারে:
string1="10:33:56"
string2="10:36:10"
StartDate=$(date -u -d "$string1" +"%s")
FinalDate=$(date -u -d "$string2" +"%s")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S"
নোট করুন যে সেকেন্ডের সময় রূপান্তর (উপরে উপস্থাপিত হিসাবে) "এই" দিন (আজ) শুরুর সাথে সম্পর্কিত।
এই ধারণাটি ন্যানোসেকেন্ডগুলিতে প্রসারিত হতে পারে:
string1="10:33:56.5400022"
string2="10:36:10.8800056"
StartDate=$(date -u -d "$string1" +"%s.%N")
FinalDate=$(date -u -d "$string2" +"%s.%N")
date -u -d "0 $FinalDate sec - $StartDate sec" +"%H:%M:%S.%N"
যদি দীর্ঘ পার্থক্য (364 দিন অবধি) সময়ের পার্থক্য গণনা করতে হয় তবে আমাদের অবশ্যই (কিছু) বছরের সূচনা হিসাবে উল্লেখ করতে হবে এবং ফর্ম্যাট মান %j
(বছরের দিন সংখ্যা):
অনুরূপ, একই, সমতুল্য:
string1="+10 days 10:33:56.5400022"
string2="+35 days 10:36:10.8800056"
StartDate=$(date -u -d "2000/1/1 $string1" +"%s.%N")
FinalDate=$(date -u -d "2000/1/1 $string2" +"%s.%N")
date -u -d "2000/1/1 $FinalDate sec - $StartDate sec" +"%j days %H:%M:%S.%N"
Output:
026 days 00:02:14.340003400
দুঃখের বিষয়, 1
এক্ষেত্রে আমাদের কয়েক দিনের সংখ্যা থেকে ম্যানুয়ালি বিয়োগ করতে হবে । তারিখের কমান্ড বছরের প্রথম দিনটিকে 1 হিসাবে দেখায় that এমনটি কঠিন নয় ...
a=( $(date -u -d "2000/1/1 $FinalDate sec - $StartDate sec" +"%j days %H:%M:%S.%N") )
a[0]=$((10#${a[0]}-1)); echo "${a[@]}"
দীর্ঘ সংখ্যক সেকেন্ডের ব্যবহার বৈধ এবং এখানে নথিভুক্ত: https://www.gnu.org/software/coreutils/manual/html_node/ উদাহরণ-of-date.html#
উদাহরণস্বরূপ- তারিখ
ব্যস্তবক্সের তারিখ
ছোট ডিভাইসে ব্যবহৃত একটি সরঞ্জাম (ইনস্টল করার জন্য খুব ছোট এক্সিকিউটেবল): ব্যুসিবক্স।
হয় ব্যস্তবক্সের তারিখ নামে একটি লিঙ্ক তৈরি করুন:
$ ln -s /bin/busybox date
এটির পরে কল করে এটি ব্যবহার করুন date
(এটিকে একটি PATH অন্তর্ভুক্ত ডিরেক্টরিতে রাখুন)।
বা এর মতো একটি নাম তৈরি করুন:
$ alias date='busybox date'
ব্যাসবক্সের তারিখটিতে একটি দুর্দান্ত বিকল্প রয়েছে: -ডি ইনপুট সময়ের ফর্ম্যাটটি পেতে। এটি সময় হিসাবে ব্যবহৃত হতে অনেক ফর্ম্যাট খোলে। -D বিকল্পটি ব্যবহার করে আমরা সময়কে 10:33:56 সরাসরি রূপান্তর করতে পারি:
date -D "%H:%M:%S" -d "10:33:56" +"%Y.%m.%d-%H:%M:%S"
এবং উপরের কমান্ডের আউটপুট থেকে আপনি দেখতে পাচ্ছেন যে দিনটি "আজ" হিসাবে ধরে নেওয়া হবে। যুগের শুরু থেকে সময় পেতে:
$ string1="10:33:56"
$ date -u -D "%Y.%m.%d-%H:%M:%S" -d "1970.01.01-$string1" +"%Y.%m.%d-%H:%M:%S"
1970.01.01-10:33:56
ব্যাসবক্সের তারিখ এমনকি সময়টি (উপরের ফর্ম্যাটে) -ডি ছাড়াই পেতে পারে:
$ date -u -d "1970.01.01-$string1" +"%Y.%m.%d-%H:%M:%S"
1970.01.01-10:33:56
এবং আউটপুট ফর্ম্যাট পর্বের আগে থেকে কয়েক সেকেন্ডও হতে পারে।
$ date -u -d "1970.01.01-$string1" +"%s"
52436
উভয় সময়, এবং একটি সামান্য বাশ গণিত (ব্যস্তবক্স এখনও গণিত করতে পারে না):
string1="10:33:56"
string2="10:36:10"
t1=$(date -u -d "1970.01.01-$string1" +"%s")
t2=$(date -u -d "1970.01.01-$string2" +"%s")
echo $(( t2 - t1 ))
বা বিন্যাসিত:
$ date -u -D "%s" -d "$(( t2 - t1 ))" +"%H:%M:%S"
00:02:14
time
কমান্ডটি ব্যবহার করতে পারবেন না ?