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


উত্তর:


506

সংক্ষিপ্ত উত্তর হল:

$milliseconds = round(microtime(true) * 1000);

26
@ ফ্রেডরিকওয়েট, আমার মনে হয় আপনি বিভ্রান্ত করছেন time()microtime(true)অন্যদিকে, ইউনিক্সটি নিকটতম মাইক্রোসেকেন্ডে সঠিকভাবে (পিএইচপি রেফারেন্স দেখুন) সেকেন্ডে বর্তমান সময়টি ফিরিয়ে দেয়। যদি আপনি উপরের কোডটি লুপে চালনা করেন এবং মিলিসেকেন্ডগুলি প্রদর্শন করেন তবে এটি পরীক্ষা করা খুব সহজ।
লরেন্ট

6
আমি একেবারে করেছি! :-)
ফ্রেডরিক ওয়ােন্ড্ট

9
আমি সংক্ষিপ্ত উত্তর পছন্দ।
এরিক রবার্টসন

9
এটি হওয়া উচিত নয় microtime(true) / 1000(মাল্টিপ্লাইকের পরিবর্তে বিভাগ)?
জর্দান লেভ

18
@ জর্ডানলাইভ, এটি গুণ করা উচিত কারণ মাইক্রোটাইম (সত্য) ইউনিক্স টাইমস্ট্যাম্পটিকে কয়েক সেকেন্ডের মধ্যে ভাসমান হিসাবে ফিরিয়ে দেয় ।
লরেন্ট

88

ব্যবহার microtime। এই ফাংশনটি একটি স্পেস দ্বারা পৃথক একটি স্ট্রিং প্রদান করে। প্রথম অংশটি সেকেন্ডের ভগ্নাংশ, দ্বিতীয় অংশটি অবিচ্ছেদ্য অংশ। মধ্যে পাস trueএকটি সংখ্যা হিসাবে পেতে:

var_dump(microtime());       // string(21) "0.89115400 1283846202"
var_dump(microtime(true));   // float(1283846202.89)

আপনি যদি ব্যবহার করেন তবে নির্ভুল ক্ষতি থেকে সাবধান থাকুন microtime(true)

এমনও রয়েছে gettimeofdayযা মাইক্রোসেকেন্ডগুলি অংশ হিসাবে পূর্ণসংখ্যা হিসাবে প্রদান করে।

var_dump(gettimeofday());
/*
array(4) {
  ["sec"]=>
  int(1283846202)
  ["usec"]=>
  int(891199)
  ["minuteswest"]=>
  int(-60)
  ["dsttime"]=>
  int(1)
}
*/

তাই সাধারণত কথা microtime()সমান 1000*time(), তাই না?
COMer

আমি দেখছি, ত্রুটি থাকতে পারে, তবে ত্রুটিটি কম হওয়া উচিত 1000, তাই না?
COMer

@ কমার: আপনি কোন রূপের কথা বলছেন?
কেনেটিএম

microtime(true)এবং1000*time()
COMer

@ কমার: 1000*time()আপনাকে মিলিসেকেন্ড দেবে না। microtime(true)একটি ফেরৎ floatযা স্পষ্টতা 14 সংখ্যা আছে। সেকেন্ডের অংশটি ইতিমধ্যে 10 নিয়েছে, যাতে মাইক্রোসেকেন্ডের অংশের জন্য 4 অঙ্ক থাকে। এটি পর্যাপ্ত হতে হবে যেহেতু মিলিসেকেন্ডগুলিতে কেবলমাত্র 3 টি অতিরিক্ত অঙ্কের প্রয়োজন।
কেনেটিএম

46

সংক্ষিপ্ত উত্তর:

শুধুমাত্র 64 বিট প্ল্যাটফর্ম!

function milliseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}

[ আপনি যদি 64 বিট পিএইচপি চালাচ্ছেন তবে ধ্রুবকের PHP_INT_SIZEসমান হয়8 ]


দীর্ঘ উত্তর:

