ব্যাশের মিলিসেকেন্ডে কীভাবে বর্তমান ইউনিক্স সময় পাবেন?


232

আমি কীভাবে বর্তমান ইউনিক্স সময়কে মিলিসেকেন্ডগুলিতে পেতে পারি (যেমন ইউনিক্সের প্রথম পর্বের জানুয়ারী 1 ১৯ 1970০ সাল থেকে মিলি সেকেন্ডের সংখ্যা)?

উত্তর:


264

এই:

date +%s 

যুগের পর থেকে সেকেন্ডের সংখ্যা ফিরে আসবে ।

এই:

date +%s%N

সেকেন্ড এবং বর্তমান ন্যানোসেকেন্ডগুলি প্রদান করে।

তাই:

date +%s%N | cut -b1-13

যুগের পর থেকে আপনাকে মিলিসেকেন্ডের সংখ্যাটি দেবে - বর্তমান সেকেন্ডের সাথে ন্যানোসেকেন্ডের বাম তিনটি।


এবং মাইকিবি থেকে - echo $(($(date +%s%N)/1000000))(1000 দ্বারা বিভাজন কেবল মাইক্রোসেকেন্ডগুলিতে নিয়ে আসে)


39
আমি আশ্চর্য হয়েছি কতটা এমএস কাটা যোগ করেছে :-)
কাইল ব্র্যান্ডট

13
অথবা আপনি যদি এটা সব শেল কি করতে অতিরিক্ত প্রক্রিয়ার ব্যয়বহুল ওভারহেড এড়ানো চান (আসলে আমরা সমস্যাটি এড়ানো থাকেন তখন% এর মধ্যে ডিজিটের + S + + এন পরিবর্তনের সংখ্যা):echo $(($(date +%s%N)/1000))
MikeyB

5
এটি বিষয়টির মূল বিষয় ... যাদু সংখ্যা এবং কোডটি আপনার আসলে কী বোঝায় তা এড়িয়ে চলুন ।
মাইকিবি

25
আমি মনে করি এটি লক্ষ্য করার মতো যে লোকটি ইউনিক্সের জন্য, লিনাক্স নয়, এবং বর্তমান শীর্ষ উত্তর (তারিখ +% s% এন) আমার এআইএক্স সিস্টেমে কাজ করে না।
পিট

12
@ পিট +1 ওএস এক্সের জন্য একই, এবং ফ্রিবিএসডি
অক্টোডো

99

আপনি খুব সহজেই %3Nন্যানোসেকেন্ডগুলিকে 3 টি সবচেয়ে উল্লেখযোগ্য সংখ্যায় (যা পরে মিলিসেকেন্ডগুলি) কেটে কাটাতে ব্যবহার করতে পারেন :

$ date +%s%3N
1397392146866

এটি যেমন আমার কুবুন্টু 12.04 এ কাজ করে।

তবে সচেতন থাকুন, %Nএটি আপনার টার্গেট সিস্টেমের উপর নির্ভর করে প্রয়োগ করা যেতে পারে না। উদাহরণস্বরূপ এমবেডেড সিস্টেমে পরীক্ষিত (বিল্ড্রুট রুটফেস, একটি নন-এইচএফ বাহু ক্রস টুলচেইন ব্যবহার করে সংকলিত) কোনও ছিল না %N:

$ date +%s%3N
1397392146%3N

(এবং আমার (শিকড়বিহীন) অ্যান্ড্রয়েড ট্যাবলেটটিরও নেই %N)।


1
@warren: আমি দেখেছি যে আপনি সম্পাদিত এবং পরিবর্তিত 1397392146%3Nকরা 1397392146%N, কিন্তু আউটপুট 1397392146%3Nএকটা কাজ যা আমি আমার Android ট্যাবলেটের, busybox কনসোলে দেখা চাই যে। আপনি আপনার সম্পাদনা ব্যাখ্যা করতে পারেন?
জো

ইতিহাস থেকে ওয়ারেনের মন্তব্যটি "3 থেকে 6 এ পরিবর্তিত হয়েছে, 3 কারণ কেবল আপনাকে মাইক্রোসেকেন্ডে নিয়ে যায়"। তাঁর সম্পাদনা পুরোপুরি উদাসীন বলে মনে হচ্ছে; আপনি এটি ফিরে ঘূর্ণিত করা উচিত।
বুকজোর

1
এটি বিশেষত জিএনইউ কোর্টিলগুলির একটি বৈশিষ্ট্য। শেষ পর্যন্ত, এটি gnulib এ এখানে প্রয়োগ করা হয়: github.com/gagern/gnulib/blob/…
টেলোটোরিয়াম

