PHP में मिलीसेकंड में वर्तमान समय कैसे प्राप्त करें?


जवाबों:


506

संक्षिप्त उत्तर है:

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

26
@FredrikWendt, मुझे लगता है कि आप भ्रमित कर रहे हैं time()microtime(true)दूसरी ओर, वर्तमान समय को सेकंड में लौटाता है क्योंकि यूनिक्स की अवधि निकटतम माइक्रोसेकंड के लिए सटीक है (PHP संदर्भ देखें)। यदि आप उपरोक्त कोड को लूप में चलाते हैं और मिलीसेकंड प्रदर्शित करते हैं, तो वास्तव में परीक्षण करना बहुत आसान है।
लॉरेंट

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कि एक पूर्णांक के रूप में microseconds भाग देता है।

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

तो आम तौर पर microtime()बराबर बोलना 1000*time(), है ना?
सेपर

मैं देख रहा हूं, त्रुटियां हो सकती हैं, लेकिन त्रुटि कम से कम 1000, सही होनी चाहिए ?
COM

@COMer: आप किस संस्करण के बारे में बात कर रहे हैं?
kennytm

microtime(true)और1000*time()
er

@COMer: 1000*time()आपको मिलीसेकंड नहीं देगा। microtime(true)रिटर्न floatजिसमें सटीक के 14 अंक हैं। सेकंड का हिस्सा पहले ही 10 ले चुका था, इसलिए माइक्रोसेकंड भाग के लिए 4 अंक छोड़ दिए। यह पर्याप्त होना चाहिए क्योंकि मिलीसेकंड में केवल 3 अतिरिक्त अंकों की आवश्यकता होती है।
kennytm

46

संक्षिप्त जवाब:

64 बिट प्लेटफॉर्म ही!

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

[ यदि आप 64 बिट्स PHP चला रहे हैं तो निरंतर PHP_INT_SIZEबराबर है8 ]


लंबा जवाब:

यदि आप time()मिलीसेकंड में एक समतुल्य कार्य चाहते हैं, तो आपको पहले यह विचार करना होगा कि time()"एपोक समय" (01/01/1970) के बाद समाप्त हुए सेकंड की संख्या के रूप में , "एपिसोड समय" के बाद से मिलीसेकंड की संख्या एक बड़ी संख्या है। और एक 32 बिट पूर्णांक में फिट नहीं है।

PHP में पूर्णांक का आकार प्लेटफॉर्म के आधार पर 32 या 64 बिट्स हो सकता है।

से http://php.net/manual/en/language.types.integer.php

एक पूर्णांक का आकार प्लेटफ़ॉर्म-निर्भर है, हालांकि लगभग दो बिलियन का अधिकतम मूल्य सामान्य मूल्य है (जो कि 32 बिट्स पर हस्ताक्षर किया गया है)। 64-बिट प्लेटफ़ॉर्म में आमतौर पर विंडोज को छोड़कर, लगभग 9E18 का अधिकतम मूल्य होता है, जो हमेशा 32 बिट होता है। PHP अहस्ताक्षरित पूर्णांक का समर्थन नहीं करता है। पूर्णांक आकार को निरंतर PHP_INT_SIZE, और PHP 4.4.0 और PHP 5.0.5 के बाद से निरंतर 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 दशमलव से गुणा और जोड़ा जाता है

1409263371904

ध्यान दें कि दोनों $mt[1]और परिणाम के roundलिए डाली जाती हैं int। यह आवश्यक है क्योंकि वे floatएस हैं और उन पर बिना कास्टिंग के ऑपरेशन के परिणामस्वरूप फ़ंक्शन वापस आ जाएगा float

अंत में, यह फंक्शन की तुलना में थोड़ा अधिक सटीक है

round(microtime(true)*1000);

1:10 के अनुपात के साथ (लगभग) सही परिणाम की तुलना में 1 अधिक मिलीसेकंड देता है। यह फ्लोट के प्रकार की सीमित शुद्धता के कारण है ( microtime(true)फ्लोट लौटाता है)। वैसे भी अगर आप अभी भी कम पसंद करते हैं तो round(microtime(true)*1000);मैं intपरिणाम के लिए कास्टिंग करने का सुझाव दूंगा ।


यहां तक ​​कि अगर यह प्रश्न के दायरे से परे है, तो यह ध्यान देने योग्य है कि यदि आपका प्लेटफ़ॉर्म 64 बिट पूर्णांक का समर्थन करता है, तो आप अतिप्रवाह में बिना आवर्ती के भी माइक्रोसेकंड में वर्तमान समय प्राप्त कर सकते हैं ।

