2010-10-26 11 views
6

कैसे दो DateTime वस्तुओं के बीच मिलीसेकंड पाने के लिए?कैसे दो dateTime obj के बीच मिलीसेकंड पाने के लिए?

$date = new DateTime(); 
$date2 = new DateTime("1990-08-07 08:44"); 

मैं नीचे टिप्पणी का पालन करने की कोशिश की, लेकिन मुझे एक त्रुटि मिला है।

$stime = new DateTime($startTime->format("d-m-Y H:i:s")); 
$etime = new DateTime($endTime->format("d-m-Y H:i:s")); 
$millisec = $etime->getTimestamp() - $stime->getTimestamp();` 

मैं त्रुटि

अपरिभाषित विधि दिनांक समय के लिए कॉल :: getTimestamp()

उत्तर

-1

दिनांक समय दिनांकों केवल पूरे सेकंड के रूप में जमा हो जाती है मिलता है। आप अभी भी दो दिनांक समय दिनांकों बीच मिलीसेकंड की संख्या की जरूरत है, तो आप उपयोग कर सकते हैं getTimestamp() सेकंड में हर बार प्राप्त करने के लिए (तब अंतर हो और यह मिलीसेकेंड में बदल जाते हैं):

$seconds_diff = $date2.getTimestamp() - $date.getTimestamp() 
$milliseconds_diff = $seconds_diff * 1000 
+3

-1 Lol .. हाँ, सेकंड बार 1000 मिलिसेकंड है। – Fosco

+0

शायद मैंने उल्लेख किया होगा कि शाऊल ने क्या उल्लेख किया है :) – BudgieInWA

+1

+1 क्योंकि यह वास्तव में एकमात्र विधि (कम से कम अवधारणा में) दो सेकंड-सटीक तिथियों को लेने और उनके बीच मिलीसेकंड की संख्या प्राप्त करने के लिए है ... – ircmaxell

15

सख्त अर्थ में, आप नहीं कर सकते।

क्योंकि समयदिनाँक वर्ग के लिए समय की सबसे छोटी इकाई एक दूसरे है यह।

आप एक माप मिलीसेकेंड युक्त की जरूरत है तो का उपयोग microtime()


संपादित करें:

दूसरी ओर आप बस दो ISO-8601 datetimes तो एक संभव समाधान के बीच मिलीसेकेंड में अंतराल प्राप्त करना चाहते हैं, तो

function millisecsBetween($dateOne, $dateTwo, $abs = true) { 
    $func = $abs ? 'abs' : 'intval'; 
    return $func(strtotime($dateOne) - strtotime($dateTwo)) * 1000; 
} 

इससे सावधान रहें डिफ़ॉल्ट से ऊपर समारोह पूर्ण अंतर देता है। आप को पता है कि क्या पहली तारीख को पहले या नहीं है चाहते हैं तो गलत पर तीसरा तर्क निर्धारित किया है।

// Outputs 60000 
echo millisecsBetween("2010-10-26 20:30", "2010-10-26 20:31"); 

// Outputs -60000 indicating that the first argument is an earlier date 
echo millisecsBetween("2010-10-26 20:30", "2010-10-26 20:31", false); 

सिस्टम पर जहां समय डेटाप्रकार का आकार इस प्रकार Windows 7 के रूप में 32 बिट, है या इससे पहले, millisecsBetween 1970-01-01 00:00:00 और 2038-01-19 03:14:07 के बीच तारीखों (Year 2038 problem देखें) के लिए ही अच्छा है।

+0

मैन्युअल microtime() से वर्तमान दिनांक समय देता है। –

+0

तो $ date = new DateTime() करता है; – Saul

+0

क्या आप वाकई डेटटाइम आंतरिक रूप से यूनिक्स टाइमस्टैम्प का उपयोग करते हैं? मैंने सोचा कि यह तारीखों की एक विस्तृत श्रृंखला का प्रतिनिधित्व कर सकता है। –

4

एक पुराने सवाल बाहर Digg करने के लिए क्षमा करें, लेकिन मैं एक समयदिनाँक वस्तु से बाहर मिलीसेकेंड टाइमस्टैम्प प्राप्त करने के लिए एक रास्ता मिल गया है: (में यू

function dateTimeToMilliseconds(\DateTime $dateTime) 
{ 
    $secs = $dateTime->getTimestamp(); // Gets the seconds 
    $millisecs = $secs*1000; // Converted to milliseconds 
    $millisecs += $dateTime->format("u")/1000; // Microseconds converted to seconds 
    return $millisecs; 
} 

हालांकि यह आवश्यक है कि आपकी दिनांक समय वस्तु माइक्रोसेकंड शामिल प्रारूप):

$date_str = "20:46:00.588"; 

$date = DateTime::createFromFormat("H:i:s.u", $date_str); 

यह पीएचपी 5.2 के बाद से ही काम कर रहा है इसलिए माइक्रोसेकंड दिनांक समय के लिए समर्थन तो जोड़ दिया गया है।

इस समारोह के साथ

, अपने कोड निम्नलिखित बन जाएगा:

$date_str = "1990-08-07 20:46:00.588"; 
$date1 = DateTime::createFromFormat("Y-m-d H:i:s.u", $date_str); 

$msNow = (int)microtime(true)*1000; 

echo $msNow - dateTimeToMilliseconds($date1); 
संबंधित मुद्दे