সম্ভবত সেখানে একটি বিন্দু বোঝায়। date +%s.%3Nপ্রিন্ট 1510718281.134
darksky

এটি গ্রহণযোগ্য উত্তর হওয়া উচিত।
নোহ সুসমান

61

date +%N ওএস এক্সে কাজ করে না, তবে আপনি এর মধ্যে একটি ব্যবহার করতে পারেন

  • রুবি: ruby -e 'puts Time.now.to_f'
  • পাইথন: python -c 'import time; print time.time()'
  • Node.js: node -e 'console.log(Date.now())'
  • পিএইচপি: php -r 'echo microtime(TRUE);'
  • স্পর্শমণি: DateTime.utc_now() |> DateTime.to_unix(:millisecond)
  • আন্তঃ wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
  • বা মিলিসেকেন্ডগুলির জন্য নিকটতম দ্বিতীয় দিকে গোল করে date +%s000

1
সম্পূর্ণতার জন্য ...node -e 'console.log(Date.now())'
slf

1
পিএইচপি ব্যবহার:php -r 'echo microtime(TRUE);'
ট্যাচইনওয়ার্টেক্স

8
অবশ্যই, আপনাকে কেবল সেই দোভাষীদের উষ্ণ করার জন্য অপেক্ষা করতে হবে। এটিও কাজ করে:wget -qO- http://www.timeapi.org/utc/now?\\s.\\N
ক্যামিলো মার্টিন

8
অথবা, যদি আপনার আসলে মিলি সেকেন্ডের প্রয়োজন না হয় তবে কেবলমাত্র সঠিক বিন্যাস:date +%s000
লেনার হোয়েট


9

এটি কেবল এখানে ফেলে দিচ্ছি, তবে আমি মনে করি বিভাগের সাথে সঠিক সূত্রটি হ'ল:

echo $(($(date +%s%N)/1000000))

9

আমার সমাধানটি সেরা নয় তবে আমার পক্ষে কাজ করেছে।

date +%s000

আমার কেবল 2012-05-05 এর মতো একটি তারিখকে মিলি সেকেন্ডে রূপান্তর করতে হবে।


1
আশ্চর্যজনক হ্যাক,
লল

7
আপনি অবশ্যই আমার সহকর্মীদের মধ্যে কেউ হতে হবে।
নাকিলন

7

মিলি সেকেন্ড পাওয়ার জন্য বাহ্যিক প্রোগ্রামগুলি চালানোর পরামর্শ দেয় এমন লোকদের ... এই হারে, আপনি সম্ভবত এটি করতে পারেন:

wget -qO- http://www.timeapi.org/utc/now?\\s.\\N

বিষয়টি হ'ল: এখান থেকে কোনও উত্তর বাছাইয়ের আগে দয়া করে মনে রাখবেন যে সমস্ত প্রোগ্রামগুলি পুরো এক সেকেন্ডের অধীনে চলবে না। পরিমাপ করা!


আপনি সময়ের জন্য স্থানীয় সিস্টেমকে জিজ্ঞাসা করছেন না। যা আমি অনুমান করি প্রশ্নটিতে জড়িত। আপনি একটি নেটওয়ার্ক সংযোগ উপর নির্ভর করে।
অরকোডেন

2
@ করকডেন প্রশ্নটি স্পষ্টভাবে "জানুয়ারী 1, 1970 থেকে ইউনিক্সের সময় থেকে মিলিসেকেন্ডের সংখ্যা" জিজ্ঞাসা করে। এছাড়াও, আমি আরও বেশি উল্লেখ করে বলছি যে আপনি কীভাবে পুরো সময়টি পেতে কেবল রুবি বা পাইথন (বা উইজেট) পুরোটা জ্বালিয়ে ফেলবেন না - হয় এটি একটি দ্রুত চ্যানেলের মাধ্যমে সম্পন্ন করা হয় বা মিলিসেকেন্ডগুলি কোনও ব্যাপার না।
ক্যামিলো মার্টিন

2
হ্যাঁ, আমি বুঝতে পেরেছিলাম যে আপনি খারাপ সমাধানগুলির ত্রুটিগুলি হাইলাইট করার জন্য আরও খারাপ সমাধান দিচ্ছেন। আমি বেশ কয়েকটি সমাধান চেষ্টা করে সময়টি মাপলাম। lpaste.net/119499 ফলাফল আকর্ষণীয় এক ধরণের। এমনকি খুব দ্রুত আই 7 মেশিনটি dateচালাতে 3 এমএস লাগে।
orkoden