यदि वास्तव में 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 = explode ('', microtime ()); $ mt [1] वापस करें। पदार्थ ($ mt [0], 0, 5) * 1000; } `
माइकल

अब माइक्रोटाइम फ़ंक्शन के लिए एक पैरामीटर है, अगर यह सच है, तो यह सेकंड और मिलीसेकंड के बाद से 1 9 70 की उम्र में लौटा है, फ्लोट के रूप में 0 घंटे 0 मिनट 0 सेकंड। यहाँ एक उदाहरण है: microtime (सच) // १५५३२६०४५५. --२४२
कुक्को

@kukko हाँ, लेकिन फ्लोट प्रकार की सीमित परिशुद्धता के कारण , माइक्रोटाइम (ट्रू) से मिलीसेकंड की संख्या की गणना करने पर थोड़ा गलत मूल्य होगा
पाओलो

42

जैसा कि अन्य ने कहा है, आप microtime()टाइमस्टैम्प पर मिलीसेकंड सटीक प्राप्त करने के लिए उपयोग कर सकते हैं ।

अपनी टिप्पणियों से, आप इसे एक उच्च-सटीक UNIX टाइमस्टैम्प के रूप में चाहते हैं। DateTime.Now.Ticks.NET दुनिया में कुछ इस तरह ।

आप ऐसा करने के लिए निम्न फ़ंक्शन का उपयोग कर सकते हैं:

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 .. ♥।
SRB

क्या यह सर्वर समय वापस नहीं करता है? मेरे मामले में, मुझे db में संग्रहीत समय दिखाई दे रहा है, यह मेरा स्थानीय ब्राउज़र समय है। मान लीजिए, मेरा गंभीर समयक्षेत्र EST + 3 है और मेरा ब्राउज़र समय GMT + 6 है, जबकि मैं GMT + 6 स्थान से एक फ़ॉर्म सबमिट करता हूं, मैं देखता हूं कि संग्रहीत समय GMT + 6 समय के बराबर मिलीसेकंड है। तो समस्या क्या है? :(
जेनिथ

12

microtime(true)PHP 5 या PHP 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'];
सवासु राडेविक

microseconds को जीरो पैडेड होना चाहिए:$timeofday=gettimeofday(); echo sprintf("%s.%06d", date('Y-m-d H:i:s', $timeofday['sec']), $timeofday['usec']);
mabi

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-बिट PHP पर हैं तो भी यह काम करता है:

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

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

ध्यान दें कि यह आपको पूर्णांक नहीं देता है, लेकिन तार। हालाँकि, यह कई मामलों में ठीक काम करता है, उदाहरण के लिए जब REST अनुरोधों के लिए URL का निर्माण करते हैं।


यदि आपको पूर्णांक की आवश्यकता है, तो 64-बिट PHP अनिवार्य है।

फिर आप उपरोक्त कोड का पुन: उपयोग कर सकते हैं और (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;

ध्यान दें: इस फ़ंक्शन के लिए microtime () के साथ सुधार के कारण PHP5 की आवश्यकता है और bc गणित मॉड्यूल की भी आवश्यकता है (जैसा कि हम बड़ी संख्या में काम कर रहे हैं, आप देख सकते हैं कि क्या आपके पास 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);

क्या यह वास्तव में दाईं ओर तीन शून्य को पैडिंग करने जैसा है?
जीशान

हर्गिज नहीं। यह दोनों भाग को मिलीसेकंड में बदल देता है और राशि देता है। तो यह शून्य जोड़ने की तुलना में अधिक सटीक है।
user3767296

1
हालांकि यह कोड स्निपेट प्रश्न को हल कर सकता है, जिसमें स्पष्टीकरण सहित वास्तव में आपकी पोस्ट की गुणवत्ता में सुधार करने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है। कृपया अपने कोड को व्याख्यात्मक टिप्पणियों के साथ भीड़ न दें, इससे कोड और स्पष्टीकरण दोनों की पठनीयता कम हो जाती है!
माइकल पेरोलाकोस्की

1

PHP 5.2.2 <

$d = new DateTime();
echo $d->format("Y-m-d H:i:s.u"); // u : Microseconds

PHP 7.0.0 <7.1

$d = new DateTime();
echo $d->format("Y-m-d H:i:s.v"); // v : Milliseconds 

1
Php <7.1 नए DateTime () में माइक्रोसेकंड हमेशा 0 होते हैं । php.net/manual/en/migration71.incompatible.php देखें ।
मबी

-2

इसे इस्तेमाल करो:

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

अलविदा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.