यूनिक्स टाइमस्टैम्प को देखते हुए, उस दिन की शुरुआत और अंत कैसे प्राप्त करें?


80

मेरे पास इस तरह एक यूनिक्स टाइमस्टैम्प है:

$timestamp=1330581600

मुझे उस टाइमस्टैम्प के लिए दिन की शुरुआत और दिन का अंत कैसे मिलेगा?

e.g.
$beginOfDay = Start of Timestamp's Day
$endOfDay = End of Timestamp's Day

मैंने यह कोशिश की:

$endOfDay = $timestamp + (60 * 60 * 23);

लेकिन मुझे नहीं लगता कि यह काम करेगा क्योंकि टाइमस्टैम्प ही दिन की सटीक शुरुआत नहीं है।


यदि यह GMT है, तो शायद: $ सीमा = मंजिल / छत ($ टाइमस्टैम्प / (60 * 60 * 24)) * (60 * 60 * 24);
हक्रे

यदि आपका अपेक्षित आउटपुट पूर्णांक के रूप में एक टाइमस्टैम्प है तो एक साधारण लाइनर है: $ startOfDay = mktime (0, 0, 0, date ('n'), date ('j') - 1); $ endOfDay = mktime (0, 0, 0, दिनांक ('एन'), दिनांक ('जे'));
जेरेडराज

जवाबों:


177

स्ट्रेटोटाइम का उपयोग घंटे / मिनट / सेकंड को जल्दी से काटने के लिए किया जा सकता है

$beginOfDay = strtotime("today", $timestamp);
$endOfDay   = strtotime("tomorrow", $beginOfDay) - 1;

डेटटाइम का उपयोग भी किया जा सकता है, हालांकि लंबे टाइमस्टैम्प से प्राप्त करने के लिए कुछ अतिरिक्त चरणों की आवश्यकता होती है

$dtNow = new DateTime();
// Set a non-default timezone if needed
$dtNow->setTimezone(new DateTimeZone('Pacific/Chatham'));
$dtNow->setTimestamp($timestamp);

$beginOfDay = clone $dtNow;
$beginOfDay->modify('today');

$endOfDay = clone $beginOfDay;
$endOfDay->modify('tomorrow');
// adjust from the start of next day to the end of the day,
// per original question
// Decremented the second as a long timestamp rather than the
// DateTime object, due to oddities around modifying
// into skipped hours of day-lights-saving.
$endOfDateTimestamp = $endOfDay->getTimestamp();
$endOfDay->setTimestamp($endOfDateTimestamp - 1);

var_dump(
    array(
        'time ' => $dtNow->format('Y-m-d H:i:s e'),
        'start' => $beginOfDay->format('Y-m-d H:i:s e'),
        'end  ' => $endOfDay->format('Y-m-d H:i:s e'),
    )
);

PHP7 में विस्तारित समय के $now <= $endसाथ, इस के साथ जाँच का उपयोग करने पर एक दूसरे को याद करने की क्षमता है । $now < $nextStartचेकिंग का उपयोग करने से पीएचपी के समय की हैंडलिंग में सेकंड और दिन के उजाले बचत के आसपास विषमताओं के अलावा, उस अंतर से बचा जा सकता है।


2
अंत में शून्य से 1 सेकंड क्यों?
कर्ट ज़ोंग

1
मैंने मूल प्रश्न को दिन के अंतिम सेकंड के रूप में पढ़ा था, बल्कि उसके बाद अगले दिन का पहला सेकंड। first कल ’दिन का पहला सेकंड देगा, इसलिए to -1’ दिन के पहले सेकंड से पहले दूसरा पाने के लिए।
राबाईन

5
'आज' भी दिन की शुरुआत लौटाता हैstrtotime('today', $timestamp)
सेमरा

1
लगता है लीप-सेकंड के मुद्दों के लिए प्रवण
ब्रैड केंट

4
$endOfDay->modify('tomorrow -1 second');भी काम करता है।
CGodo

11

बस डेटाइम

