दिनांक स्वरूप प्राप्त करना mdY H: i: मिलीसेकंड से सु


117

मैं मिलिसेकंड से microseconds सहित एक स्वरूपित तारीख प्राप्त करने की कोशिश कर रहा हूं।

केवल एक ही समस्या है मैं 000000 प्राप्त कर रहा हूं

date("m-d-Y H:i:s.u", $milliseconds/1000);

पूर्व। 07-28-2013 11: 26: 14.000000


6
यह अजीब है कि सवाल मिलीसेकंड परिवर्तित करने के लिए कहता है , लेकिन हर कोई जवाब देता है कि माइक्रोसेकंड कैसे परिवर्तित करें। मुझे पता है कि आप दोनों के बीच कनवर्ट कर सकते हैं, लेकिन वास्तव में PHP डॉक या अन्य जगहों से असंबंधित कोड को कॉपी और पेस्ट करने के बजाय सवाल का जवाब देना अच्छा होगा।
laurent

मुझे पता है कि यह एक समय हो गया है, लेकिन बेमोज़ा का जवाब मुझे यहां मिला सबसे अच्छा था
पियान

जवाबों:


122

php.net का कहना है:

माइक्रोसेकंड (PHP 5.2.2 में जोड़ा गया)। ध्यान दें कि एक पूर्णांक पैरामीटर लेने के बाद से यह date()हमेशा उत्पन्न होगा 000000, जबकि DateTime::format()माइक्रोसेकंड DateTimeके साथ बनाया गया था, तो माइक्रोसेकंड का समर्थन करता है ।

तो सरल के रूप में उपयोग करें:

$micro_date = microtime();
$date_array = explode(" ",$micro_date);
$date = date("Y-m-d H:i:s",$date_array[1]);
echo "Date: $date:" . $date_array[0]."<br>";

अनुशंसित और dateTime()संदर्भित से वर्ग का उपयोग करें :

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

print $d->format("Y-m-d H:i:s.u"); // note at point on "u"

नोट uमाइक्रोसेकंड है (1 सेकंड = 1000000 onds)।

Php.net से एक और उदाहरण :

$d2=new DateTime("2012-07-08 11:14:15.889342");

Php.netdateTime() पर संदर्भ

मैंने प्रश्न का उत्तर संक्षिप्त रूप में दिया है और लेखक को सरल करता हूं। कृपया लेखक को अधिक जानकारी के लिए देखें: दिनांक प्रारूप mdY H: i: मिलीसेकंड से


4
मैं आम तौर पर दूसरे फॉर्म का विकल्प चुनता हूं क्योंकि यह पढ़ना और समझना आसान है। इसके अतिरिक्त, डेटटाइम दिनांक / समय के कार्यों की तुलना में कहीं अधिक लचीला और मजबूत है। माइक्रोसेकंड को हैंडल करना एक केस-इन-पॉइंट है।
हरबर्ट

3
@ Geo और AlBundy क्या यह हो सकता है कि आप php के साथ मशीन पर यह कोशिश कर रहे हैं <5.2.2? PHP 5.4.39 यह पूरी तरह से ठीक चलता है ...
रिचर्ड

यह आसान नहीं होगा? दिनांक ('mdY H: i: s')। (int) microtime (सच);
अनंत

@ अनंत, यह वास्तव में काफी आसान होगा। लेकिन गलत है। ;) तुम क्या हो वहाँ सेकंड में सिर्फ युग है। (दुर्भाग्य से, साथ काम नहीं करेगा microtime(false)।)
एसजे।

यह कोड सभी स्थानों पर सही तरीके से काम नहीं करता है। जर्मनी जैसे कुछ देश ".1234" के बजाय "0,1234" या "0.1234" लिखते हैं, इसलिए आपका कोड मेरे लिए निम्न आउटपुट देता है: 2012-07-08 11:14:15.0.889342
डैनियल मार्शेल

138

आप इसे इनपुट प्रारूप के साथ आसानी से कर सकते हैं U.u

$now = DateTime::createFromFormat('U.u', microtime(true));
echo $now->format("m-d-Y H:i:s.u");

यह निम्न आउटपुट का उत्पादन करता है:

04-13-2015 05:56:22.082300

