2012-03-28 36 views
56

Làm cách nào để nhân đối tượng TimeSpan trong C#? Giả sử biến duration là một TimeSpan, tôi muốn, ví dụNhân TimeSpan trong .NET

duration*5 

Nhưng điều đó mang lại cho tôi một lỗi "operator * không thể áp dụng với các loại đối tượng TimeSpan và int". Đây là giải pháp hiện tại của tôi

duration+duration+duration+duration+duration 

Nhưng điều này không mở rộng đến bội số nguyên, ví dụ: duration * 3.5

+3

Đây là yêu cầu thực sự rõ ràng và dễ thực hiện. Tôi tự hỏi tại sao MS không nghĩ để bao gồm nhân và chia làm nhà khai thác tiêu chuẩn? – Andy

Trả lời

71

From this article

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

Cảm ơn tôi đã sử dụng 'TimeSpan.FromTicks ((dài) (duration.Ticks * multiplier))' –

+2

Tôi muốn sử dụng các phương thức mở rộng. Giống như đề xuất của Stephen Hewlett trong câu trả lời cho câu hỏi này. –

+8

@MikedeKlerk Đồng ý, nhưng đó là đường cú pháp hơn. OP vẫn cần phải biết gốc của câu trả lời để nó có thể được áp dụng bên trong bất kỳ phương pháp, mở rộng hoặc không –

1

Bạn cần phải xác định những thành viên đó là bạn muốn nhân với 5 ->TimeSpan.TotalMinutes * 5

+1

Điều này làm việc - nhưng một giải pháp chung đẹp hơn là nhân các ve IMHO. –

+1

Không, một TimeSpan là một vô hướng. 'T * 5' sẽ nhân số giờ và số giây. –

+1

@HenkHolterman nhưng 'TotalMinutes' là tổng thời lượng của khoảng thời gian được biểu thị bằng phút, vì vậy nếu khoảng thời gian biểu thị một giờ và 10 phút và 30 giây, TotalMinutes sẽ trả về 70,5. – phoog

10

Cấu trúc TimeSpan không cung cấp một tình trạng quá tải cho các nhà điều hành *, vì vậy bạn có để tự làm điều này:

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

Bạn có thể sử dụng dữ liệu nội bộ của TimeSpan, cụ thể là bọ ve.

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

Vấn đề ở đây là bạn muốn nhân thời gian. Cách giải quyết đơn giản nhất là sử dụng bọ ve. ví dụ.

var ticks = TimeSpan.FromMinutes(1).Ticks; 
var newTimeSpan = TimeSpan.FromTicks(ticks*5); 
33

Đối với những người có nhu cầu sao chép và dán:

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)); 
     } 
    } 
} 

Ví dụ Cách sử dụng:

using Utility; 

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

t sẽ kết thúc như 150 giây.

+0

Phương pháp mở rộng là giải pháp tiện lợi nhất cho các loại vấn đề này. –

+0

Tham số nhân có thể có loại dài mà không mất thêm chi phí. – tm1

Các vấn đề liên quan