যদি আপনি time()মিলি সেকেন্ডে একটি ভারসাম্যপূর্ণ ফাংশন চান তবে আপনাকে প্রথমে বিবেচনা করতে হবে যে time()"যুগের সময়" (01/01/1970) থেকে সেকেণ্ডার সংখ্যাটি ফিরে আসার সাথে সাথে, "যুগের সময়" থেকে মিলি সেকেন্ডের সংখ্যাটি একটি বড় সংখ্যা এবং 32 বিট পূর্ণসংখ্যার সাথে ফিট করে না।

প্ল্যাটফর্মের উপর নির্ভর করে পিএইচপি-তে কোনও পূর্ণসংখ্যার আকার 32 বা 64 বিট হতে পারে।

Http://php.net/manual/en/language.tyype.integer.php থেকে

একটি পূর্ণসংখ্যার আকার প্ল্যাটফর্ম নির্ভর although -৪-বিট প্ল্যাটফর্মগুলির উইন্ডোজ বাদে সাধারণত প্রায় 9E18 এর সর্বাধিক মান থাকে যা সর্বদা 32 বিট থাকে। পিএইচপি স্বাক্ষরবিহীন পূর্ণসংখ্যার সমর্থন করে না। ধ্রুবক PHP_INT_SIZE এবং পিএইচপি ৪.৪.০ এবং পিএইচপি ৫.০.৫ থেকে ধ্রুবক PHP_INT_MAX ব্যবহার করে পূর্ণসংখ্যার আকার নির্ধারণ করা যেতে পারে।

আপনার যদি 64 বিট পূর্ণসংখ্যা থাকে তবে আপনি নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:

function milliseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000 + ((int)round($mt[0] * 1000));
}

microtime() "যুগের সময়" থেকে সেকেন্ডের সংখ্যার সাথে স্পেস দ্বারা পৃথক দুটি সংখ্যার সাথে মাইক্রোসেকেন্ডগুলিতে যথার্থতা ফিরে আসে ...

0.90441300 1409263371

দ্বিতীয় সংখ্যাটি হ'ল সেকেন্ড (পূর্ণসংখ্যা) এবং প্রথমটি দশমিক অংশ।

উপরের ফাংশনটি milliseconds()পূর্ণসংখ্যার অংশকে গুণ করে1000

1409263371000

তারপরে দশমিক অংশকে গুণিত করে 1000এবং 0 দশমিক হয় round

1409263371904

মনে রাখবেন যে উভয় $mt[1]এবং ফলাফল roundকাস্ট করা হয় int। এটি প্রয়োজনীয় কারণ তারা হ'ল floatএবং ingালাই ছাড়াই তাদের উপর ক্রিয়াকলাপটি ফাংশনটিতে ফিরে আসবে float

অবশেষে, এই ফাংশনটি তুলনায় কিছুটা সুনির্দিষ্ট

round(microtime(true)*1000);

এটি 1:10 এর অনুপাত সহ (আনুমানিক) সঠিক ফলাফলের চেয়ে 1 মিলিসেকেন্ড বেশি দেয়। এটি ফ্লোট টাইপের সীমিত নির্ভুলতার কারণে হয় ( microtime(true)একটি ফ্লোট ফেরত দেয়)। যাইহোক আপনি যদি এখনও খাটো পছন্দ করেন তবে round(microtime(true)*1000);আমি ফলাফলটিতে কাস্টিংয়ের পরামর্শ দেব int


এমনকি যদি এটি প্রশ্নের ক্ষেত্রের বাইরেও থাকে তবে এটি উল্লেখ করার মতো যে যদি আপনার প্ল্যাটফর্মটি b৪ বিট পূর্ণসংখ্যার সমর্থন করে তবে আপনি ওভারফ্লোতে ব্যয় না করে বর্তমান সময়টি মাইক্রোসেকেন্ডেও পেতে পারেন ।

যদি সত্য 2^63 - 1(বৃহত্তম স্বাক্ষরিত পূর্ণসংখ্যা) দ্বারা ভাগ করা হয় 10^6 * 3600 * 24 * 365(এক বছরে প্রায় মাইক্রোসেকেন্ডস) দেয় 292471

আপনি যে একই মান পাবেন