दिनांक प्रारूपों के लिए PHP मैनुअल पेज से:

  • यू = यूनिक्स युग के बाद से
  • यू = माइक्रोसेकंड

http://php.net/manual/en/function.date.php


धन्यवाद मेरे मूल जवाब में एक दोष की ओर इशारा करने के लिए विशालता के लिए जाता है, number_format()लाइन में जोड़कर सटीक दूसरे के मामले को ठीक करना चाहिए। बहुत बुरा यह किसी भी अधिक सुरुचिपूर्ण नहीं लगता ...

$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));

http://php.net/manual/en/function.number-format.php


DaVe के जवाब में समय ज़ोन पर एक नोट।

createFromFormat()यदि कोई निर्दिष्ट नहीं है तो आम तौर पर विधि स्थानीय समय क्षेत्र का उपयोग करेगी।

http://php.net/manual/en/datetime.createfromformat.php

हालाँकि, यहां वर्णित तकनीक डेटाइम ऑब्जेक्ट का उपयोग कर रही है, microtime()जिसके उपयोग से यूनिक्स एपोच (01 जनवरी 1970 00:00:00 GMT) के बाद से निकले सेकंड की संख्या वापस आ जाती है।

http://php.net/manual/en/function.microtime.php

इसका मतलब यह है कि डेटटाइम ऑब्जेक्ट को यूटीसी के लिए प्रारंभिक रूप से आरंभ किया गया है, जो सर्वर आंतरिक कार्यों के लिए ठीक है जो केवल बीता हुआ समय ट्रैक करना चाहते हैं।

यदि आपको किसी विशेष समय क्षेत्र के लिए समय प्रदर्शित करने की आवश्यकता है, तो आपको इसे तदनुसार निर्धारित करने की आवश्यकता है। हालाँकि, ऊपर वर्णित कारणों की वजह से इसे प्रारंभिक चरण ( तीसरे पैरामीटर का उपयोग नहीं करना) के बाद एक अलग चरण के रूप में किया जाना चाहिए createFromFormat()

setTimeZone()विधि इस आवश्यकता को पूरा करने के लिए इस्तेमाल किया जा सकता।

http://php.net/manual/en/datetime.settimezone.php

उदहारण के लिए:

$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
echo $now->format("m-d-Y H:i:s.u") . '<br>';

$local = $now->setTimeZone(new DateTimeZone('Australia/Canberra'));
echo $local->format("m-d-Y H:i:s.u") . '<br>';

निम्नलिखित उत्पादन करता है:

10-29-2015 00:40:09.433818
10-29-2015 11:40:09.433818

ध्यान दें कि यदि आप mysql में इनपुट करना चाहते हैं, तो समय प्रारूप होना चाहिए:

format("Y-m-d H:i:s.u")

19
नोट: DateTime::createFromFormat('U.u', microtime(true));यदि microtime(true)दूसरा सही पर चलता है तो वह गलत लौटेगा । यह '1438616239.000000' के बजाय '1438616239' देता है।
गिगसी

1
महान समाधान, धन्यवाद। ऐसा लगता है कि मैं अपना स्थानीय समय माइक्रोटाइम से $ $ खो रहा हूं। कोई उपाय?
डेव

1
@daVe मैंने समय क्षेत्र पर कुछ जानकारी जोड़ी है, मुझे आशा है कि आप इसके बाद क्या थे।
ArchCodeMonkey

1
number_formatहमेशा के लिए आवश्यक है, तब भी जब यह सटीक दूसरे पर नहीं है। अन्यथा आप precisionPHP कॉन्फ़िगरेशन विकल्प ("प्रदर्शन") की दया पर हैं , जो डिफ़ॉल्ट रूप से PHP 7.0 के रूप में पर्याप्त नहीं है, जिससे परिशुद्धता का नुकसान होता है (माइक्रोसेकंड तक सटीक नहीं)।
तेहो हान हुई

1
हमेशा StackOverflow में नीचे स्क्रॉल करें
tom10271

15