@ করকডেন চমৎকার পরীক্ষা! কি ওএস? এটি ওভারহেডের প্রসারণের প্রক্রিয়াটির সাথে থাকতে পারে।
ক্যামিলো মার্টিন

1
@ নাকিলন এবং এ কারণেই কারও কারও কারও কারও মতো কার্ল-সক্ষম সুবিধার উপর নির্ভর করা উচিত নয়।
ক্যামিলো মার্টিন

4

এই সমাধানটি ম্যাকোজে কাজ করে।

আপনি যদি ব্যাশ স্ক্রিপ্টটি ব্যবহার করে বিবেচনা করেন এবং পাইথন উপলব্ধ থাকে তবে আপনি এই কোডটি ব্যবহার করতে পারেন:

#!/bin/bash

python -c 'from time import time; print int(round(time() * 1000))'

নিচে ভোট কেন?
ফ্রাঙ্ক থোনিগ

বিশেষভাবে ন্যায়সঙ্গত বলে মনে হয় না। ডাউন তীরের ইঙ্গিতটি "এই উত্তরটি কার্যকর নয়" বলে, তবে আইএমও এটি দরকারী। এর পরিবর্তে তারা চেয়েছিল যে আপনি এটিকে পরিবর্তে একটি পাইথন স্ক্রিপ্ট তৈরি করুন। এটি সহজ হবে এবং বাশ কমান্ড হিসাবে সূক্ষ্ম কাজ করবে।
অ্যান্ড্রু শুলম্যান 5'18

ডাউনভোটগুলি সম্পর্কে খুব বেশি চিন্তা করবেন না (এটি আমার ছিল না) ... বিশেষত যদি তারা বেনামে থাকে (যা থেকে কেউ কী ভুল বলে মনে হয় তা সঠিকভাবে শিখতে পারে না?) আপনি এটি প্রক্রিয়াজাতকরণের জন্য ... এখানে আরও একটি +1 গেছে ... অনুমান কী: আপনি এখনই "ভোট" দেওয়ার অনুমতি পাচ্ছেন, তাই না?
পিয়ের.ভ্রিয়েন্স

ডাউনভোটটি সিস্টেমে কোনও সমস্যার কারণে তৈরি হয়েছে বলে মনে হয়। এটি আবার সিস্টেম দ্বারা সরানো হয়েছে।
মাইকেল হ্যাম্পটন

2

আপনি যদি আপনার স্ক্রিপ্টের দৈর্ঘ্যের দৈর্ঘ্য প্রদর্শনের জন্য কোনও উপায় সন্ধান করছেন, নিম্নলিখিতটি একটি (সম্পূর্ণ সঠিক নয়) ফলাফল সরবরাহ করবে:

আপনার স্ক্রিপ্টের শুরুতে যতটা সম্ভব আপনি নীচে প্রবেশ করুন

basetime=$(date +%s%N)

এটি আপনাকে 1361802943996000000 এর মতো কোনও কিছুর প্রাথমিক মান দেবে

আপনার স্ক্রিপ্টের শেষে, নিম্নলিখিতটি ব্যবহার করুন

echo "runtime: $(echo "scale=3;($(date +%s%N) - ${basetime})/(1*10^09)" | bc) seconds"

যা এরকম কিছু প্রদর্শন করবে

runtime: 12.383 seconds

নোট:

(1 * 10 ^ 09) আপনি চান 1000000000 এর সাথে প্রতিস্থাপন করা যেতে পারে

"scale=3"একটি বরং বিরল সেটিংস যা bcআপনাকে যা করতে তা করতে বাধ্য করে। আরও অনেক কিছু আছে!

আমি এটি কেবল উইন 7 / মিনজিডাব্লুয়ে পরীক্ষা করেছি ... আমার কাছে হাতে সঠিক * নিক্স বাক্স নেই।


3
বা আপনি কেবল ব্যবহার করতে পারেনtime <script>
ওয়ারেন

2

বিভাগ সম্পাদন না করে কিভাবে মিলিসেকেন্ডে সময় পাবেন তা এখানে। সম্ভবত এটি দ্রুত ...

# test=`date +%s%N`
# testnum=${#test}
# echo ${test:0:$testnum-6}
1297327781715

আপডেট: খাঁটি বাশের আরেকটি বিকল্প যা কেবলমাত্র সাথে কাজ করে bash 4.2+তা উপরের মতো তবে printfতারিখটি পেতে ব্যবহার করে। এটি অবশ্যই দ্রুততর হবে কারণ কোনও প্রক্রিয়াই মূলটির বাইরে চলে যায় না।

