2010-04-12 59 views
7

Dưới đây là mã của tôi:C#: làm cách nào để trừ hai ngày?

DateTime date1 = new DateTime(byear, bmonth, bday, 0, 0, 0); 
DateTime datenow = DateTime.Now; 
DateTime date2 = datenow - date1 

Trên dòng cuối cùng tôi nhận được lỗi này:

Error 1 Cannot implicitly convert type 'System.TimeSpan' to 'System.DateTime'

Làm thế nào để trừ hai ngày?

+3

Sự khác biệt của hai ngày không phải là một ngày và thời gian, vì thế mà loại là khác nhau. –

+2

Tại sao không chỉ đơn giản là sử dụng 'var' và tránh những vấn đề 'gõ' ngớ ngẩn? – missingfaktor

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/1448976/is-timespan-unnecessary/1448990#1448990 –

Trả lời

19

Điều quan trọng là nếu bạn nghĩ về nó, trừ đi một ngày khác không nên mang ngày tháng, nó sẽ cho ra một khoảng thời gian. Và đó là những gì sẽ xảy ra khi bạn sử dụng DateTime.Subtract().

TimeSpan timeSpan = datenow - date1; //timespan between `datenow` and `date1` 

Điều này sẽ làm cho mã hiện tại của bạn hoạt động.

Nếu mặt khác bạn muốn trừ, giả sử, một năm kể từ ngày của bạn, bạn có thể sử dụng:

DateTime oneYearBefore = DateTime.Now.AddYears(-1); //that is, subtracts one year 
+3

- 1 vì 'date1.Subtract (bất kỳ ngày nào)' cung cấp 'TimeSpan', không phải là' DateTime' ... Cần truyền phương thức 'Subtract()' một 'Timespan' để lấy' DateTime' ... nếu không, chỉ cần sử dụng phương thức 'AddDays()'. –

+0

@Charles Bretana: Làm thế nào nó có ý nghĩa cho sự khác biệt của hai ngày để trở về một ngày khác? Cấp, '.Subtract' là thừa vì' -' hoạt động tốt, nhưng tôi không nghĩ rằng nó biện minh cho một downvote ... –

+0

Cảm ơn các bạn, bạn nói đúng. Bây giờ nên ổn thôi. –

1

Kết quả của một sự so sánh ngày là một TimeSpan, không phải là một giá trị DateTime.

Bạn muốn làm điều này:

TimeSpan result = datenow - date1; 
1

.Subtract có hai định nghĩa chồng. Một chấp nhận một DateTime và trả về một TimeSpan, cái kia chấp nhận một TimeSpan và trả về một DateTime.

Nói cách khác, nếu bạn trừ ngày tháng khỏi ngày, bạn sẽ nhận được chênh lệch thời gian. Nếu không, nếu bạn trừ một khoảng thời gian từ một ngày, bạn sẽ có một ngày mới.

3

Như đã đề cập, ngày tháng cung cấp cho bạn một TimeSpan, không phải là DateTime. Nếu bạn muốn có một DateTime, sử dụng AddDays(-1) như trong:

DateTime subtractedDate = date1.AddDays(-1); 
-2

Không chính xác câu trả lời cho câu hỏi của bạn, nhưng tôi thích sử dụng var thay vì chú thích các biến với các loại. var IMO làm cho mã trông sạch hơn nhiều so với cách khác.

Dưới đây là đoạn mã của bạn mã với var s:

var date1 = new DateTime(byear, bmonth, bday, 0, 0, 0); 
var datenow = DateTime.Now; 
var date2 = datenow - date1; 

EDIT:

Đối với C# phát triển với var-là-xấu suy nghĩ:

[Original Post Here]

I use var extensively. There has been criticism that this diminishes the readability of the code, but no argument to support that claim.

Admittedly, it may mean that it's not clear what type we are dealing with. So what? This is actually the point of a decoupled design. When dealing with interfaces, you are emphatically not interested in the type a variable has. var takes this much further, true, but I think that the argument remains the same from a readability point of view: The programmer shouldn't actually be interested in the type of the variable but rather in what a variable does. This is why Microsoft also calls type inference “duck typing.”

So, what does a variable do when I declare it using var? Easy, it does whatever IntelliSense tells me it does. Any reasoning about C# that ignores the IDE falls short of reality. In practice, every C# code is programmed in an IDE that supports IntelliSense.

If I am using a var declared variable and get confused what the variable is there for, there's something fundamentally wrong with my code. var is not the cause, it only makes the symptoms visible. Don't blame the messenger.

Now, the C# team has released a coding guideline stating that var should only be used to capture the result of a LINQ statement that creates an anonymous type (because here, we have no real alternative to var). Well, screw that. As long as the C# team doesn't give me a sound argument for this guideline, I am going to ignore it because in my professional and personal opinion, it's pure baloney. (Sorry; I've got no link to the guideline in question.)

Actually, there are some (superficially) good explanations on why you shouldn't use var but I still believe they are largely wrong. Take the example of “searchabililty”: the author claims that var makes it hard to search for places where MyType is used. Right. So do interfaces. Actually, why would I want to know where the class is used? I might be more interested in where it is instantiated and this will still be searchable because somewhere its constructor has to be invoked (even if this is done indirectly, the type name has to be mentioned somewhere). - Konrad Rudolph

