คูณ TimeSpan ใน. NET


87

ฉันจะคูณวัตถุ TimeSpan ใน C # ได้อย่างไร สมมติว่าตัวแปรdurationเป็นTimeSpanฉันต้องการตัวอย่างเช่น

duration*5

แต่นั่นทำให้ฉันมีข้อผิดพลาด "operator * ไม่สามารถใช้กับประเภท TimeSpan และ int" ได้ นี่คือวิธีแก้ปัญหาปัจจุบันของฉัน

duration+duration+duration+duration+duration

แต่สิ่งนี้ไม่รวมถึงการคูณที่ไม่ใช่จำนวนเต็มเช่น duration * 3.5

คำตอบ:


103

จากบทความนี้

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

4
ขอบคุณที่ฉันใช้TimeSpan.FromTicks((long)(duration.Ticks*multiplier))
Colonel Panic

2
ฉันค่อนข้างจะใช้วิธีการขยาย เช่นเดียวกับที่แนะนำโดย Stephen Hewlett ในคำตอบของเขาสำหรับคำถามนี้
Mike de Klerk

11
@MikedeKlerk เห็นด้วย แต่นั่นคือน้ำตาลที่มีปฏิกิริยามากกว่า OP ยังคงต้องรู้รากเหง้าของคำตอบเพื่อที่จะสามารถนำไปใช้ในวิธีการใด ๆ ส่วนขยายหรือไม่
Justin Pihony

2
ขอบคุณสำหรับคำชม แต่ฉันรู้สึกว่าจำเป็นต้องชี้ให้เห็นว่า @JustinPihony ตอบเกือบสองปีก่อนที่ฉันจะทำและเป็นข้อมูลในคำตอบของเขาที่อนุญาตให้ฉันเขียนของฉัน
Stephen Hewlett

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 วินาที


วิธีการขยายเป็นวิธีแก้ปัญหาที่สะดวกที่สุดสำหรับปัญหาประเภทนี้
Mike de Klerk

พารามิเตอร์ตัวคูณสามารถพิมพ์ได้ยาวโดยไม่มีค่าใช้จ่ายเพิ่มเติม
tm1

13

TimeSpanโครงสร้างไม่ให้เกินพิกัดสำหรับการที่*ผู้ประกอบการดังนั้นคุณต้องทำด้วยตัวเองนี้:

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



5

Multiply พร้อมใช้งานแล้วสำหรับ TimeSpan !!!

แต่สำหรับ. NET Coreและ. NET Standard เท่านั้นเท่านั้น

เนื่องจาก. NET Core 2.0 (หรือ. NET Standard 2.1 ) คุณสามารถรันโค้ดต่อไปนี้ได้สำเร็จ:

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

ข้อ จำกัด

อย่างไรก็ตามสิ่งสำคัญที่ควรทราบ ( ตามที่อธิบายไว้ใน docu ) ใช้กับ. NET Core 2.0 + และ. NET Standard 2.1 เท่านั้น + เท่านั้น

ณ วันนี้ (26 พฤศจิกายน 2019) โค้ดด้านบนจะล้มเหลวแม้ใน. NET Frameworkเวอร์ชันล่าสุด: 4.8 4.8

หากคุณลองใช้โค้ดด้านบนในแอปพลิเคชันคอนโซลตัวอย่างเช่นรัน. NET Core 1.1หรือต่ำกว่าหรือ. NET Framework 4.8หรือต่ำกว่าคุณจะได้รับข้อยกเว้นต่อไปนี้:

Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: ไม่สามารถใช้ 'Operator' * 'กับตัวถูกดำเนินการประเภท' System.TimeSpan 'และ' int ''


ทำไมไม่อยู่ใน. NET Framework?

เพื่อให้เข้าใจว่าเหตุใดบนโลกนี้เราจึงไม่สามารถใช้โค้ดด้านบนใน. NET Framework ได้เราจะให้ความกระจ่างในสิ่งที่Immoกล่าวว่า :

.NET Coreเป็น. NET เวอร์ชันโอเพ่นซอร์สข้ามแพลตฟอร์มและการเคลื่อนไหวอย่างรวดเร็ว เนื่องจากลักษณะแบบเคียงข้างกันจึงสามารถรับการเปลี่ยนแปลงที่เราไม่สามารถเสี่ยงต่อการนำกลับไปใช้. NET Framework ได้ ซึ่งหมายความว่า. NET Core จะได้รับ API และคุณลักษณะภาษาใหม่เมื่อเวลาผ่านไปซึ่ง. NET Framework ไม่สามารถทำได้ ที่ Build เราได้สาธิตวิธีการที่ API ของไฟล์เร็วกว่าบน. NET Core หากเราใส่การเปลี่ยนแปลงเดียวกันนี้ลงใน. NET Framework เราอาจทำลายแอปพลิเคชันที่มีอยู่ได้และเราไม่ต้องการทำเช่นนั้น



2

คุณต้องระบุสมาชิกที่ต้องการคูณด้วย 5 -> TimeSpan.TotalMinutes * 5


1
วิธีนี้ใช้ได้ผล - แต่วิธีแก้ปัญหาทั่วไปที่ดีกว่าคือการคูณเห็บ IMHO
Rob Levine

1
ไม่ TimeSpan เป็นสเกลาร์ T * 5ควรคูณชั่วโมงและวินาทีด้วย
Henk Holterman

1
@HenkHolterman แต่TotalMinutesเป็นระยะเวลาทั้งหมดของช่วงเวลาที่แสดงเป็นนาทีดังนั้นหากช่วงเวลาแสดงถึงหนึ่งชั่วโมง 10 นาที 30 วินาที TotalMinutes จะส่งกลับ 70.5
ผี

1
@HenkHolterman ในฐานะที่เป็น phoog บันทึกว่าTotalMinutesProperty เป็น Double ที่ให้จำนวนนาทีทั้งหมดของ TimeSpan ทั้งหมดโดยคำนึงถึงฟิลด์อื่น ๆ ทั้งหมด โซลูชันนี้ใช้งานได้เหมือนกันแม้ว่า Ticksจะดูเหมือนวิธีที่ดีกว่าก็ตาม แต่ให้คำนึงว่าเห็บจะต้องเปลี่ยนเป็นนาทีในภายหลังหากคุณต้องการแสดงข้อมูลบางอย่างที่สมเหตุสมผลให้ผู้ใช้เห็น
PedroC88

ตกลงฉันตอบสนองต่อส่วนแรกของประโยค TotalMinutes ไม่ใช่สมาชิกแบบผสม
Henk Holterman

2

ปัญหาคือคุณต้องการคูณช่วงเวลา วิธีแก้ปัญหาที่ง่ายที่สุดคือใช้เห็บ เช่น.

 var ticks = TimeSpan.FromMinutes(1).Ticks;
 var newTimeSpan = TimeSpan.FromTicks(ticks*5);
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.