উত্তর:
আপনি বর্তমান ইউনিক্স টাইমস্ট্যাম্পটি সাথে পেতে পারেন date "+%s"
, কিছু সাধারণ গণিতের সাথে বর্তমান কোয়ার্টার-ঘন্টা সন্ধান করতে পারেন (আমার উদাহরণটি রয়েছে bash
) এবং আরও ভাল ফর্ম্যাটের সাথে এটি আবার মুদ্রণ করতে পারেন date
:
curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"
@
এটি আপনার OS এ কাজ করে না একটি টাইমস্ট্যাম্প থেকে বর্তমান তারিখ এবং সময় সেট করার সিনট্যাক্স, তারিখ করার জন্য একটি গনুহ এক্সটেনশন হয়, তাহলে আপনি, অন্যথায় এই মত একই (ইউটিসি উল্লেখ করতে ভুলবেন না করতে পারেন, এটি জিতেছে ' টি কাজ):
date -d"1970-01-01 $curquarter seconds UTC"
নিম্নলিখিত পদ্ধতিগুলি date
দুবার কল করা অপ্রয়োজনীয় করে তোলে ।
একটি সিস্টেম কলের ওভারহেড একটি "সাধারণ" কমান্ডটি নিজের স্থানীয় পরিবেশে একই কাজটি করার চেয়ে 100 গুণ কম ধীর করতে পারে।
আপডেট করুন আমার উপরের মন্তব্য সম্পর্কে কেবলমাত্র একটি দ্রুত উল্লেখ: "100 গুণ ধীর"। এটি এখন " 500 গুণ ধীর" পড়তে পারে ... আমি সম্প্রতি ইস্যুতে পড়েছি (না, অন্ধভাবে হাঁটছি)। লিঙ্কটি এখানে: টেস্ট ফাইল তৈরির দ্রুত উপায়
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00
echo $Y.$m.$d $H:$M
অথবা
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
if [[ "$M" < "15" ]] ; then M=00
elif [[ "$M" < "30" ]] ; then M=15
elif [[ "$M" < "45" ]] ; then M=30
else M=45
fi
echo $Y.$m.$d $H:$M
উভয় সংস্করণ কেবল ফিরে আসবে
2011.02.23 01:00
2011.02.23 01:15
2011.02.23 01:30
2011.02.23 01:45
সমস্ত 60 মান values 00..59 for এর জন্য একটি টেস্ট লুপ সহ প্রথমটি এখানে রয়েছে
for X in {00..59} ; ###### TEST
do ###### TEST
eval $(date +Y=%Y\;m=%m\;d=%d\;H=%H\;M=%M)
M=$X ###### TEST
[[ "$M" < "15" ]] && M=00 # cater for octal clash
M=$(((M/15)*15))
((M==0)) && M=00 # the math returns 0, so make it 00
echo $Y.$m.$d $H:$M
done ###### TEST
printf
বা sed
"অপ্রয়োজনীয়" cat
বনাম <ফাইল একটি নাটকীয় প্রকৃত রান-টাইম পার্থক্য তৈরি করে। লুপিংয়ের সময়, যেমনটি আমার "500 গুণ ধীর" উদাহরণে রয়েছে .. সুতরাং মনে হচ্ছে শেলটি যেখানেই সম্ভব ব্যবহার করা date
এবং ব্যাচ প্রসেসের মতো কোনও প্রোগ্রামকে অনুমতি দেওয়া মানে আমার অর্থ .. উদাহরণস্বরূপ। গিলিসের বাম-প্যাড -0 উদাহরণ, বনাম
খোলের তারিখগুলিতে কাজ করার একটি উপায় এখানে। date
উপাদানগুলি পাওয়ার জন্য প্রথমে কল করুন , এবং উপাদানগুলির সাথে অবস্থানগত পরামিতিগুলি ( $1
, $2
ইত্যাদি) পূরণ করুন (নোট করুন যে এটি বিরল ক্ষেত্রে যেখানে আপনি $(…)
ডাবল উদ্ধৃতিগুলির বাইরে শব্দ ব্যবহার করতে চান তা ব্যবহার করতে চান )। তারপরে পাটিগণিত, পরীক্ষা, বা উপাদানগুলির জন্য আপনার যা করা দরকার তা সম্পাদন করুন। অবশেষে উপাদানগুলি একত্রিত করুন।
পাটিগণিত অংশটি কিছুটা জটিল হতে পারে কারণ শাঁসগুলি 0
অক্টাল উপসর্গ হিসাবে বিবেচিত হয় ; উদাহরণস্বরূপ এখানে $(($5/15))
ঘন্টা বা 8 মিনিট 9 মিনিট ব্যর্থ হবে। যেহেতু সর্বাধিক একজন শীর্ষস্থানীয় 0
, ${5#0}
পাটিগণিতের জন্য নিরাপদ। 100 যোগ করা এবং পরবর্তী সময়ে স্ট্রিপিং 1
আউটপুটটিতে নির্দিষ্ট সংখ্যার সংখ্যা পাওয়ার উপায়।
set $(date "+%Y %m %d %H %M")
m=$((100+15*(${5#0}/15)))
last_quarter_hour="$1.$2.$3 $4:${m#1}"
হতে পারে এটি আর গুরুত্বপূর্ণ নয় তবে আপনি আমার নিজের নিজস্ব ডেটুটিলগুলি ব্যবহার করে দেখতে পারেন । মিনিটে রাউন্ডিং (ডাউন) সাথে করা হয় dround
এবং একটি নেতিবাচক যুক্তি:
dround now /-15m
=>
2012-07-11T13:00:00
বা আপনার ফর্ম্যাট মেনে চলতে:
dround now /-15m -f '%Y.%m.%d %H:%M'
=>
2012.07.11 13:00
dateutils.dround '2018-11-12 13:55' -15m
উত্পাদন করে 2018-11-12T13:15:00
না 2018-11-12T13:45:00
।
/-15m
অর্থাত্ ঘন্টাটির 15 মিনিটের পরবর্তী একাধিকটি পর্যন্ত গোল করুন। এই বৈশিষ্ট্যটি আরও জটিল আকারের সিনট্যাক্স পেয়েছে কারণ এটি কম মান গ্রহণ করে, / -13 মি উদাহরণস্বরূপ সম্ভব নয় কারণ 13 60 এর বিভাজক নয় (
কিছু শেল বাহ্যিক date
আদেশকে কল না করেই কাজটি করতে সক্ষম হয় :
ksh
a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "#$((a-a%(15*60)))"
বাশ a=$(printf '%(%s)T\n'); printf '%(%Y.%m.%d %H:%M)T\n' "$((a-a%(15*60)))"
zsh zmodload zsh/datetime; a=$EPOCHSECONDS; strftime '%Y-%m-%d %H:%M' $((a-a%(15*60)))
উপরের তিনটি স্থানীয় (ইউটিসি নয়) সময় সরবরাহ করে। প্রয়োজনে একটি শীর্ষস্থানীয় TZ = UTC0 ব্যবহার করুন।
Ksh এবং bash বাক্য গঠন প্রায় অভিন্ন ( #
ksh- এ প্রয়োজনীয় ব্যতীত )। Zsh এর জন্য একটি মডিউল লোড করতে হবে (zsh বিতরণের সাথে অন্তর্ভুক্ত)।
এটি (জিএনইউ) awk দিয়ে করা সম্ভব:
জবুথবু ব্যক্তি awk 'BEGIN{t=systime();print strftime("%Y.%m.%d %H:%M",t-t%(15*60),1)}'
এই প্রদান একটি ইউটিসি ফলাফলের (শেষ পরিবর্তন 1
করতে 0
) স্থানীয় যদি প্রয়োজন হয়। তবে একটি বাহ্যিক awk বা একটি বাহ্যিক zsh মডিউল লোড করা কলিং তারিখের মতোই ধীর হতে পারে:
GNU-ডেট a=$(date +%s); date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'
একটি ক্ষুদ্র নির্বাহযোগ্য busybox
অনুরূপ ফলাফল প্রদান করতে পারে:
, busybox-ডেট a=$(busybox date +%s);busybox date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'
নোট করুন যে ব্যস্তবক্সটি PATH এর ডিরেক্টরিতে কোনও নামের সাথে যুক্ত থাকলে লিডিং ব্যস্তবক্স শব্দটি বাদ দেওয়া যেতে পারে।
উভয় date
এবং busybox date
উপরে উভয়ই ইউটিসি বার মুদ্রণ করবে। -u
স্থানীয় সময়ের জন্য বিকল্পটি সরান ।
যদি আপনার ওএসের তারিখের আরও সীমাবদ্ধ সংস্করণ থাকে (এবং এটি আপনাকে অবশ্যই ব্যবহার করতে হবে) তবে চেষ্টা করুন:
a=$(date +%s); a=$(( a-a%(15*60) ))
date -d"1970-01-01 $a seconds UTC" +'%Y.%m.%d %H:%M'
অথবা, যদি ফ্রিবিএসডি তে থাকে তবে চেষ্টা করুন:
a=$(date +%s); a=$(( a-a%(15*60) ))
date -r "$a" +'%Y.%m.%d %H:%M'
আপনি যদি কলিং ডেটের সাথে দু'বার বেঁচে থাকতে পারেন তবে সোলারিসে এটি একটি ব্যাশটিতে কাজ করে:
date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))"
মন্তব্যটির পক্ষে সম্পাদিত:
date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))" | sed 's/:0$/:00/'
আপনার সঠিক প্রয়োজন সম্পর্কে নিশ্চিত নই। তবে আপনি যদি 15 মিনিটের পরে সময় উত্পন্ন করতে চান তবে আপনি এর মতো কিছু ব্যবহার করতে পারেন date -d '+15 min'
। আউটপুট নীচে দেখানো হয়েছে:
$ date; date -d '+15 min'
Tue Feb 22 18:12:39 IST 2011
Tue Feb 22 18:27:39 IST 2011