यहाँ थोड़ा कम दृष्टिकोण है। उच्च-सटीक संख्यात्मक दिनांक / समय बनाने के लिए काम करने के बजाय, मैं माइक्रोसेकंड मान को एक स्ट्रिंग में परिवर्तित करता हूं, 0इसे हटाता हूं , और इसे दिनांक / समय स्ट्रिंग के अंत में जोड़ता हूं । मैं आसानी से स्ट्रिंग लंबाई पैरामीटर को समायोजित करके दशमलव की संख्या को ट्रिम कर सकता हूं; यहाँ मैं 4मिलीसेकंड प्राप्त करने के लिए उपयोग करता हूं , लेकिन आप 7माइक्रोसेकंड प्राप्त करने के लिए उपयोग कर सकते हैं ।

$t = explode(" ",microtime());
echo date("m-d-y H:i:s",$t[1]).substr((string)$t[0],1,4);

एक माइक्रोटाइम () मान के लिए 0.98236000 1407400573, यह रिटर्न करता है 08-07-14 01:08:13.982


9

मैं उपयोग कर रहा हूँ

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

output: 2017-09-05 17:04:57.555036

6
echo date('m-d-Y H:i:s').substr(fmod(microtime(true), 1), 1);

उदाहरण आउटपुट:

02-06-2019 16:45:03.53811192512512

यदि आपको दशमलव स्थानों की संख्या को सीमित करने की आवश्यकता है, तो नीचे की रेखा (क्रेडिट mgutt) एक अच्छा विकल्प होगा। (नीचे दिए गए कोड के साथ, 6 दशमलव स्थानों की संख्या को 6 तक सीमित करता है)

echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));

उदाहरण आउटपुट:

02-11-2019 15:33:03.624493

आप सेकंड के लिए सटीक और अग्रणी शून्य से चूक गए। तो सही संस्करण होना चाहिए echo date('m-d-Y H:i:').sprintf('%09.6f', date('s')+fmod(microtime(true), 1));। स्पष्टीकरण की हमें आवश्यकता क्यों है 09: stackoverflow.com/a/28739819/318765
mgutt

आप फिर से सटीक चूक गए;)echo date('H:i:s').substr(fmod(microtime(true), 1), 1, 7);
mgutt

लेकिन खबरदार, substr()गोल नहीं होता। और round()इसके साथ अनुपालन में ट्रेलिंग शून्य में कटौती होगी: stackoverflow.com/questions/7493305/… यही कारण है कि मैंने प्रस्ताव दिया sprintf()
mgutt

@mgutt पहला अंक कब शून्य नहीं होगा? मूल रूप से जिस चीज की आवश्यकता होती है, वह है कि हमेशा शून्य से दूर करने के लिए जब हमेशा fmod से शेष मिलता है 1. सवाल microseconds के लिए पूछता है, लेकिन सेकंड के दशमलव स्थानों के रूप में। दशमलव स्थानों की संख्या को सीमित करने का कोई कारण नहीं है। अधिक दशमलव स्थानों बस बेहतर परिशुद्धता है।
घबराहट

@mgutt मैंने अपने जवाब के लिए अपना पहला सुझाया विकल्प जोड़ा, यह समझाते हुए कि अगर ज़रूरत हो तो दशमलव स्थानों की संख्या को सीमित करने का एक अच्छा तरीका होगा
ghbarratt

3

यदि आप (new Date()).toISOString()किसी कारण से जावास्क्रिप्ट की तरह एक तारीख बनाना चाहते हैं , तो आप इसे PHP में कैसे कर सकते हैं:

$now = microtime(true);
gmdate('Y-m-d\TH:i:s', $now).sprintf('.%03dZ',round(($now-floor($now))*1000));

नमूना उत्पादन:

2016-04-27T18:25:56.696Z

केवल यह साबित करने के लिए कि पूरी संख्या को घटाकर दशमलव भाग की सटीकता को कम नहीं किया जाता है:

>>> number_format(123.01234567890123456789,25)
=> "123.0123456789012408307826263"
>>> number_format(123.01234567890123456789-123,25)
=> "0.0123456789012408307826263"

PHP ने दशमलव स्थानों को गोल किया, लेकिन इसने उन्हें दोनों ही मामलों में उसी तरह गोल किया।


1
नहीं, फ्लोटिंग पॉइंट नंबर पर गणित का उपयोग न करें, यह गलत है। इसके अलावा कई कार्यों को कॉल करने में समय बर्बाद न करें। तीन दशमलव स्थानों पर स्वरूपित तिथि को छोटा करने के लिए बस रूट () का उपयोग करें।
एलएस

