.NET में टाइमस्पैन को गुणा करें


86

मैं C # में TimeSpan ऑब्जेक्ट को कैसे गुणा करूं? चर durationको मानते हुए एक टाइमस्पैन है , मैं उदाहरण के लिए, चाहूंगा

duration*5

लेकिन जो मुझे एक त्रुटि देता है "ऑपरेटर" टाइपस्पैन और इंट में लागू नहीं किया जा सकता है। यहाँ मेरा वर्तमान समाधान है

duration+duration+duration+duration+duration

लेकिन यह गैर-पूर्णांक गुणकों, जैसे, का विस्तार नहीं करता है। duration * 3.5


5
यह वास्तव में स्पष्ट आवश्यकता है और लागू करने के लिए सरल है। मुझे आश्चर्य है कि एमएस को मानक ऑपरेटरों के रूप में गुणा और विभाजित करने के लिए क्यों नहीं सोचा?
एंडी

जवाबों:


103

इस लेख से

TimeSpan duration = TimeSpan.FromMinutes(1);
duration = TimeSpan.FromTicks(duration.Ticks * 12);
Console.WriteLine(duration);     

4
धन्यवाद मैंने इस्तेमाल कियाTimeSpan.FromTicks((long)(duration.Ticks*multiplier))
कर्नल पैनिक

2
मैं विस्तार विधियों का उपयोग करूंगा। इस सवाल के जवाब में स्टीफन हेवलेट द्वारा सुझाए गए।
माइक डी क्लार्क

11
@MikedeKlerk सहमत हैं, लेकिन यह अधिक चीनी है। ओपी को अभी भी उत्तर की जड़ जानने की जरूरत है ताकि इसे किसी भी विधि, विस्तार या अंदर नहीं लागू किया जा सके
जस्टिन पिहोनी

2
बधाई के लिए धन्यवाद, लेकिन मैं यह बताने के लिए बाध्य हूं कि @JustinPihony ने मुझे करने से लगभग दो साल पहले उत्तर दिया था और यह उनके उत्तर की जानकारी थी जिसने मुझे मेरा लिखने की अनुमति दी।
स्टीफन हेवलेट

45

कॉपी और पेस्ट करने के इच्छुक लोगों के लिए:

namespace Utility
{
    public static class TimeSpanExtension
    {
        /// <summary>
        /// Multiplies a timespan by an integer value
        /// </summary>
        public static TimeSpan Multiply(this TimeSpan multiplicand, int multiplier)
        {
            return TimeSpan.FromTicks(multiplicand.Ticks * multiplier);
        }

        /// <summary>
        /// Multiplies a timespan by a double value
        /// </summary>
        public static TimeSpan Multiply(this TimeSpan multiplicand, double multiplier)
        {
            return TimeSpan.FromTicks((long)(multiplicand.Ticks * multiplier));
        }
    }
}

उदाहरण उपयोग:

using Utility;

private static void Example()
{
    TimeSpan t = TimeSpan.FromSeconds(30).Multiply(5);
}

t 150 सेकंड के रूप में समाप्त हो जाएगा।


विस्तार विधियाँ इस तरह की समस्याओं का सबसे सुविधाजनक समाधान हैं।
माइक डी क्लार्क

गुणक पैरामीटर लंबे समय तक बिना किसी अतिरिक्त लागत के हो सकता है।
tm1

13

TimeSpanसंरचना के लिए एक अधिभार प्रदान नहीं करता है *ऑपरेटर, तो आप स्वयं वह क्या करना है:

var result = TimeSpan.FromTicks(duration.Ticks * 5);


5

आप टाइमस्पैन के आंतरिक डेटा का उपयोग कर सकते हैं, अर्थात् टिक।

TimeSpan day = TimeSpan.FromDays(1);
TimeSpan week = TimeSpan.FromTicks(day.Ticks * 7);


3

Multiply अब TimeSpan के लिए उपलब्ध है !!!

लेकिन केवल .NET कोर और .NET मानक के लिए

के बाद से नेट कोर 2.0 (या नेट स्टैंडर्ड 2.1 ) आप सफलतापूर्वक निम्न कोड चला सकते हैं:

