Menampilkan Perbedaan antara dua nilai datetime dalam jam

186

Saya mengambil dua nilai waktu tanggal dari database. Setelah nilai diambil, saya perlu perbedaan antara dua nilai. Untuk itu, saya membuat variabel rentang waktu untuk menyimpan selisih 2 nilai tanggal.

TimeSpan? variable = datevalue1 - datevalue2;

Sekarang saya perlu menunjukkan perbedaan yang disimpan dalam variabel Timespan dalam hal jumlah jam. Saya merujuk ke TimeSpan.TotalHours tetapi tidak dapat menerapkan hal yang sama karena beberapa alasan. Bagaimana aku melakukan itu? Saya menggunakan C # pada proyek MVC. Saya perlu menunjukkan perbedaan nilai dalam hitungan jam?

EDIT: Karena rentang waktu dapat dibatalkan, saya tidak dapat menggunakan properti total jam. Sekarang saya dapat menggunakannya dengan melakukan TimeSpanVal.Value.TotalHours ;

reggie
sumber
3
Kenapa kamu tidak bisa menggunakan TimeSpan.TotalHours?
Fredrik Mörk
itu tidak mengizinkan saya untuk. Saya mencoba. :(
reggie
apakah karena rentang waktu saya dapat dibatalkan sehingga saya tidak dapat menggunakan properti totalhours?
Reggie
4
Lihat contoh perbedaan waktu, Perbedaan Jam, perbedaan Menit pada codegateway.com/2012/01/c-datetime-difference.html
objek TimeSpan memiliki total jam dalam.Value.TotalHours
smurtagh

Jawaban:

119

Saya pikir Anda bingung karena Anda belum mendeklarasikan bahwa TimeSpanAnda telah menyatakan TimeSpan?yang dapat dibatalkan TimeSpan . Hapus tanda tanya jika Anda tidak perlu dibatalkan atau gunakan variable.Value.TotalHours.

Hans Olsson
sumber
197

Anda mungkin juga ingin melihatnya

var hours = (datevalue1 - datevalue2).TotalHours;
Tandai KGreenway
sumber
tetapi dalam kasus ini sistem menunjukkan "'System.Nullable <System.TimeSpan>' tidak mengandung definisi untuk 'TotalHours' dan tidak ada metode ekstensi 'TotalHours' menerima argumen pertama dari tipe 'System.Nullable <System.TimeSpan>' bisa ditemukan ". Bisakah Anda jelaskan alasannya?
Neha
8
Nullable akan membutuhkan .Value.TotalHours, bukan hanya .TotalHours. Ini adalah faktor pembungkus yang dapat dibatalkan. Anda bisa juga melemparkannya sebagai rentang waktu -> ((TimeSpan) (nullabledatevalue1 - nullabledatevalue2)). TotalHours
MarkKGreenway
90

Dalam sampel, kami membuat dua objek datetime, satu dengan waktu saat ini dan yang lainnya dengan 75 detik ditambahkan ke waktu saat ini. Kemudian kita akan memanggil metode .Kurangi () pada objek DateTime kedua. Ini akan mengembalikan objek TimeSpan. Setelah kita mendapatkan objek TimeSpan, kita dapat menggunakan properti TimeSpan untuk mendapatkan Jam, Menit, dan Detik yang sebenarnya.

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

Hasil:

Time Difference (seconds): 15
Time Difference (minutes): 1
Time Difference (hours): 0
Time Difference (days): 0
safi
sumber
30
Anda ingin menggunakan "Total" seperti TotalSeconds, TotalMinutesdll
Filip Ekberg
38

Apakah ada alasan yang Anda gunakan Nullable ?

Jika ingin digunakan Nullablemaka Anda bisa menulisvariable.Value.TotalHours .

Atau Anda hanya dapat menulis: (datevalue1 - datevalue2).TotalHours.

Ilya Kogan
sumber
Mungkin karena datevalue1 atau datevalue2 adalahDateTime?
Filip Ekberg
@Filip, tidak apa-apa, mereka seharusnya DateTime. Dalam. NET DateTime - DateTime = TimeSpan,.
Ilya Kogan
1
@Illya, maksud saya Mereka mungkin Nullable<DateTime>dan karena itu Anda mendapatkan Nullable<TimeSpan>.
Filip Ekberg
Jawaban Anda sangat efektif. Saya mencari itu.
gdmanandamohon
7

Berikut adalah contoh lain dari pengurangan dua tanggal dalam C # ...

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

cara yang lebih tepat untuk jam kerja yang dibayar karyawan atau persyaratan presisi lainnya ::

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

smurtagh
sumber
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)

juga dapat menambahkan perbedaan antara tanggal jika kita membandingkan dua tanggal yang berbeda

new TimeSpan(24 * days, 0, 0)
Balachandar Palanisamy
sumber
0

WOW, saya harus mengatakan: sederhananya:

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

Result: True

dan:

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

Result: 10.00:00:00

Objek DateTime memiliki semua logika bawaan untuk menangani hasil Boolean.

Rusty Nail
sumber