echo (int)( PHP_INT_MAX / ( 1000000 * 3600 * 24 * 365 ) );

অন্য কথায়, একটি স্বাক্ষরিত 64 বিট পূর্ণসংখ্যার 200,000 বছরেরও বেশি সময়কাল মাইক্রোসেকেন্ডে পরিমাপ করার জন্য জায়গা থাকে।

আপনার তখন থাকতে পারে

function microseconds() {
    $mt = explode(' ', microtime());
    return ((int)$mt[1]) * 1000000 + ((int)round($mt[0] * 1000000));
}

কেন শুধু নয়: `ফাংশন getMilliEpoch () {$ mt = বিস্ফোরিত ('', মাইক্রোটাইম ()); প্রত্যাবর্তন $ এমটি [1]। সাবস্ট্রাস্ট ($ এমটি [0], 0, 5) * 1000; ``
মাইকেল

এখন মাইক্রোটাইম ফাংশনটির জন্য একটি প্যারামিটার রয়েছে, যদি এটি সত্য হিসাবে সেট করা থাকে তবে এটি 1970 এর জানুয়ারি থেকে সেকেন্ড এবং মিলিসেকেন্ডগুলি ফিরে আসবে, ভাসমান হিসাবে 0 ঘন্টা 0 মিনিট 0 সেকেন্ড। এখানে একটি উদাহরণ রয়েছে: মাইক্রোটাইম (সত্য) // 1553260455.7242
কুক্কো

@ কুক্কো হ্যাঁ, তবে ফ্লোটের ধরণের সীমিত নির্ভুলতার কারণে মাইক্রোটাইম (সত্য) থেকে মিলিসেকেন্ডের সংখ্যা গণনা করলে কিছুটা ভুল মানের
পাওলো

42

অন্যরা যেমন বলেছে, আপনি microtime()টাইমস্ট্যাম্পগুলিতে মিলিসেকেন্ড যথার্থতা পেতে ব্যবহার করতে পারেন ।

আপনার মন্তব্যগুলি থেকে, আপনি এটি একটি উচ্চ-নির্ভুলতা ইউনিক্স টাইমস্ট্যাম্প হিসাবে চান বলে মনে হচ্ছে। DateTime.Now.Ticksনেট নেটওয়ার্কের মতো কিছু ।

আপনি এটি করতে নিম্নলিখিত ফাংশনটি ব্যবহার করতে পারেন:

function millitime() {
  $microtime = microtime();
  $comps = explode(' ', $microtime);

  // Note: Using a string here to prevent loss of precision
  // in case of "overflow" (PHP converts it to a double)
  return sprintf('%d%03d', $comps[1], $comps[0] * 1000);
}

এটা করার উপায়!
টোনিক্স

1
perrrrrrfect .. ♥।
এসআরবি নিষিদ্ধ

এটি কি সার্ভারের সময় ফেরায় না? আমার ক্ষেত্রে আমি দেখতে পাই ডিবিতে সঞ্চিত সময়টি আমার স্থানীয় ব্রাউজারের সময়। ধরুন, আমার সেভার টাইমজোনটি EST + 3 এবং আমার ব্রাউজারের সময় GMT + 6, যখন আমি GMT + 6 অবস্থান থেকে একটি ফর্ম জমা দিই, আমি দেখি যে সঞ্চিত সময়টি GMT + 6 সময়ের সমতুল্য মিলিসেকেন্ড। তাহলে সমস্যাটা কি? :(
জেনিথ

12

microtime(true)পিএইচপি 5 ব্যবহার করুন , বা পিএইচপি 4 এ নিম্নলিখিত পরিবর্তন করুন:

array_sum(explode(' ', microtime()));

এই কোডটি লেখার একটি বহনযোগ্য উপায় হ'ল:

function getMicrotime()
{
    if (version_compare(PHP_VERSION, '5.0.0', '<'))
    {
        return array_sum(explode(' ', microtime()));
    }

    return microtime(true);
}

11

echo date('Y-m-d H:i:s.') . gettimeofday()['usec'];

আউটপুট:

2016-11-19 15:12:34.346351


1
এটি একই টাইমস্ট্যাম্পটি ব্যবহার করে:$t = gettimeofday(); echo date('Y-m-d H:i:s.',$t['sec']) . $t['usec'];
স্যাভাস রাদেভিক

মাইক্রোসেকেন্ডগুলি শূন্য প্যাড হওয়া উচিত:$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
মাবি

7

এটা চেষ্টা কর:

public function getTimeToMicroseconds() {
    $t = microtime(true);
    $micro = sprintf("%06d", ($t - floor($t)) * 1000000);
    $d = new DateTime(date('Y-m-d H:i:s.' . $micro, $t));

    return $d->format("Y-m-d H:i:s.u"); 
}

6

আপনি 32-বিট পিএইচপিতে থাকলেও এটি কাজ করে:

list($msec, $sec) = explode(' ', microtime());

$time_milli = $sec.substr($msec, 2, 3); // '1491536422147'
$time_micro = $sec.substr($msec, 2, 6); // '1491536422147300'

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


আপনার যদি পূর্ণসংখ্যার প্রয়োজন হয়, 64৪-বিট পিএইচপি বাধ্যতামূলক।

তারপরে আপনি উপরের কোডটি পুনরায় ব্যবহার করতে পারেন এবং (int) এ কাস্ট করতে পারেন:

list($msec, $sec) = explode(' ', microtime());

// these parentheses are mandatory otherwise the precedence is wrong!
//                  ↓                        ↓
$time_milli = (int) ($sec.substr($msec, 2, 3)); // 1491536422147
$time_micro = (int) ($sec.substr($msec, 2, 6)); // 1491536422147300

অথবা আপনি ভাল 'ওয়ান-লাইনার ব্যবহার করতে পারেন:

$time_milli = (int) round(microtime(true) * 1000);    // 1491536422147
$time_micro = (int) round(microtime(true) * 1000000); // 1491536422147300

5
$timeparts = explode(" ",microtime());
$currenttime = bcadd(($timeparts[0]*1000),bcmul($timeparts[1],1000));
echo $currenttime;

দ্রষ্টব্য: মাইক্রোটাইম () সহ উন্নতির কারণে এই ফাংশনটির জন্য পিএইচপি 5 প্রয়োজনীয় এবং বিসি গণিত মডিউলটিও প্রয়োজনীয় (আমরা যেমন প্রচুর সংখ্যক নিয়ে কাজ করছি, আপনি phpinfo এর মডিউলটি পরীক্ষা করে দেখতে পারেন)।

আশা করি এটি আপনাকে সাহায্য করবে।


5
$the_date_time = new DateTime($date_string);
$the_date_time_in_ms = ($the_date_time->format('U') * 1000) +
    ($the_date_time->format('u') / 1000);

এটি কি ডানদিকে তিনটি শূন্যকে প্যাড করার মতো?
জিশান

একদমই না. এটি উভয় অংশকে মিলি সেকেন্ডে রূপান্তর করে যোগফল দেয়। সুতরাং এটি জিরো যুক্ত করার চেয়ে আরও সঠিক।
ব্যবহারকারী 3767296

1
যদিও এই কোড স্নিপেট একটি ব্যাখ্যা সহ প্রশ্নটি সমাধান করতে পারে, সত্যিই আপনার পোস্টের মান উন্নত করতে সহায়তা করে। মনে রাখবেন যে আপনি ভবিষ্যতে পাঠকদের জন্য প্রশ্নের উত্তর দিচ্ছেন, এবং সেই লোকেরা আপনার কোড পরামর্শের কারণগুলি জানেন না। আপনার কোডটি ব্যাখ্যামূলক মন্তব্যে ভিড় না করার চেষ্টা করুন, এটি কোড এবং ব্যাখ্যা উভয়ের পাঠযোগ্যতা হ্রাস করে!
মিশা পেরেকোভস্কি


-2

এটা ব্যবহার কর:

function get_millis(){
  list($usec, $sec) = explode(' ', microtime());
  return (int) ((int) $sec * 1000 + ((float) $usec * 1000));
}

বিদায়

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