Console.WriteLine(TimeSpan.FromSeconds(45) * 3);
// Prints:
// 00:02:15

सीमाएं

फिर भी, यह ध्यान रखना ज़रूरी है ( जैसा कि डीर में वर्णित है ) कि यह केवल .NET कोर 2.0 +, और .NET मानक 2.1 + के लिए लागू होता है ।

आज (26 नवंबर 2019) तक उपरोक्त कोड नवीनतम .NET फ्रेमवर्क संस्करण: 4.8 में भी विफल हो जाएगा

यदि आप कंसोल कोड में ऊपर दिए गए कोड को आज़माते हैं , उदाहरण के लिए, .NET कोर 1.1 या उससे कम, या .NET फ्रेमवर्क 4.8 या उससे कम चलाकर आपको निम्नलिखित अपवाद दिया जाएगा:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 
'Operator '*' cannot be applied to operands of type 'System.TimeSpan' and 'int''

.NET फ्रेमवर्क में क्यों नहीं?

यह समझने के लिए कि पृथ्वी पर हम .NET फ्रेमवर्क में ऊपर दिए गए कोड का उपयोग क्यों नहीं कर सकते हैं, यह देखने के लिए ज्ञानवर्धक है कि Immo क्या कहता है :

.NET कोर ओपन सोर्स, क्रॉस-प्लेटफॉर्म और .NET का फास्ट-मूविंग वर्जन है। इसकी साइड-बाय-साइड प्रकृति के कारण, यह परिवर्तन कर सकता है जिसे हम .NET फ्रेमवर्क में वापस लागू करने का जोखिम नहीं उठा सकते हैं। इसका मतलब है कि .NET कोर को समय के साथ नए एपीआई और भाषा सुविधाएँ मिलेंगी जो .NET फ्रेमवर्क नहीं कर सकते हैं। बिल्ड में हमने एक डेमो दिखाया कि कैसे फ़ाइल एपीआई .NET कोर पर तेज होती है। अगर हम उन्हीं परिवर्तनों को .NET फ्रेमवर्क में डालते हैं तो हम मौजूदा अनुप्रयोगों को तोड़ सकते हैं, और हम ऐसा नहीं करना चाहते हैं।


2

आपको यह निर्दिष्ट करने की आवश्यकता है कि आप किस सदस्य को 5 -> से गुणा करना चाहते हैं TimeSpan.TotalMinutes * 5


1
यह काम करता है - लेकिन टिक्स आईएमएचओ को गुणा करने के लिए एक अच्छा सामान्य समाधान है।
रॉब लेविन

1
नहीं, TimeSpan एक अदिश राशि है। T * 5घंटे और सेकंड भी गुणा करना चाहिए।
हेनक होल्टरमैन

1
@HenkHolterman, लेकिन TotalMinutesमिनट में व्यक्त की गई समय-अवधि की कुल अवधि है, इसलिए यदि समय-रेखा एक घंटे और 10 मिनट और 30 सेकंड का प्रतिनिधित्व करती है, तो TotalMinute 70.5 वापस आ जाएगी।
फोग

1
@HenkHolterman फॉग नोट के रूप में TotalMinutesसंपत्ति पूरे TimeSpan के मिनटों की कुल राशि देने वाली एक डबल है, अन्य सभी फ़ील्ड्स को ध्यान में रखते हुए। यह समाधान एक ही काम करता है, हालांकि Ticksयह एक अच्छे दृष्टिकोण की तरह लगता है। लेकिन ध्यान रखें कि अगर बाद में आप उपयोगकर्ता को कुछ जानकारी देना चाहते हैं तो टिक्स को बाद में मिनटों में बदलना होगा।
PedroC88

सहमत, मैंने वाक्य के पहले भाग पर प्रतिक्रिया दी। TotalMinutes वास्तव में एक कंपोजिट सदस्य नहीं है।
हेन्क होल्टरमैन

2

यहाँ समस्या यह है कि आप बार-बार गुणा करना चाहते हैं। सबसे सरल समाधान टिक्स का उपयोग करना है। जैसे।

 var ticks = TimeSpan.FromMinutes(1).Ticks;
 var newTimeSpan = TimeSpan.FromTicks(ticks*5);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.