$beginOfDay = DateTime::createFromFormat('Y-m-d H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Y-m-d 00:00:00'))->getTimestamp();
$endOfDay = DateTime::createFromFormat('Y-m-d H:i:s', (new DateTime())->setTimestamp($timestamp)->format('Y-m-d 23:59:59'))->getTimestamp();

पहले एक DateTime ऑब्जेक्ट बनाया जाता है और टाइमस्टैम्प वांछित टाइमस्टैम्प पर सेट होता है। फिर वस्तु को दिन की शुरुआत या अंत में घंटे / मिनट / सेकंड की सेटिंग के रूप में स्वरूपित किया जाता है। अंत में, एक नया DateTime ऑब्जेक्ट इस स्ट्रिंग से बनाया गया है और टाइमस्टैम्प पुनर्प्राप्त है।

पठनीय

$dateTimeObject = new DateTime();
$dateTimeObject->setTimestamp($timestamp);
$beginOfDayString = $dateTimeObject->format('Y-m-d 00:00:00');
$beginOfDayObject = DateTime::createFromFormat('Y-m-d H:i:s', $beginOfDayString);
$beginOfDay = $beginOfDayObject->getTimestamp();

हम इस लंबे संस्करण का उपयोग करके वैकल्पिक रूप से दिन का अंत प्राप्त कर सकते हैं:

$endOfDayObject = clone $beginOfDayOject(); // Cloning because add() and sub() modify the object
$endOfDayObject->add(new DateInterval('P1D'))->sub(new DateInterval('PT1S'));
$endOfDay = $endOfDayOject->getTimestamp();

समय क्षेत्र

टाइमज़ोन को प्रारूप में टाइमस्टैम्प इंडिकेटर को जोड़कर सेट किया जा सकता है जैसे Oडेटाइम ऑब्जेक्ट बनाने के बाद टाइमस्टैम्प को निर्दिष्ट करना:

$beginOfDay = DateTime::createFromFormat('Y-m-d H:i:s O', (new DateTime())->setTimezone(new DateTimeZone('America/Los_Angeles'))->setTimestamp($timestamp)->format('Y-m-d 00:00:00 O'))->getTimestamp();

डेटटाइम का लचीलापन

हम अन्य जानकारी भी प्राप्त कर सकते हैं जैसे कि महीने की शुरुआत / अंत या घंटे के शुरू / अंत में निर्दिष्ट दूसरा प्रारूप बदलकर। महीने के लिए: 'Y-m-01 00:00:00'और 'Y-m-t 23:59:59'। घंटे के लिए: 'Y-m-d H:00:00'और'Y-m-d H:59:59'

ऐड () / सब () और डेटइंटरवल ऑब्जेक्ट्स के संयोजन में विभिन्न स्वरूपों का उपयोग करके, हम किसी भी अवधि की शुरुआत या अंत प्राप्त कर सकते हैं, हालांकि लीप वर्षों को सही ढंग से संभालने के लिए कुछ देखभाल की आवश्यकता होगी।

प्रासंगिक लिंक

PHP डॉक्स से:


2
आपने जो बनाया है, वह सक्सेजफुल और पठनीय है। दुर्भाग्य से यह लीप सेकंड में विफल हो जाएगा। कुछ दिन 23:59:58 पर समाप्त होते हैं, जबकि अन्य 23:59:60 को समाप्त होते हैं। विशेष रूप से यह समस्याओं का कारण होगा यदि कोई भी एक नक्सिस्टेंट डेटाइम के लिए एक तारीख बनाने का प्रयास कर रहा है, जैसे कि 23:59:59 एक दिन पर जो सैद्धांतिक रूप से उससे एक सेकंड पहले समाप्त हो सकता है। स्वीकृत उत्तर, जो PHP के \ DateTime :: संशोधन विधि का उपयोग करता है, इससे बचना होगा। PHP के लिब में बनाया गया सभी लीपों और तिथियों को घेरने वाली विषमताओं के हिसाब से काफी स्मार्ट है।
एलिमिन

