তারিখ: বর্তমান 15 মিনিটের ব্যবধান পান


15

ডেট কমান্ড বা অনুরূপ ব্যবহার করে বর্তমান 15 মিনিটের ব্যবধানটি আমি কীভাবে পেতে পারি?

যেমন তারিখের মতো কিছু %Y.%m.%d %H:%M আমাকে দেবে 2011.02.22 10:19, আমার এমন কিছু দরকার যা 2011.02.22 10:15সময় থেকে ফলন করতে 10:15পারে 10:29

উত্তর:


17

আপনি বর্তমান ইউনিক্স টাইমস্ট্যাম্পটি সাথে পেতে পারেন date "+%s", কিছু সাধারণ গণিতের সাথে বর্তমান কোয়ার্টার-ঘন্টা সন্ধান করতে পারেন (আমার উদাহরণটি রয়েছে bash) এবং আরও ভাল ফর্ম্যাটের সাথে এটি আবার মুদ্রণ করতে পারেন date:

curdate=`date "+%s"`
curquarter=$(($curdate - ($curdate % (15 * 60))))
date -d"@$curquarter"

@এটি আপনার OS এ কাজ করে না একটি টাইমস্ট্যাম্প থেকে বর্তমান তারিখ এবং সময় সেট করার সিনট্যাক্স, তারিখ করার জন্য একটি গনুহ এক্সটেনশন হয়, তাহলে আপনি, অন্যথায় এই মত একই (ইউটিসি উল্লেখ করতে ভুলবেন না করতে পারেন, এটি জিতেছে ' টি কাজ):

date -d"1970-01-01 $curquarter seconds UTC"

5

নিম্নলিখিত পদ্ধতিগুলি 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 

1
কেবল স্পষ্টকরণের জন্য - "সিস্টেম কল" দ্বারা, আপনি "কাঁটাচামচ / এক্সিকিউটিভ / ওয়েট, সিস্টেম () কল" এর মতো, সিস্টেম কলকে সাধারণভাবে নয়। (আমি এটি উল্লেখ করেছি কারণ সিস্টেম কল করার একটি প্রোগ্রামের মধ্যেও ব্যবহারকারী / কার্নেল স্যুইচের কারণে একটি ওভারহেড থাকে That's এটি এখানে বিশেষ সমস্যা নয়))
ম্যাটডেম

ম্যাডিটিএম ... ধন্যবাদ .. আমি মাত্র 6 মাসের লিনাক্সের অভিজ্ঞতা থেকে কাজ করছি, তাই আমি সম্ভবত ভুল বাক্যাংশটি ব্যবহার করেছি, তবে আমি অপ্রয়োজনীয় কলগুলির দ্বারা পরিচালিত ওভারহেডগুলি সম্পর্কে এবং আমার নিজের পরীক্ষার নিজের অভিজ্ঞতায় পড়তে থাকি স্ক্রিপ্টস, আমি অনেকগুলি উদাহরণ দেখেছি যেখানে কল করা printfবা sed"অপ্রয়োজনীয়" catবনাম <ফাইল একটি নাটকীয় প্রকৃত রান-টাইম পার্থক্য তৈরি করে। লুপিংয়ের সময়, যেমনটি আমার "500 গুণ ধীর" উদাহরণে রয়েছে .. সুতরাং মনে হচ্ছে শেলটি যেখানেই সম্ভব ব্যবহার করা dateএবং ব্যাচ প্রসেসের মতো কোনও প্রোগ্রামকে অনুমতি দেওয়া মানে আমার অর্থ .. উদাহরণস্বরূপ। গিলিসের বাম-প্যাড -0 উদাহরণ, বনাম
প্রিন্টফ

3

খোলের তারিখগুলিতে কাজ করার একটি উপায় এখানে। 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}"

"ব্যবসায়ের কৌশল" ... একটি ভাল। :)
পিটার.ও

2

হতে পারে এটি আর গুরুত্বপূর্ণ নয় তবে আপনি আমার নিজের নিজস্ব ডেটুটিলগুলি ব্যবহার করে দেখতে পারেন । মিনিটে রাউন্ডিং (ডাউন) সাথে করা হয় droundএবং একটি নেতিবাচক যুক্তি:

dround now /-15m
=>
  2012-07-11T13:00:00

বা আপনার ফর্ম্যাট মেনে চলতে:

dround now /-15m -f '%Y.%m.%d %H:%M'
=>
  2012.07.11 13:00

এটি কি আসলে আপনার ব্যবহারগুলি কীভাবে কাজ করে? -15 মিটার ব্যবহার করে আমি ইনপুটটি ঘণ্টাখানেকের 15 মিনিটের কাছাকাছি ফিরে পেয়েছি: dateutils.dround '2018-11-12 13:55' -15mউত্পাদন করে 2018-11-12T13:15:00না 2018-11-12T13:45:00

1
@ জ্যাকডুগলাস সরঞ্জামগুলি বিবর্তিত হয়েছে, আপনি এখন যা চান তা হ'ল: /-15mঅর্থাত্ ঘন্টাটির 15 মিনিটের পরবর্তী একাধিকটি পর্যন্ত গোল করুন। এই বৈশিষ্ট্যটি আরও জটিল আকারের সিনট্যাক্স পেয়েছে কারণ এটি কম মান গ্রহণ করে, / -13 মি উদাহরণস্বরূপ সম্ভব নয় কারণ 13 60 এর বিভাজক নয় (
ঘন্টাটির

সুন্দর, আমি এখন যা প্রয়োজন তা পেয়েছি dateutils.dround '2018-11-12 12:52:31' /450s /-15m, ধন্যবাদ!

2

কিছু শেল বাহ্যিক dateআদেশকে কল না করেই কাজটি করতে সক্ষম হয় :

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)))"
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 মডিউল লোড করা কলিং তারিখের মতোই ধীর হতে পারে:

a=$(date +%s); date -ud "@$((a-a%(15*60)))" +'%Y.%m.%d %H:%M'

একটি ক্ষুদ্র নির্বাহযোগ্য 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'

1

আপনি যদি কলিং ডেটের সাথে দু'বার বেঁচে থাকতে পারেন তবে সোলারিসে এটি একটি ব্যাশটিতে কাজ করে:

date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))"

মন্তব্যটির পক্ষে সম্পাদিত:

date +"%Y.%m.%d %H:$(( $(date +'%M') / 15 * 15 ))" | sed 's/:0$/:00/'

1
এই সময়ের প্রথম প্রান্তে এটি 00 এর পরিবর্তে কেবল একটি 0 দিয়ে একটি মিনিট আউটপুট তৈরি করবে
পিটার.ও

সংশোধন করা হয়েছে, এটি মূল কমান্ডের পরে একটি সরল সেড।
23'11

আরও একটি ত্রুটি: এটি এইচ: 08 এবং এইচ: 10 এর মধ্যে কাজ করে না। দেখুন আমার উত্তর কেন এবং একটি ফিক্স জন্য।
গিলস 'দুষ্ট হওয়া বন্ধ করুন'

-1

আপনার সঠিক প্রয়োজন সম্পর্কে নিশ্চিত নই। তবে আপনি যদি 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

1
আপনি প্রশ্নটি ভুল বুঝেছেন। পয়েন্টটি হ'ল তারিখটি (নিচে) একাধিক 15 মিনিটের দিকে নিয়ে যাওয়া।
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.