แสดงความแตกต่างระหว่างสองค่าวันที่และเวลาในชั่วโมง


186

ฉันกำลังดึงค่าวันที่สองค่าจากฐานข้อมูล เมื่อได้รับค่าฉันต้องการความแตกต่างระหว่างค่าทั้งสอง สำหรับสิ่งนั้นฉันสร้างตัวแปร timespan เพื่อเก็บส่วนต่างของค่าวันที่ 2

TimeSpan? variable = datevalue1 - datevalue2;

ตอนนี้ฉันต้องแสดงความแตกต่างที่เก็บไว้ในตัวแปร Timespan ในแง่ของจำนวนชั่วโมง ฉันอ้างถึงTimeSpan.TotalHoursแต่ใช้ไม่ได้ด้วยเหตุผลเดียวกัน ฉันจะทำอย่างไร ฉันใช้ C # กับโครงการ MVC ฉันต้องการแสดงค่าความแตกต่างเป็นชั่วโมงหรือไม่

แก้ไข: ตั้งแต่ timespan เป็นโมฆะฉันไม่สามารถใช้คุณสมบัติชั่วโมงทั้งหมด ตอนนี้ฉันสามารถใช้งานได้โดยการทำ TimeSpanVal.Value.TotalHours ;


3
ทำไมคุณไม่ใช้TimeSpan.TotalHours?
Fredrik Mörk

มันไม่อนุญาตให้ฉัน ฉันเหนื่อย. :(
reggie

เป็นเพราะช่วงเวลาของฉันเป็นโมฆะที่ฉันไม่สามารถใช้ทรัพย์สินรวมชั่วโมง?
reggie

4
ดูตัวอย่างของความแตกต่างวันที่และเวลาที่แตกต่างชั่วโมงนาทีความแตกต่างในcodegateway.com/2012/01/c-datetime-difference.html

วัตถุ TimeSpan มีชั่วโมงทั้งหมดใน.Value.TotalHours
smurtagh

คำตอบ:


119

ฉันคิดว่าคุณกำลังสับสนเพราะคุณไม่ได้ประกาศให้เป็นTimeSpanคุณได้ประกาศให้เป็นTimeSpan?ซึ่งเป็นnullable TimeSpanลบเครื่องหมายคำถามถ้าคุณไม่ต้องการให้เป็น nullable variable.Value.TotalHoursหรือการใช้งาน


197

คุณอาจต้องการดู

var hours = (datevalue1 - datevalue2).TotalHours;

แต่ในกรณีนี้ระบบจะแสดง "'System.Nullable <System.TimeSpan>' ไม่มีคำจำกัดความสำหรับ 'TotalHours' และไม่มีวิธีการขยาย 'TotalHours' ที่ยอมรับอาร์กิวเมนต์แรกของประเภท 'System.Nullable <System.TimeSpan>' ถูกค้นพบ ". คุณช่วยบอกเหตุผลได้ไหม
Neha

8
ค่า Nullable จะต้องใช้. ค่ารวมทั้งหมดแทนเพียงแค่จำนวนทั้งหมด มันเป็นปัจจัยของการห่อแบบ nullable คุณสามารถโยนมันเป็นช่วงเวลา -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)) TotalHours
MarkKGreenway

90

ในตัวอย่างเรากำลังสร้างวัตถุสองวันที่และเวลาหนึ่งที่มีเวลาปัจจุบันและอีกหนึ่งที่มี 75 วินาทีเพิ่มไปยังเวลาปัจจุบัน จากนั้นเราจะเรียกเมธอด. Subtract () บนวัตถุ DateTime ที่สอง นี่จะส่งคืนวัตถุ TimeSpan เมื่อเราได้รับวัตถุ TimeSpan เราสามารถใช้คุณสมบัติของ TimeSpan เพื่อรับชั่วโมงนาทีและวินาทีจริง

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

ผลลัพธ์:

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

30
คุณต้องการที่จะใช้ "รวม" เช่นTotalSeconds, TotalMinutesฯลฯ
Filip Ekberg

38

มีเหตุผลที่คุณใช้Nullableหรือไม่?

หากคุณต้องการใช้Nullableคุณสามารถเขียนได้variable.Value.TotalHoursได้

(datevalue1 - datevalue2).TotalHoursหรือคุณก็สามารถเขียน:


อาจเป็นเพราะ datevalue1 หรือ datevalue2 คือDateTime?
Filip Ekberg

@Filip ก็ ok DateTimeพวกเขาควรจะ ใน DateTime - DateTime = TimeSpan.NET,
Ilya Kogan

1
@Illya ผมหมายถึงว่าพวกเขาอาจจะและดังนั้นคุณจะได้รับNullable<DateTime> Nullable<TimeSpan>
Filip Ekberg

คำตอบของคุณมีประสิทธิภาพจริงๆ ฉันกำลังมองหามัน
gdmanandamohon

7

นี่เป็นอีกตัวอย่างของการลบสองวันใน C # ...

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

3

วิธีที่แม่นยำยิ่งขึ้นสำหรับชั่วโมงการทำงานของพนักงานหรือความต้องการความแม่นยำอื่น ๆ ::

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)

ยังสามารถเพิ่มความแตกต่างระหว่างวันที่ถ้าเราเปรียบเทียบสองวันที่แตกต่างกัน

new TimeSpan(24 * days, 0, 0)

0

ว้าวฉันต้องพูดว่า: ทำให้มันง่าย:

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

Result: True

และ:

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

Result: 10.00:00:00

วัตถุ DateTime มีตรรกะในตัวทั้งหมดเพื่อจัดการกับผลบูลีน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.