@ मुझे पता ही नहीं चला कि कुछ दिन लीप डे की वजह से एक सेकंड पहले या बाद में खत्म हो गए। मैंने सोचा था कि लीप केवल एक साल लीप ईयर पर जोड़ा और कुछ भी प्रभावित नहीं हुआ। क्या आप इस बारे में कुछ उदाहरण दे सकते हैं कि यह कैसे विफल होता है (या क्या आप एक दिन साझा कर सकते हैं जिसमें एक या एक सेकेण्ड कम है)? इसके अलावा, क्या कोई ऐसा लेख है जिसे आप साझा कर सकते हैं जो इस बारे में अधिक बताता है? इशारा करने के लिए धन्यवाद modify। मुझे इसके बारे में पहले नहीं पता था।
रॉबर्ट हिकमैन

पक्का। इन्हें लीप सेकंड कहा जाता है न कि लीप डे या साल । वे पृथ्वी के घूमने की गति को स्थिर गति नहीं होने के लिए जिम्मेदार मानते हैं। मेरा मानना ​​है कि 30 जून, 2016 हमारी आखिरी छलांग थी। विकिपीडिया पृष्ठ किरकिरा विवरण के लिए गोते।
एलिमन

7

आप के संयोजन का उपयोग कर सकते हैं date()और mktime():

list($y,$m,$d) = explode('-', date('Y-m-d', $ts));
$start = mktime(0,0,0,$m,$d,$y);
$end = mktime(0,0,0,$m,$d+1,$y);

mktime() निर्दिष्ट माह के बाहर एक दिन दिए जाने पर महीनों / वर्षों को लपेटने के लिए पर्याप्त स्मार्ट है (जैन 32 वें फेब 1, आदि होगा)


4

आप समय को वर्तमान डेटा में परिवर्तित कर सकते हैं और फिर दिन की शुरुआत का पता लगाने के लिए स्ट्रेटोटाइम फ़ंक्शन का उपयोग कर सकते हैं और दिन के अंत को खोजने के लिए केवल 24 घंटे जोड़ सकते हैं।

आप निकटतम ऑपरेटर (%) का उपयोग निकटतम दिन खोजने के लिए भी कर सकते हैं। उदाहरण के लिए:

$start_of_day = time() - 86400 + (time() % 86400);
$end_of_day = $start_of_day + 86400;

7
नहीं सभी दिनों 86400 सेकंड की होती है, तो यह अभ्यस्त काम आपकी अपेक्षा के अनुसार
काल

@ ओह ओह, मैंने ऐसा नहीं सोचा था
कैमरून

2
जब आप time()दो बार कॉल करते हैं , तो वे अलग-अलग सेकंड हो सकते हैं।
क्रिस हैरिसन

@ क्रिसहिसन $ अब = समय (); $ start_of_day = $ now - 86400 + (अब $ 86400);
करीम

4

स्वीकृत उत्तर दुर्भाग्य से एक php बग के कारण टूट जाता है जो बहुत विशिष्ट परिदृश्यों में होता है। मैं उन परिदृश्यों पर चर्चा करूंगा, लेकिन पहले डेटटाइम का उपयोग करके उत्तर। इस और स्वीकृत उत्तर के बीच एकमात्र अंतर // IMPORTANTलाइन के बाद होता है :

$dtNow = new DateTime();
// Set a non-default timezone if needed
$dtNow->setTimezone(new DateTimeZone('America/Havana'));
$dtNow->setTimestamp($timestamp);

$beginOfDay = clone $dtNow;

// Go to midnight.  ->modify('midnight') does not do this for some reason
$beginOfDay->modify('today');

// now get the beginning of the next day
$endOfDay = clone $beginOfDay;
$endOfDay->modify('tomorrow');

// IMPORTANT
// get the timestamp
$ts = $endOfDay->getTimestamp();
// subtract one from that timestamp
$tsEndOfDay = $ts - 1;

