ইউনিক্স যুগের পর থেকে কীভাবে মিলিসেকেন্ডগুলি পাবেন?


30

আমি একটি বাশ স্ক্রিপ্ট করতে চাই যা ব্রাউজারের প্রবর্তনের সময়কে মেপে দেয় আমি এর জন্য একটি এইচটিএমএল ব্যবহার করছি যা জাভাস্ক্রিপ্ট ব্যবহার করে মিলি সেকেন্ডে টাইম-স্ট্যাম্প অন-লোড পায়।

শেল স্ক্রিপ্টে আমি ব্রাউজারটি কল করার আগে আমি এই সময়ের সাথে স্ট্যাম্পটি পাই:

date +%s

সমস্যাটি হ'ল এটি সেকেন্ডের মধ্যে সময়-স্ট্যাম্পটি পায় এবং আমার এটি মিলি সেকেন্ডে দরকার কারণ কখনও কখনও যখন দ্বিতীয়বার দৌড়ে যায় যখন ব্রাউজারটি একটি সেকেন্ডের নীচে শুরু হয় এবং সেকেন্ডের পরিবর্তে আমার সময়টি সঠিকভাবে মিলিসেকেন্ড ব্যবহার করতে সক্ষম হওয়া প্রয়োজন।

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

উত্তর:


28

date +%s.%Nআপনাকে দেবে, যেমন।, 1364391019.877418748। % এন বর্তমান সেকেন্ডে ন্যানোসেকেন্ডগুলি বিস্তৃত সংখ্যা। লক্ষ্য করুন এটি 9 ডিজিটের, এবং ডিফল্ট তারিখটি এটি 100000000 এর চেয়ে কম হলে জিরো দিয়ে প্যাড করবে This এটি আসলে একটি সমস্যা আমরা যদি সংখ্যাটি দিয়ে গণিত করতে চাই, কারণ বাশ সংখ্যাকে অষ্টাল হিসাবে একটি শূন্য শূন্য সহ আচরণ করে । ক্ষেত্র বিশেষে হাইফেন ব্যবহার করে এই প্যাডিং অক্ষম করা যেতে পারে, সুতরাং:

echo $((`date +%s`*1000+`date +%-N`/1000000))

যুগের পর থেকে নির্লজ্জভাবে আপনাকে মিলি সেকেন্ড দেবে।

তবে , স্টিফেন চেজেলাস নীচের মন্তব্যে উল্লেখ করেছেন যে, এটি দুটি ভিন্ন dateকল যা দুটি সামান্য ভিন্ন বার উপার্জন করবে। যদি দ্বিতীয়টি তাদের মধ্যে ঘুরতে থাকে তবে গণনাটি পুরো দ্বিতীয়টি বন্ধ হয়ে যাবে। তাই:

echo $(($(date +'%s * 1000 + %-N / 1000000')))

বা অপ্টিমাইজড (নীচের মন্তব্যে ধন্যবাদ, যদিও এটি সুস্পষ্ট হওয়া উচিত ছিল):

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

আমি এটি চেষ্টা করেছিলাম এবং এটি কাজ করে, ধন্যবাদ +1 / গ্রহণ করুন!
এডুয়ার্ড ফ্লোরিয়েনস্কু

7
মনে রাখবেন যে আপনি প্রথম তারিখ এবং দ্বিতীয় তারিখটি চালানোর সময়কালে কয়েক মিলিয়ন ন্যানোসেকেন্ডগুলি উত্তীর্ণ হতে পারে এবং এটি একই দ্বিতীয়টিও নাও হতে পারে। করণীয় সেরা $(($(date +'%s * 1000 + %N / 1000000')))। এটি এখনও খুব বেশি বোঝায় না, তবে এটি আরও নির্ভরযোগ্য হবে।
স্টাফেন চেজেলাস

1
তারিখ (1) হিসাবে উল্লিখিত হিসাবে শূন্য প্যাডিং বন্ধ করে স্থির করা হয়েছে
আলয়েস মাহডাল

