การคำนวณจำนวนนาทีระหว่างสองครั้ง


86

ฉันมี datagridview ในแอปพลิเคชันของฉันซึ่งมีเวลาเริ่มต้นและเวลาสิ้นสุด ฉันต้องการคำนวณจำนวนนาทีระหว่างสองครั้งนี้ จนถึงตอนนี้ฉันมี:

var varFinish = tsTable.Rows[intCellRow]["Finish Time"];
TimeSpan varTime = (DateTime)varFinish - (DateTime)varValue;
int intMinutes = TimeSpan.FromMinutes(varTime);

แต่บรรทัดสุดท้ายจะไม่รวบรวมเพราะมันบอกว่าฉันใช้อาร์กิวเมนต์ที่ไม่ถูกต้องสำหรับตัวสร้าง Timespan ฉันค้นคว้ามาพอสมควรเกี่ยวกับวิธีคำนวณจำนวนนาทีระหว่างสองครั้ง แต่ฉันชนกำแพงอิฐเล็กน้อย ใครช่วยแนะนำฉันเกี่ยวกับวิธีที่ดีที่สุดในการบรรลุวัตถุประสงค์ของฉัน

แก้ไข /

ตอนนี้รหัสของฉันมีดังนี้:

var varFinish = tsTable.Rows[intCellRow]["Finish Time"];
TimeSpan varTime = (DateTime)varFinish - (DateTime)varValue;
int intMinutes = (int)varTime.TotalMinutes;

แต่ฉันได้รับการแคสที่ไม่ถูกต้องในบรรทัดที่สอง ทั้ง varFinish และ varValue คือเวลาเช่น 10:00 และ 8:00 พูด จึงไม่แน่ใจว่าทำไมพวกเขาไม่แคสต์เพื่อพิมพ์ DateTime?


หาก varFinish เป็นสตริงคุณจะไม่สามารถส่งสตริงเป็น DateTime ได้ คุณต้องใช้ DateTime.Parse (... ) ถึงอย่างนั้นมันจะบ่งบอกถึงวันที่ของวันนี้หากไม่มีวันที่ใน varFinish
Jim

คำตอบ:


160

ลองทำตามนี้

DateTime startTime = varValue
DateTime endTime = varTime

TimeSpan span = endTime.Subtract ( startTime );
Console.WriteLine( "Time Difference (minutes): " + span.TotalMinutes );

แก้ไข: หากคุณกำลังลอง 'span.Minutes' สิ่งนี้จะส่งคืนเฉพาะช่วงนาทีของช่วงเวลา [0 ~ 59] เพื่อส่งกลับผลรวมของนาทีทั้งหมดจากช่วงเวลานี้เพียงใช้ 'span.TotalMinutes'


2
นี่เป็นคำตอบที่ดี แต่ให้0ในช่วงเวลานาทีเมื่อความแตกต่างระหว่างสองครั้งมากกว่า 1 ชั่วโมง (เช่น 60 นาทีขึ้นไป)
Asif Mehmood

6
@MalikAsif. ฉันเพิ่งลองใช้ช่วง 61 นาทีและได้ 1 ชั่วโมง 1 นาทีตามที่คาดไว้ ถ้าช่วงเวลาเท่ากับ 60 นาทีใช่แล้วนาทีจะเป็นศูนย์ คุณกำลังคิดถึงTotalMinutes()?
Jim

17
ไม่จริง. span.Minutesส่งกลับตัวเลข [0..59] ใช้span.TotalMinutesแทน
Sten Petrov

2
นี่ไม่ควรเป็นคำตอบที่ยอมรับได้ ตามความคิดเห็นอื่น ๆ มันไม่สามารถแก้ปัญหาได้อย่างถูกต้อง
tjmoore

2
@tjmoore ขอบคุณสำหรับข้อเสนอแนะฉันเห็นด้วยกับคุณ ฉันตอบคำถามเดิมในเดือนมกราคม 2012 หลังจากนั้นคำถามได้รับการแก้ไข บางครั้งฉันได้รับการโหวตลงคะแนนสำหรับคำตอบนี้อาจเป็นเพราะคนส่วนใหญ่กำลังอ่านคำตอบ 5 ปีหลังจากที่มีการถามคำถามที่ไม่ได้แก้ไขเดิม
Kane

35
double minutes = varTime.TotalMinutes;
int minutesRounded = (int)Math.Round(varTime.TotalMinutes);

TimeSpan.TotalMinutes : จำนวนนาทีทั้งหมดที่แสดงโดยอินสแตนซ์นี้


2
ใช่ TotalMinutes คือสิ่งที่ฉันกำลังมองหา ขอบคุณมากครับ ^ _ ^
Wahid Bitar

int minutesRounded = (int) Math.Round (นาที);
Sagi

9

ในรหัสTimeSpan.FromMinutesคำถามของคุณคุณใช้ไม่ถูกต้อง โปรดดูเอกสาร MSDNสำหรับ TimeSpan.FromMinutes ซึ่งให้ลายเซ็นวิธีการต่อไปนี้:

public static TimeSpan FromMinutes(double value)

ดังนั้นโค้ดต่อไปนี้จะไม่คอมไพล์

var intMinutes = TimeSpan.FromMinutes(varTime); // won't compile

แต่คุณสามารถใช้คุณสมบัติTimeSpan.TotalMinutesเพื่อคำนวณเลขคณิตนี้แทนได้ ตัวอย่างเช่น:

TimeSpan varTime = (DateTime)varFinish - (DateTime)varValue; 
double fractionalMinutes = varTime.TotalMinutes;
int wholeMinutes = (int)fractionalMinutes;


1

หากความแตกต่างระหว่าง EndTime และ startTime คือมากกว่าหรือเท่ากับ 60 นาที , คำสั่ง: มักจะกลับมาendTime.Subtract(startTime).Minutes; (minutesDifference % 60)เห็นได้ชัดว่าสิ่งใดไม่ต้องการเมื่อเราพูดถึงนาทีเท่านั้น (ไม่ใช่ชั่วโมงที่นี่)
ต่อไปนี้คือบางวิธีหากคุณต้องการรับtotal number of minutes(ในรูปแบบต่างๆ):

// Default value that is returned is of type *double* 
double double_minutes = endTime.Subtract(startTime).TotalMinutes; 
int integer_minutes = (int)endTime.Subtract(startTime).TotalMinutes; 
long long_minutes = (long)endTime.Subtract(startTime).TotalMinutes; 
string string_minutes = (string)endTime.Subtract(startTime).TotalMinutes; 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.