// we now have the timestamp at the end of the day. we can now use that timestamp
// to set our end of day DateTime
$endOfDay->setTimestamp($tsEndOfDay);

तो आप ध्यान देंगे कि ->modify('1 second ago');हम उपयोग करने के बजाय टाइमस्टैम्प प्राप्त करते हैं और एक को घटाते हैं। उपयोग किए गए स्वीकृत उत्तर modify को काम करना चाहिए , लेकिन बहुत विशिष्ट परिदृश्यों में php बग के कारण टूट जाता है। यह बग टाइमजोन में होता है जो दिन की बचत को आधी रात में बदल देता है, जिस दिन घड़ियों को "फॉरवर्ड" किया जाता है। यहाँ एक उदाहरण है जो आप उस बग को सत्यापित करने के लिए उपयोग कर सकते हैं।

बग उदाहरण कोड

// a time zone, Cuba, that changes their clocks forward exactly at midnight. on
// the day before they make that change. there are other time zones which do this
$timezone = 'America/Santiago';
$dateString = "2020-09-05";

echo 'the start of the day:<br>';
$dtStartOfDay = clone $dtToday;
$dtStartOfDay->modify('today');
echo $dtStartOfDay->format('Y-m-d H:i:s');
echo ', '.$dtStartOfDay->getTimestamp();

echo '<br><br>the start of the *next* day:<br>';
$dtEndOfDay = clone $dtToday;
$dtEndOfDay->modify('tomorrow');
echo $dtEndOfDay->format('Y-m-d H:i:s');
echo ', '.$dtEndOfDay->getTimestamp();

echo '<br><br>the end of the day, this is incorrect. notice that with ->modify("-1 second") the second does not decrement the timestamp by 1:<br>';
$dtEndOfDayMinusOne = clone $dtEndOfDay;
$dtEndOfDayMinusOne->modify('1 second ago');
echo $dtEndOfDayMinusOne->format('Y-m-d H:i:s');
echo ', '.$dtEndOfDayMinusOne->getTimestamp();

echo '<br><br>the end of the day, this is correct:<br>';
$dtx = clone $dtEndOfDay;
$tsx = $dtx->getTimestamp() - 1;
$dty = clone $dtEndOfDay;
$dty->setTimestamp($tsx);
echo $dty->format('Y-m-d H:i:s');
echo ', '.$tsx;

बग उदाहरण कोड आउटपुट

the start of the day:
2020-03-26 00:00:00, 1585173600

the start of the *next* day:
2020-03-27 01:00:00, 1585260000

the end of the day, this is incorrect. notice that with ->modify("1 second ago") the
second does not decrement the timestamp by 1:
2020-03-27 01:59:59, 1585263599

the end of the day, this is correct:
2020-03-26 23:59:59, 1585259999

3

आज की तारीख टाइमस्टैम्प शुरू। सरल

$stamp = mktime(0, 0, 0);
echo date('m-d-Y H:i:s',$stamp);

1
यह उन दिनों के अप्रत्याशित व्यवहार का कारण बन सकता है, जिनमें एक दिन की बचत परिवर्तन आधी रात को होता है
कायकिनकोदर

0

भविष्य में किसी के लिए भी यह प्रश्न है:

किसी भी दिन कोड

<?php
$date = "2015-04-12 09:20:00";

$midnight = strtotime("midnight", strtotime($date));
$now = strtotime($date);

$diff = $now - $midnight;
echo $diff;
?>

वर्तमान दिन कोड

<?php
$midnight = strtotime("midnight");
$now = date('U');

$diff = $now - $midnight;
echo $diff;
?>

0
$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = ceil (time() / 86400) * 86400;

यदि आपकी जरूरत एक ही स्क्रिप्ट में दोनों मान है। यह फर्श और छत पर आग लगाने की तुलना में चर में से एक से +/- 86400 सेकंड के लिए तेज़ है। उदाहरण के लिए:

$start_of_day = floor (time() / 86400) * 86400;
$end_of_day = $start_of_day + 86400;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.