+0

@Downvoter: Chăm sóc bình luận? – missingfaktor

+0

Điều này không có gì để giải quyết vấn đề ban đầu. date2, trong kịch bản này, sẽ không phải là một DateTime, nó sẽ là một TimeSpan. Tất cả điều này đang làm là tiếp tục làm xáo trộn sự thiếu hiểu biết rõ ràng đã thể hiện trong câu hỏi. –

+0

-1 Làm thế nào để var làm cho mọi thứ trông sạch hơn? Bây giờ người đọc phải tìm ra các loại biến của bạn thay vì chúng được tuyên bố rõ ràng. "Tôi" biết rằng DateTime - DateTime trả về TimeSpan và có thể sử dụng các thuộc tính của nó sau này, nhưng rõ ràng là không áp phích. – Greg

1

Bạn có thể làm rõ những gì bạn đang cố gắng tính toán? Sự khác biệt giữa hai ngày trong C# hoặc cuộc sống thực là một khoảng thời gian. Nếu bạn đang cố gắng để tính toán tuổi thì những gì bạn muốn là khoảng thời gian từ khi sinh ra. Thay đổi Ngày 2 thành số

Timespan age = datenow - date1; 
1

Bạn được trừ hai ngày trong mã của mình một cách chính xác. Điều đang xảy ra là bạn mong đợi sự khác biệt giữa hai ngày là một ngày khác, và đó không phải là trường hợp.

Như các áp phích khác đã nhận thấy, bạn nhận được TimeSpan.Từ tên biến của bạn, tôi có cảm giác bạn đang cố gắng tìm ra tuổi của ai đó.

Độ tuổi không phải là ngày, đó là thời lượng. Đọc trên đối tượng TimeSpan và bạn sẽ thấy rằng nó thể hiện chính xác ý tưởng bạn đang tìm kiếm.

Tôi không phải là 0029-01-01 tuổi, tôi 29 tuổi. (Hôm nay không phải là sinh nhật của tôi, nhưng giả sử nó là dành cho môn toán dễ dàng.)

Nếu bạn đang cố gắng kiểm soát tuổi của một người nào đó và kiểm soát đó muốn DateTime bạn có thể sử dụng sai quyền kiểm soát.

1

Thử sử dụng ve ...?

DateTime date1 = new DateTime(1986, 3, 16, 0, 0, 0); 
DateTime datenow = DateTime.Now; 
DateTime date2 = new DateTime(datenow.Subtract(date1).Ticks); 
0

Bạn đang mong đợi sự khác biệt của hai ngày là ngày không phải là ngày. Điều đó được nói, nếu bạn cần trừ một số ngày hoặc tháng nhất định, nó có thể dễ dàng được thực hiện bằng cách sử dụng các phương thức được xây dựng trong đối tượng DateTime như .Thêm ngày (-1), lưu ý rằng tôi đã sử dụng một số âm trừ đi, bạn có thể áp dụng ngược lại. Đây là một ví dụ nhanh.

 DateTime now = DateTime.Now; 

     // Get the date 7 days ago 
     DateTime sevenDaysAgo = now.AddDays(-7); 

     // Bulk: Get the date 7 days and two hours ago 
     DateTime sevenDaysAndtwoHoursAgo = now.Add(-(new TimeSpan(7, 2, 0, 0))); 
0

Sử dụng mã này:

DateTime? Startdate = cStartDate.GetValue<DateTime>().Date; 
DateTime? Enddate = cEndDate.GetValue<DateTime>().Date; 
TimeSpan diff = Enddate.GetValue<DateTime>()- Startdate.GetValue<DateTime>() ; 
txtDayNo.Text = diff.Days.GetValue<string>(); 
0

TimeSpan Ví dụ:

private void Form1_Load(object sender, EventArgs e) 
    { 
     DateTime startdatetime = new DateTime(2001, 1, 2, 14, 30, 0); 
     DateTime enddatetime = DateTime.Now; 
     TimeSpan difference = enddatetime.Subtract(startdatetime); 


     string sdifference = "TotalDays:" + difference.TotalDays + Environment.NewLine; 
     sdifference += "TotalHours:" + difference.TotalHours + Environment.NewLine; 
     sdifference += "TotalMilliseconds:" + difference.TotalMilliseconds + Environment.NewLine; 
     sdifference += "TotalMinutes:" + difference.TotalMinutes + Environment.NewLine; 
     sdifference += "TotalSeconds:" + difference.TotalSeconds + Environment.NewLine; 
     sdifference += "Ticks:" + difference.Ticks + Environment.NewLine;    
     sdifference += "Total:" + difference.Days + " days, " + difference.Hours + " hours, " + difference.Minutes + " minutes, " + difference.Seconds + " seconds and " + difference.Milliseconds + " milliseconds."; 

     TextBox TextBox1 = new TextBox(); 
     TextBox1.Multiline = true; 
     TextBox1.Dock = DockStyle.Fill; 
     TextBox1.Text = sdifference; 
     this.Controls.Add(TextBox1); 

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