@LS ट्रंचिंग 3 दशमलव को राउंड नहीं करेगा जो कि शायद और भी गलत है। जब तक आप वास्तव में छोटे पूर्वाग्रहों में नहीं आते, तब तक नावें नहीं टूटतीं; 3 दशमलव स्थान ठीक होना चाहिए। वास्तव में, मुझे नहीं लगता कि मैं बिल्कुल सटीक बदलाव कर रहा हूं, फ्लोट्स आपके करीब आने के लिए अधिक सटीक हैं। दशमलव संख्या AFAIK में परिवर्तन नहीं करना चाहिए।
एमपीएन

किस बारे में date('Y-m-d\TH:i:s', $time / 1000) . sprintf('.%03dZ', substr($time, 10));?
F8ER

@ F8ER यदि आपका $timeपहले से ही मिलीसेकंड में है, हाँ, तो यह तकनीकी रूप से काम करेगा। substrहैक से प्यार मत करो , लेकिन मुझे लगता है कि यह 2001 और 2286 के बीच की तारीखों के लिए काम करेगा।
मपेन

हां, $timeएमएस है, लेकिन 2286इसका क्या मतलब है, मैं ऐसा क्यों सोचता हूं और इस तरह से बचना कैसे संभव होगा?
F8ER

3

यह ArchCodeMonkey के उत्तर पर आधारित है।

लेकिन बस सरलीकृत, अगर आप बस कुछ जल्दी चाहते हैं जो काम करता है।

function DateTime_us_utc(){
    return DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
}
function DateTime_us(){
    $now = DateTime_us_utc();
    return $now->setTimeZone(new DateTimeZone(date_default_timezone_get()));
}

तो मेरे लिए तो

$now = DateTime_us();
$now->format("m-d-Y H:i:s.u");

3

यहाँ एक और तरीका है जो मुझे थोड़ा और सुरुचिपूर्ण / सरल लगता है:

echo date('Y-m-d-H:i:s.').preg_replace("/^.*\./i","", microtime(true));

1
// Procedural
$fineStamp = date('Y-m-d\TH:i:s') . substr(microtime(), 1, 9);
echo $fineStamp . PHP_EOL;

// Object-oriented (if you must). Still relies on $fineStamp though :-\
$d = new DateTime($fineStamp);
echo $d->format('Y-m-d\TH:i:s.u') . PHP_EOL;

1

PHP 7.1 के रूप में आप बस यह कर सकते हैं:

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

यह इस प्रकार प्रदर्शित होगा:

04-11-2018 10:54:01.321688

0

प्रलेखन निम्नलिखित कहता है:

माइक्रोसेकंड (PHP 5.2.2 में जोड़ा गया)। ध्यान दें कि दिनांक () हमेशा पूर्णांक पैरामीटर लेने के बाद ही 000000 उत्पन्न करेगा, जबकि DateTime :: format () microseconds का समर्थन करता है।

यानी, इसके बजाय डेटटाइम का उपयोग करें।


6
यह काम नहीं करता! date_format (नया DateTime (), 'u') जीरो
JANis Elmeris

हाँ (और मेरे परीक्षणों के अनुसार) ऊपर दिए गए उत्तर के अनुसार new DateTime()0000 भी वापस आएगा। लेकिन अगर आप इसे इंस्टेंट करते समय इसे माइक्रोसेकंड-सटीकता के समय के साथ प्रदान करते हैं, तो यह ठीक काम करता है।
स्काइपिलॉट

@scipilot ठीक है, तो आप ऐसा कैसे करते हैं?
जियो

@Geo ने स्वीकृत उत्तर देखें। new DateTime( 'Y-m-d H:i:s.'.$micro);
स्काइपिलॉट

0

PHP 7.0+ के साथ अब यहाँ आप निम्न कार्य कर सकते हैं:

$dateString = substr($millseconds_go_here,0,10);
$drawDate = new \DateTime(Date('Y-m-d H:i',$dateString));
$drawDate->setTimezone(new \DateTimeZone('UTC'));

