Hiển thị sự khác biệt giữa hai giá trị datetime tính theo giờ


185

Tôi đang lấy hai giá trị thời gian ngày từ cơ sở dữ liệu. Khi giá trị được lấy, tôi cần sự khác biệt giữa hai giá trị. Vì thế, tôi tạo một biến thời gian để lưu trữ sự khác biệt của 2 giá trị ngày.

TimeSpan? variable = datevalue1 - datevalue2;

Bây giờ tôi cần chỉ ra sự khác biệt được lưu trữ trong biến Timespan về số giờ. Tôi đã đề cập đến TimeSpan.TotalHours nhưng không thể áp dụng tương tự vì một số lý do. Làm thế nào để làm điều đó? Tôi đang sử dụng C # trên một dự án MVC. Tôi đơn giản cần hiển thị giá trị chênh lệch trong giờ?

EDIT: Vì timespan là nullable, tôi không thể sử dụng tổng số giờ. Bây giờ tôi có thể sử dụng nó bằng cách thực hiện TimeSpanVal.Value.TotalHours ;


3
Tại sao bạn không thể sử dụng TimeSpan.TotalHours?
Fredrik Mörk

nó không cho phép tôi tôi đã thử :(
reggie

Có phải vì thời gian của tôi là null nên tôi không thể sử dụng thuộc tính Totalhours?
reggie

4
Xem ví dụ về chênh lệch thời gian, chênh lệch giờ, chênh lệch phút trên codegateway.com/2012/01/c-datetime-difference.html

đối tượng TimeSpan có tổng số giờ trong.Value.TotalHours
smurtagh

Câu trả lời:


118

Tôi nghĩ rằng bạn đang bối rối bởi vì bạn đã không tuyên bố rằng TimeSpanbạn đã tuyên bố TimeSpan?đó là một nullable TimeSpan . Xóa dấu chấm hỏi nếu bạn không cần nó là nullable hoặc sử dụng variable.Value.TotalHours.


196

bạn cũng có thể muốn nhìn vào

var hours = (datevalue1 - datevalue2).TotalHours;

nhưng trong trường hợp này, hệ thống hiển thị "'System.Nullable <System.TimeSpan>' không chứa định nghĩa cho 'TotalHours' và không có phương thức mở rộng 'TotalHours' chấp nhận đối số đầu tiên của loại 'System.Nullable <System.TimeSpan>' có thể được tìm thấy ". Bạn có thể vui lòng cho tôi biết lý do cho nó?
Neha

8
Nullable sẽ cần một .Value.TotalHours thay vì chỉ .TotalHours. Đó là một yếu tố của gói vô giá trị. Bạn cũng có thể sử dụng nó theo thời gian -> ((TimeSpan) (nullablesatevalue1 - nullablesatevalue2)). TotalHours
MarkKGreenway

90

Trong mẫu, chúng tôi đang tạo hai đối tượng datetime, một đối tượng có thời gian hiện tại và đối tượng khác có 75 giây được thêm vào thời gian hiện tại. Sau đó, chúng ta sẽ gọi phương thức .Subtract () trên đối tượng DateTime thứ hai. Điều này sẽ trả về một đối tượng TimeSpan. Khi chúng tôi nhận được đối tượng TimeSpan, chúng tôi có thể sử dụng các thuộc tính của TimeSpan để nhận Giờ, Phút và Giây thực tế.

DateTime startTime = DateTime.Now;

 DateTime endTime = DateTime.Now.AddSeconds( 75 );

 TimeSpan span = endTime.Subtract ( startTime );
 Console.WriteLine( "Time Difference (seconds): " + span.Seconds );
 Console.WriteLine( "Time Difference (minutes): " + span.Minutes );
 Console.WriteLine( "Time Difference (hours): " + span.Hours );
 Console.WriteLine( "Time Difference (days): " + span.Days );

Kết quả:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0

30
Bạn muốn sử dụng "Tổng cộng" TotalSeconds, TotalMinutesv.v.
Filip Ekberg

38

Có một lý do bạn đang sử dụng Nullable?

Nếu bạn muốn sử dụng Nullablethì bạn có thể viết variable.Value.TotalHours.

Hoặc bạn chỉ có thể viết : (datevalue1 - datevalue2).TotalHours.


Có lẽ bởi vì datevalue1 hoặc datevalue2 làDateTime?
Filip Ekberg

@Filip, không sao đâu, họ nên làm thế DateTime. Trong .NET , DateTime - DateTime = TimeSpan.
Ilya Kogan

1
@Illya, ý tôi là họ có lẽ Nullable<DateTime>và do đó bạn nhận được a Nullable<TimeSpan>.
Filip Ekberg

Câu trả lời của bạn thực sự hiệu quả. Tôi đã tìm kiếm nó.
gdmanandamohon

7

Đây là một ví dụ khác về việc trừ hai ngày trong C # ...

if ( DateTime.Now.Subtract(Convert.ToDateTime(objDateValueFromDatabase.CreatedOn)).TotalHours > 24 ) 
{ 
... 
} 

3

một cách chính xác hơn cho nhân viên trả giờ hoặc yêu cầu chính xác khác ::

decimal DeterminePreciseHours(DateTime startTimestamp, DateTime stopTimestamp)
{
    var span = (stopTimestamp - startTimestamp).Value;
    decimal total = (decimal)span.TotalMilliseconds / 60 / 60 / 1000;
    return Math.Round(total, PRECISION_CONSTANT);
}

https://dotnetfiddle.net/tVIoVJ


1
var startTime = new TimeSpan(6, 0, 0); // 6:00 AM
var endTime = new TimeSpan(5, 30, 0); // 5:30 AM 
var hours24 = new TimeSpan(24, 0, 0);
var difference = endTime.Subtract(startTime); // (-00:30:00)
difference = (difference.Duration() != difference) ? hours24.Subtract(difference.Duration()) : difference; // (23:30:00)

cũng có thể thêm sự khác biệt giữa các ngày nếu chúng ta so sánh hai ngày khác nhau

new TimeSpan(24 * days, 0, 0)

0

WOW, tôi phải nói: giữ cho nó đơn giản:

MessageBox.Show("Result: " + (DateTime.Now.AddDays(10) > DateTime.Now));

Result: True

và:

MessageBox.Show("Result: " + DateTime.Now.AddDays(10).Subtract(DateTime.Now));

Result: 10.00:00:00

Đối tượng DateTime có tất cả logic dựng sẵn để xử lý kết quả Boolean.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.