PHP DateInterval में कुल सेकंड की गणना करें


99

दो तिथियों के बीच सेकंड की कुल संख्या की गणना करने का सबसे अच्छा तरीका क्या है? अब तक, मैंने कुछ लाइनों के साथ कोशिश की है:

$delta   = $date->diff(new DateTime('now'));
$seconds = $delta->days * 60 * 60 * 24;

हालाँकि, daysDateInterval ऑब्जेक्ट की संपत्ति वर्तमान PHP5.3 बिल्ड (कम से कम विंडोज पर, यह हमेशा एक ही 6015मूल्य लौटाती है ) में टूटी हुई लगती है । मैंने इसे एक तरह से करने का भी प्रयास किया, जो प्रत्येक माह (दिनों में 30), लीप वर्ष, आदि में दिनों की संख्या को संरक्षित करने में विफल होगा।

$seconds = ($delta->s)
         + ($delta->i * 60)
         + ($delta->h * 60 * 60)
         + ($delta->d * 60 * 60 * 24)
         + ($delta->m * 60 * 60 * 24 * 30)
         + ($delta->y * 60 * 60 * 24 * 365);

लेकिन मैं इस आधे-अधूरे समाधान का उपयोग करके वास्तव में खुश नहीं हूं।


का परिणाम क्या है $delta->format("%r%s")?
वॉरेन

1
समस्या @warrenm साथ formatहै जब कहते हैं कि सेकंड की संख्या 0 है, जबकि मिनट की संख्या 1 है, $delta->format("%r%s")पता चला है होना करने के लिए 0 :(
वादिम समोखिन

4
इससे भी बुरी बात यह है कि अब कोई व्यक्ति किसी कोडर से कोड समीक्षा में पकड़े गए दोष को ठीक कर रहा है, जिसने आपके EXACT कोड को ऊपर चिपकाया है - हर महीने में 30 दिन नहीं हैं, और हर साल 365 दिन नहीं हैं। :) [संपादित करें: और वह कोडर खुद हो सकता है!]
ana१२ ana12

जवाबों:


205

क्या आप इसके बजाय समय टिकटों की तुलना नहीं कर सकते थे ?

$now = new DateTime('now');
$diff = $date->getTimestamp() - $now->getTimestamp()

11
मुझे लगता है कि मैं RTFM नहीं था ... यह वही है जिसकी मुझे तलाश थी; आपका बहुत बहुत धन्यवाद!
efritz

3
+1: अच्छा और साफ! ध्यान दें कि getTimestamp()विधि PHP> = 5.3.0 में उपलब्ध है।
Sk8erPeter

6
अगर आप अपने भद्दे शेयर्ड होस्टर पर PHP 5.2 के साथ अटके हैं, तो format('U')इसके बजाय उपयोग करें getTimestamp()
चिबॉर्ग 14

4
आपका समाधान संगत w / वर्ष 2038 बग नहीं है
जैक एम।

9
@JackM। जानकार अच्छा लगा। मुझे आशा है कि अब जो कुछ भी बनाया जा रहा है वह 2037 में अब नहीं चल रहा है। एक वर्ष 2038 बग सुरक्षित वैकल्पिक समाधान प्रदान करने के लिए स्वतंत्र महसूस करें।
बेन

34

यह फ़ंक्शन आपको DateInterval ऑब्जेक्ट से सेकंड में कुल अवधि प्राप्त करने की अनुमति देता है

/**
 * @param DateInterval $dateInterval
 * @return int seconds
 */
function dateIntervalToSeconds($dateInterval)
{
    $reference = new DateTimeImmutable;
    $endTime = $reference->add($dateInterval);

    return $endTime->getTimestamp() - $reference->getTimestamp();
}

2
यह ध्यान दिया जाना चाहिए कि DateTimeImmutable केवल PHP 5.5 या उच्चतर से उपलब्ध है।
hschmieder

मुझे लगता है कि आपको रिटर्न वैरिएबल $endTimeऔर $referenceएक-दूसरे के साथ बदलना होगा , क्योंकि इससे मुझे भविष्य के अंतराल डेटाइम मूल्य के साथ माइनस रिजल्ट मिलता है।
एलेक्सियोवे

मुझे नहीं लगता कि टाइमस्टैम्प या तो सेकंड्स में है। PHP डेटटाइम = डरावनी एपीआई
क्वाड्राइवियम

5

आप इसे इस तरह से कर सकते हैं:

$currentTime = time();
$timeInPast = strtotime("2009-01-01 00:00:00");

$differenceInSeconds = $currentTime - $timeInPast;

समय () युगों के बाद से सेकंड में वर्तमान समय लौटाता है (1970-01-01T00: 00: 00), और strtotime भी ऐसा ही करता है, लेकिन आपके द्वारा दी गई एक विशिष्ट तिथि / समय के आधार पर।


4
static function getIntervalUnits($interval, $unit)
{
    // Day
    $total = $interval->format('%a');
    if ($unit == TimeZoneCalc::Days)
        return $total;
    //hour
    $total = ($total * 24) + ($interval->h );
    if ($unit == TimeZoneCalc::Hours)
        return $total;
    //min
    $total = ($total * 60) + ($interval->i );
    if ($unit == TimeZoneCalc::Minutes)
        return $total;  
    //sec
    $total = ($total * 60) + ($interval->s );
    if ($unit == TimeZoneCalc::Seconds)
        return $total;  

    return false;
}

0

यह हमेशा अच्छा लगता है जब आपको जो चाहिए वह पहले से ही एक वर्ग के रूप में मौजूद है। आपके मामले में, आपको कुल सेकंड की आवश्यकता है। उससे एक वर्ग क्यों नहीं बना? कोड इस तरह दिख सकता है:

(new TotalFullSeconds(
    new IntervalFromRange(
        new DateTimeFromISO8601String('2017-07-03T14:27:39+00:00'),
        new DateTimeFromISO8601String('2017-07-05T14:27:39+00:00')
    )
))
    ->value()

सहज होने के अलावा, आप अपने आईडीई की स्वतः पूर्णता सुविधा से भी लाभ उठा सकते हैं।

अधिक उपयोगी कार्यान्वयन के लिए, आप इस लाइब्रेरी को देख सकते हैं ।


-8

आप सिर्फ हार्ड नंबरों में डाल सकते हैं (60 * 60 के बजाय - 3600 में डालते हैं) इसलिए उन्हें हर बार गणना करने की आवश्यकता नहीं है।

संपादित करें - अपनी टिप्पणी के आधार पर संख्या तय की।


यह ठीक होगा, और यह शायद PHP में एक दूसरे तेज का एक अंश चलाएगा, लेकिन यह अभी भी मुझे उसी गलत गणना के साथ छोड़ देता है जैसा कि ऊपर दिए गए उदाहरण में है।
efritz
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.