यह क्रम में निम्नलिखित है:

  1. पिछले 4 शून्य को तार से बंद कर देता है Date() तारीख को संभाल सके।
  2. दिनांक समय स्ट्रिंग में मिलिसेकंड को दिनांकित स्ट्रिंग स्वरूपित करने के लिए दिनांक का उपयोग करता है।
  3. DateTime()फिर आप उस समय क्षेत्र को संशोधित करने की अनुमति दे सकते हैं जिसमें आप हैं, लेकिन यह सुनिश्चित करें कि date_default_timezone_set("Timezone");आप DateTime()कार्यों और कक्षाओं का उपयोग करने से पहले सेट हैं।
  4. अपनी कक्षाओं में एक कंस्ट्रक्टर का उपयोग करने के लिए यह अच्छा अभ्यास है कि DateTime()कक्षाओं या कार्यों का उपयोग करते समय सही समय क्षेत्र में अपना सुनिश्चित करें ।

0

यदि आप कार्बन का उपयोग कर रहे हैं, तो आप परिभाषित युक्ति "RFC3339_EXTENDED" का उपयोग कर सकते हैं। या इसे अनुकूलित करें।

Carbon::RFC3339_EXTENDED = 'Y-m-d\TH:i:s.vP';

0

@ArchCodeMonkey उत्तर के आधार पर।

यदि आपके पास है तो declare(strict_types=1)आपको स्ट्रिंग के लिए दूसरा तर्क देना होगा

यहां छवि विवरण दर्ज करें


0

मैंने कुछ अलग तरीके अपनाए:

1) माइक्रोटाइम + sscanf + दिनांक:

sscanf(microtime(), '0.%6s00 %s', $usec, $sec);
$date = date('Y-m-d H:i:s.', $sec) . $usec;

मुझे यकीन नहीं है कि माइक्रोसेकंड भाग के लिए माइक्रोटाइम () 10 वर्ण (0.dddddd00) क्यों देता है लेकिन शायद कोई मुझे बता सकता है?

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { sscanf(microtime(), '0.%6s00 %s', $usec, $sec); $date = date('Y-m-d H:i:s.', $sec) . $usec; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "22372.335910797 ms" // macOS PHP 5.6.30
string(18) "16772.964000702 ms" // Linux PHP 5.4.16
string(18) "10382.229089737 ms" // Linux PHP 7.3.11 (same linux box as above)

2) दिनांक समय :: createFromFormat + डेटाइम-> प्रारूप:

$now = new DateTime('NOW');
$date = $now->format('Y-m-d H:i:s.u');

PHP 5.x में काम नहीं कर रहा है ...

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = new DateTime('NOW'); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "45801.825046539 ms" // macOS PHP 5.6.30 (ms not working)
string(18) "21180.155038834 ms" // Linux PHP 5.4.16 (ms not working)
string(18) "11879.796028137 ms" // Linux PHP 7.3.11 (same linux box as above)

3) gettimeofday + तारीख:

$time = gettimeofday();
$date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec'];

-

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $time = gettimeofday(); $date = date('Y-m-d H:i:s.', $time['sec']) . $time['usec']; } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "23706.788063049 ms" // macOS PHP 5.6.30
string(18) "14984.534025192 ms" // Linux PHP 5.4.16
string(18) "7799.1390228271 ms" // Linux PHP 7.3.11 (same linux box as above)

4) microtime + number_format + DateTime :: createFromFormat + DateTime-> प्रारूप:

$now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
$date = $now->format('Y-m-d H:i:s.u');

-

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', '')); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "83326.496124268 ms" // macOS PHP 5.6.30
string(18) "61982.603788376 ms" // Linux PHP 5.4.16
string(16) "19107.1870327 ms" // Linux PHP 7.3.11 (same linux box as above)

5) माइक्रोटाइम + स्प्रिंटफ़ + डेटटाइम :: createFromFormat + DateTime-> प्रारूप:

$now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true)));
$date = $now->format('Y-m-d H:i:s.u');

-

$start_ts = microtime(true); for($i = 0; $i < 10000000; $i++) { $now = DateTime::createFromFormat('U.u', sprintf('%.6f', microtime(true))); $date = $now->format('Y-m-d H:i:s.u'); } var_dump((microtime(true) - $start_ts)*1000 . ' ms');
string(18) "79387.331962585 ms" // macOS PHP 5.6.30
string(18) "60734.437942505 ms" // Linux PHP 5.4.16
string(18) "18594.941139221 ms" // Linux PHP 7.3.11 (same linux box as above)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.