printf -v test '%(%s%N)T' -1
testnum=${#test}
echo ${test:0:$testnum-6}

যদিও এখানে আরও একটি ক্যাচ হ'ল আপনার strftimeপ্রয়োগের সমর্থন করা উচিত %sএবং %Nএটি আমার পরীক্ষার মেশিনে কেস নয়। man strftimeসমর্থিত বিকল্পগুলির জন্য দেখুন । আরো দেখুন man bashদেখতে printfসিনট্যাক্স। -1এবং -2সময়ের জন্য বিশেষ মান।


মনে হচ্ছে আমার strftime(3)সমর্থন করে না %Nতাই printfন্যানোসেকেন্ডগুলি মুদ্রণের জন্য কোনও উপায় নেই । আমি উবুন্টু 14.04 ব্যবহার করছি।
হরিদস্ব

@ হারিডস্, হ্যাঁ, এটি গ্লাবসি-তে নেই। dateআরও নির্ভরযোগ্য বিকল্প মত মনে হচ্ছে।
akostadinov

2

আমরা সবচেয়ে সঠিক টাইমস্ট্যাম্প পেতে পারি (কমপক্ষে ম্যাক ওএস এক্স এর জন্য) সম্ভবত এটি হ'ল:

python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'

1490665305.021699

তবে আমাদের মনে রাখতে হবে এটি চালাতে প্রায় 30 মিলিসেকেন্ড সময় লাগে। আমরা এটিকে 2 টি সংখ্যার ভগ্নাংশের স্কেলে কাটাতে পারি এবং খুব প্রথম দিকে সময়টি পড়ার গড় ওভারহেডের গণনা করতে পারি এবং তারপরে পরিমাপটি সরিয়ে ফেলতে পারি। এখানে একটি উদাহরণ:

function getTimestamp {
  echo `python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")' | cut -b1-13` 
}
function getDiff {
  echo "$2-$1-$MeasuringCost" | bc
}
prev_a=`getTimestamp`
acc=0
ITERATIONS=30
for i in `seq 1 $ITERATIONS`;do 
  #echo -n $i 
  a=`getTimestamp`
  #echo -n "   $a"
  b=`echo "$a-$prev_a" | bc`
  prev_a=$a
  #echo "  diff=$b"
  acc=`echo "$acc+$b" | bc`
done
MeasuringCost=`echo "scale=2; $acc/$ITERATIONS" | bc`
echo "average: $MeasuringCost sec"
t1=`getTimestamp`
sleep 2
t2=`getTimestamp`
echo "measured seconds: `getDiff $t1 $t2`"

এটি কীভাবে কাজ করে তা আরও ভাল দেখতে আপনি ইকো কমান্ডগুলিকে অসুবিধে করতে পারেন।

এই স্ক্রিপ্টের ফলাফলগুলি সাধারণত এই 3 টির মধ্যে একটি ফলাফল:

measured seconds: 1.99
measured seconds: 2.00
measured seconds: 2.01

1

তারিখ এবং Expr ব্যবহার করে আপনি সেখানে যেতে পারেন

X=$(expr \`date +%H\` \\* 3600 + \`date +%M\` \\* 60 + \`date +%S\`)
echo $X

আপনি যা চান তা করতে এটির উপরে প্রসারিত করুন

আমি বুঝতে পারি যে এটি যুগের পর থেকে মিলিসেকেন্ডগুলি দেয় না, তবে এটি কয়েকটি ক্ষেত্রে একটি উত্তর হিসাবে এখনও কার্যকর হতে পারে, এটি সমস্ত নির্ভর করে আপনার সত্যিকারের জন্য যা প্রয়োজন তার উপর নির্ভর করে, যদি আপনার এক মিলিসেকেন্ড নম্বর প্রয়োজন হয় তবে 1000 দিয়ে গুণ করুন: ডি

সবচেয়ে সহজ উপায় হ'ল একটি ছোট এক্সিকিউটেবল (সি এফ। এক্স। থেকে) তৈরি করা এবং স্ক্রিপ্টটিতে এটি উপলব্ধ করা।


dateএকাধিকবার চলার সম্ভাব্য সমস্যা রয়েছে । কিছু ক্ষেত্রে আপনার কমান্ডটি লেখার সাথে সাথে রানের তারিখ বা সময় পরিবর্তন হতে পারে। dateএকবার চালানো এবং অংশগুলি পার্স করা এবং আপনার গণনা করা ভাল। এটি করার বেশ কয়েকটি উপায় হ'ল t=$(date +%H%M%S); (( x = ${t:0:2} * 3600 + ${t:2:2} * 60 + ${t:4:2} )); echo "$x"। প্রশ্নটি ট্যাগ করা বাশ হওয়ায় এটি ব্যাশ সিনট্যাক্স ব্যবহার করে । আপনি ইঙ্গিত হিসাবে, আপনার উত্তর (এবং আমার প্রকরণ) শুধুমাত্র এখন পর্যন্ত সেকেন্ড দেয় এবং না মহাকাশ থেকে এবং মিলিসে নয়।
ডেনিস উইলিয়ামসন

1

(উপরে থেকে পুনরাবৃত্তি) date +%Nওএস এক্সে কাজ করে না, তবে আপনি এটি ব্যবহার করতে পারেন:

পার্ল (সময় :: ফর্ম্যাট মডিউল প্রয়োজন)। সম্ভবত ব্যবহারের জন্য সেরা সিপিএএন মডিউল নয় তবে কাজটি সম্পন্ন করে। সময় :: ফর্ম্যাট সাধারণত বিতরণ দিয়ে উপলব্ধ করা হয়।

perl -w -e'use Time::Format; printf STDOUT ("%s.%s\n", time, $time{"mmm"})'

ওপি বিশেষত ব্যাশ ব্যবহার করে এটি করার উপায় জিজ্ঞাসা করেছিল। কীভাবে এই বাশ, অন্য কিছু চালু করার পদ্ধতি হিসাবে সংরক্ষণ করুন?
ম্যাডহ্যাটার

আমি এটি আমার ব্যাশ শেল স্ক্রিপ্টগুলিতে ব্যবহার করি ... ওএসএক্সের অধীনে। সুতরাং, dateব্যবহার করা যাবে না এবং এমন কোনও বাশ-কমান্ড নেই যা প্রয়োজনের উত্তর দেয়।
টিভিশ্যাক

যথেষ্ট ফর্সা। ওএসএক্স কেন আপনার উত্তরের অংশ হিসাবেdate ব্যবহার করা যাচ্ছে না তা যদি আপনি পরিষ্কার করে থাকেন তবে আমি আমার ডাউনটোটটি সরিয়ে ফেলব।
ম্যাডহ্যাটার

এটি উপরে কয়েকটি উত্তর ব্যাখ্যা করা হয়েছিল। প্রস্তাবিত তালিকার সাথে অনুপস্থিত সেই আদেশটি আমি মন্তব্য হিসাবে যুক্ত করতে পারিনি। সুতরাং আমি এটি এখানে যুক্ত করেছি।
টিভিশ্যাক

যথেষ্ট ভাল, আমি গ্রহণ করি এটি ক্যাননের একটি দরকারী সংযোজন। আমার কাছ থেকে +1!
ম্যাডহ্যাটার

1

ওএসএক্স থাকাকালীন সমস্ত পূর্ববর্তী প্রতিক্রিয়াগুলি একসাথে রেখে

ProductName:    Mac OS X
ProductVersion: 10.11.6
BuildVersion:   15G31+

আপনি পছন্দ করতে পারেন

microtime() {
    python -c 'import time; print time.time()'
}
compute() {
    local START=$(microtime)
    #$1 is command $2 are args
    local END=$(microtime)
    DIFF=$(echo "$END - $START" | bc)
    echo "$1\t$2\t$DIFF"
}

0

আপনি যদি একটি সাধারণ শেলটি অতিবাহিত গণনা চান তবে উপরের উত্তরটি ব্যবহার করে এটি সহজ এবং পোর্টেবল:

now() {
    python -c 'import datetime; print datetime.datetime.now().strftime("%s.%f")'
}
seismo:~$ x=`now`
seismo:~$ y=`now`
seismo:~$ echo "$y - $x" | bc
5.212514

0

আলপাইন লিনাক্স (অনেকগুলি ডকার চিত্র) এবং সম্ভবত অন্যান্য ন্যূনতম লিনাক্স পরিবেশের জন্য আপনি অপব্যবহার করতে পারেন adjtimex:

adjtimex | awk '/(time.tv_usec):/ { printf("%06d\n", $2) }' | head -c3

adjtimexকার্নেল সময় ভেরিয়েবলগুলি পড়ার জন্য (এবং সেট) ব্যবহৃত হয়। সঙ্গে awkআপনি মাইক্রোসেকেন্ড পেতে পারেন, সঙ্গে headআপনাকে প্রথমে 3 সংখ্যার শুধুমাত্র ব্যবহার করতে পারেন।

এই আদেশটি কতটা নির্ভরযোগ্য তা আমার কোনও ধারণা নেই।

দ্রষ্টব্য: এই উত্তরটি থেকে নির্লজ্জভাবে চুরি হয়েছে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.