3
%Nবিএসডি এবং ওএস এক্সে উপলভ্য নয়
অরকোডেন

1
শুধু কেন নয় echo $(( $(date '+%s%N') / 1000000))?
হাইটেক কম্পিউটার কম্পিউটার

47

জিএনইউ বা এস্ট-ওপেন বাস্তবায়নের সাথে date(বা ব্যস্তবক্স 'যদি FEATURE_DATE_NANOবিকল্পটি সক্ষম করে থাকে তবে), আমি ব্যবহার করব:

$ date +%s%3N

যা ইউনিক্স পর্বের সময় থেকে মিলি সেকেন্ডে ফেরত দেয়।


5
মার্জিত, দুর্দান্ত, +1
এডুয়ার্ড ফ্লোরিয়েনসকু

1
কমনীয়তার জন্য উত্সাহ দেওয়া
স্লিপক্যাল

সত্যই মার্জিত, +1। আমার মতো আপনি যদি নিশ্চিত হতে চান %3Nযে প্রয়োজনীয় বাম শূন্য প্যাডিং রয়েছে (দস্তাবেজগুলি না পড়ে। ;-), আপনি করতে পারেন while sleep 0.05; do date +%s%3N; done, এবং হ্যাঁ, প্রয়োজনীয় জিরোগুলি সেখানে রয়েছে।
টেরি ব্রাউন

ধন্যবাদ টেরি! তবে %3Nপ্রকৃতপক্ষে শূন্য প্যাডেড। তবুও আমি মনে করি না যে আপনার সমাধানটি শূন্যগুলি যুক্ত করবে, কেবল প্রতিক্রিয়াটিকে এত কম দেরি করবে।
জাবাবেংরিন্দর

জাভাবেংগ্রিন্ডার, @ টেরি ব্রাউনের কোডটি কোনও সমাধান ছিল না , এটি পরীক্ষা করার জন্য কেবল পরীক্ষার কোডটি %3Nসত্যই 0 প্যাডযুক্ত।
স্টাফেন চেজেলাস

10

যদি কেউ ছাড়া অন্য শেল ব্যবহার করছে bash, ksh93এবং zshএকটি ফ্লোটিং পয়েন্ট আছে $SECONDSপরিবর্তনশীল আপনি একটি কি typeset -F SECONDSযা সঠিকতা সঙ্গে সময় পরিমাপ করতে কুশলী হতে পারে:

$ typeset -F SECONDS=0
$ do-something
something done
$ echo "$SECONDS seconds have elapsed"
18.3994340000 seconds have elapsed

সংস্করণ ৪.৩.১৩ (২০১১) মডিউলে zshএকটি $EPOCHREALTIMEবিশেষ ভাসমান পয়েন্ট পরিবর্তনশীল zsh/datetime:

$ zmodload zsh/datetime
$ echo $EPOCHREALTIME
1364401642.2725396156
$ printf '%d\n' $((EPOCHREALTIME*1000))
1364401755993

লক্ষ্য করুন দ্বারা ফিরে (সেকেন্ড এবং ন্যানোসেকেন্ড জন্য) দুটি পূর্ণসংখ্যার থেকে উদ্ভূত যে clock_gettime()। বেশিরভাগ সিস্টেমে এটি একক সি doubleভাসমান পয়েন্ট সংখ্যাটি ধরে রাখতে পারে তার চেয়ে বেশি নির্ভুলতা , সুতরাং আপনি যখন অঙ্কটি গাণিতিক এক্সপ্রেশনগুলিতে ব্যবহার করবেন তখন আপনি যথার্থতা হারাবেন (1970 এর প্রথম কয়েক মাসের তারিখ বাদে)।

$ t=$EPOCHREALTIME
$ echo $t $((t))
1568473231.6078064442 1568473231.6078064

উচ্চ নির্ভুলতার সময়ের পার্থক্য গণনা করতে (যদিও আমি সন্দেহ করি যে আপনার মিলিসেকেন্ডের নির্ভুলতার চেয়ে আরও বেশি প্রয়োজন হবে), আপনি এর $epochtimeপরিবর্তে বিশেষ অ্যারেটি ব্যবহার করতে চাইতে পারেন (এতে সেকেন্ড এবং ন্যানোসেকেন্ড দুটি পৃথক উপাদান হিসাবে রয়েছে)।

সংস্করণ ৫.7 (2018) থেকে strftimeশেল বিল্টিন একটি %Nন্যানোসেকেন্ডের ফর্ম্যাট à la GNU dateএবং %.নির্ভুলতা নির্দিষ্ট করতে একটি সমর্থন করে , তাই যুগের পর থেকে মিলিসেকেন্ডের সংখ্যাটিও এর সাথে পুনরুদ্ধার করা যেতে পারে:

zmodload zsh/datetime
strftime %s%3. $epochtime

(অথবা এর সাথে একটি ভেরিয়েবলে সঞ্চিত -s var)


নোট করুন যে চলক "$ SECONDS" EPOCH সময়ের সাথে সংযুক্ত / সম্পর্কিত নয়। ভগ্নাংশের অংশ (মিলিসেকেন্ডস, মাইক্রোসেকেন্ডস এবং ন্যানোসেকেন্ডস) প্রতিটিের মধ্যে বেশ আলাদা হতে পারে।
আইজাক

8

মিলিসেকেন্ডগুলি পেতে গণনা এড়ানোর জন্য, কমান্ড লাইন জাভাস্ক্রিপ্ট দোভাষী সাহায্য করতে পারেন:

bash-4.2$ node -e 'console.log(new Date().getTime())' # node.js
1364391220596

bash-4.2$ js60 -e 'print(new Date().getTime())'       # SpiderMonkey
1364391220610

bash-4.2$ jsc -e 'print(new Date().getTime())'        # WebKit 
1364391220622

bash-4.2$ seed -e 'new Date().getTime()'              # GNOME object bridge
1364391220669

উবুন্টু ইওনে এই দোভাষী সংযুক্ত প্যাকেজগুলি:


2

ব্যাশে 5+ সেখানে মাইক্রো সেকেন্ডের গ্র্যানুলারিটি সঙ্গে একটি পরিবর্তনশীল হল: $EPOCHREALTIME

তাই:

$ echo "$(( ${EPOCHREALTIME//.} / 1000 ))"
1568385422635

যুগে যুগে (1/1/70) মিলসেকেন্ডে সময় মুদ্রণ করে।

এটি ব্যর্থ হয়ে, আপনাকে অবশ্যই তারিখটি ব্যবহার করতে হবে। হয় জিএনইউ তারিখ:

echo "$(date +'%s%3N')"

Https://serverfault.com/a/423642/465827 এ তালিকাভুক্ত বিকল্পগুলির মধ্যে একটি

অথবা brew install coreutilsওএস এক্স এর জন্য

অথবা, যদি অন্য সমস্ত কিছু ব্যর্থ হয় তবে এই সি প্রোগ্রামটি (gcc epochInµsec.c) সংকলন করুন (প্রয়োজনীয় হিসাবে সামঞ্জস্য করুন):

#include <stdio.h>
#include <sys/time.h>
int main(void)
{
  struct timeval time_now;
    gettimeofday(&time_now,NULL);
    printf ("%ld secs, %ld usecs\n",time_now.tv_sec,time_now.tv_usec);

    return 0;
}

নোট করুন যে কোনও বাহ্যিক প্রোগ্রামকে কল করার জন্য ডিস্ক থেকে পড়তে এবং লোড করা শুরু করা, চালানো এবং শেষ পর্যন্ত আউটপুট মুদ্রণের জন্য সময় প্রয়োজন। এটি কয়েক মিলিসেকেন্ড লাগবে। এটি ন্যূনতম নির্ভুলতা যা কোনও বাহ্যিক সরঞ্জাম (তারিখ সহ) দিয়ে অর্জন করা যেতে পারে।

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