মিলিসেকেন্ড পর্যন্ত দুটি টাইমস্ট্যাম্পের মধ্যে পার্থক্য কীভাবে খুঁজে পাবেন?


10

আমি স্ক্রিপ্টিং শেল নতুন। আমার স্ক্রিপ্টের হৃদয়টি হ'ল মিলিসেকেন্ড পর্যন্ত দুটি টাইমস্ট্যাম্পের মধ্যে পার্থক্য খুঁজে পাওয়া। আমার সাথে টাইমস্ট্যাম্পের বিষয়বস্তু সহ কেবল আমার ফাইল রয়েছে

2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
2012-09-13 15:00:29,428 2012-09-13 15:00:29,447

এটির মতো আমার প্রায় 30 কে রেকর্ড রয়েছে, যেখানে স্ক্রিপ্টটি সম্পাদন করার সময় আমার কোনও পারফরম্যান্স সমস্যার মুখোমুখি হওয়া উচিত নয়। যখন আমি এর জন্য স্ক্রিপ্ট লেখার চেষ্টা করছি তখন লিপ ইয়ার, 31 দিনের মাস সহ অনেকগুলি চিত্র চিত্রায় আসে।

কেউ কি দয়া করে এই আমাকে সাহায্য করতে পারেন?


1
ডিএসটি কি ছবিতে আসে? লিপ সেকেন্ড? ডিএসটি বিধি কি কি? তারা কি আপনার দেশে সময়ের সাথে পরিবর্তিত হয়েছে? আপনার কি 1970 এর আগে বা গ্রেগরিয়ান ক্যালেন্ডারে স্যুইচ করার আগে তারিখগুলি মোকাবেলা করতে হবে?
স্টাফেন চেজেলাস

উত্তর:


13

জটিল পার্সিংয়ের দরকার নেই, তার বন্ধু সহায়তায় আপনার জন্য সমস্ত যাদু করবে :

#!/bin/bash
while read d1_1 d1_2 d2_1 d2_2; do
  secdiff=$((
    $(date -d "$d2_1 $d2_2" +%s) - $(date -d "$d1_1 $d1_2" +%s)
  ))
  nanosecdiff=$((
    $(date -d "$d2_1 $d2_2" +%N) - $(date -d "$d1_1 $d1_2" +%N)
  ))
  printf "%s %s - %s %s = %d milliseconds\n" $d2_1 $d2_2 $d1_1 $d1_2 $((
    (secdiff * 1000) + (nanosecdiff / 1000000)
  ))
done < YOUR_FILE.txt

আউটপুট

2012-09-13 15:00:29,297 - 2012-09-13 15:00:29,290 = 7 milliseconds
2012-09-13 15:00:29,447 - 2012-09-13 15:00:29,428 = 19 milliseconds

দেখা man date

বিঃদ্রঃ

  • date -d এটি খুব দরকারী, এটি টাইমস্ট্যাম্পগুলিকে রূপান্তর করে
  • %sহয় কাল সময় (01-01-1970 যেহেতু সেকেন্ড)
  • %Nহয় ন্যানোসেকেন্ড
  • $(( ))এবং পাটিগণিতের (( ))জন্য bash, দেখুন http://mywiki.wooledge.org/ArithmeticExpression
  • $( ) জন্য দাঁড়িয়েছে command substitution

এটিও কি আপনার চাহিদা মতো ফিট?


1
একটি গাণিতিক ত্রুটি সংশোধন করা হয়েছে (সেকেন্ড এবং ন্যানোসেকেন্ডগুলি সহ) aten এখন আমি প্রথম সেকেন্ডটি গণনা করি (ওপি এটি জিজ্ঞাসা করে না, তবে পুনরায় ব্যবহারে সম্পূর্ণতা এবং
দৃust়তার

0

পার্ল, পাইথন বা রুবির মতো একটি স্ক্রিপ্টিং ভাষা দ্রুত হবে এবং এতে অল্প প্রচেষ্টা প্রয়োজন। উদাহরণস্বরূপ, পার্ল এবং তারিখ সহ :: পার্স :

perl -MDate::Parse -l -ne 's/,/./g; split; print str2time("$_[2] $_[3]") - str2time("$_[0] $_[1]")'

(প্রতিটি লাইন জন্য প্রতিস্থাপন ,দ্বারা ., শব্দ মধ্যে লাইন বিভক্ত $_[0]মাধ্যমে $_[3], তারিখ প্রথম দুই এবং পরবর্তী দুটি শব্দ দ্বারা গঠিত পার্স, এবং পার্থক্য প্রিন্ট।)


"সামান্য প্রচেষ্টা" বেশ আপেক্ষিক। অবশ্যই, আপনি যদি একজন এক্স প্রোগ্রামার হন এবং ওয়াই লাইব্রেরি সম্পর্কে জানেন তবে এটি একটি শিবির। সর্বদা এটি হয়। আসলে, আমি আশ্চর্য হয়েছি যে পাইথন প্রোগ্রামার এখনও এখানে প্রবেশ করেনি। আমি বুঝতে পারি এটি সময়ের বিষয় মাত্র: ... - \
মাইক এস

এই কারণেই লোকেরা এখানে একটি সম্পূর্ণ সমাধান দেয়। এইভাবে আপনাকে এক্স প্রোগ্রামার হতে হবে বা ওয়াই লাইব্রেরি সম্পর্কে জানতে হবে না। এবং আপনি এখনও আপনার স্ক্রিপ্টে একটি লাইন রাখার "সামান্য প্রচেষ্টা" থেকে উপকৃত হন এবং 10 নয়
চেরিডিটি

0

আমি কেবল এই পোস্টটি জুড়ে এসেছি, অন্তত আজ - একটি সহজ- dateভিত্তিক সমাধান। @ গিলস কুইনোটের উত্তরে ফ্রেমওয়ার্কটি ব্যবহার করে (তার আনসারটিতে একটি মন্তব্য লিখতে হবে তবে যথেষ্ট খ্যাতি ছিল না):

while read d1_1 d1_2 d2_1 d2_2
do
    date -d "$d2_1 $d2_2 $(date -d "$d1_1 $d1_2" +%s.%N) seconds ago" +%s.%N
done << END
2012-09-13 15:00:29,290 2012-09-13 15:00:29,297
END

ফলাফল:

$ ./time_elapsed.sh 
0.007000000

এর %3Nপরিবর্তে ব্যবহার %Nকরলে আউটপুটটি মিলি সেকেন্ডে কেটে যাবে।

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