2010-11-05 28 views
12

Tôi đang cố gắng viết một hàm sẽ chuyển đổi một thể hiện DateTime.Now thành số giây mà nó đại diện để tôi có thể so sánh nó với một cá thể DateTime khác. Đây là những gì tôi hiện có:Chuyển đổi DateTime.Now thành Seconds

public static int convertDateTimeToSeconds(DateTime dateTimeToConvert) 
    { 
     int secsInAMin = 60; 
     int secsInAnHour = 60 * secsInAMin; 
     int secsInADay = 24 * secsInAnHour; 
     double secsInAYear = (int)365.25 * secsInADay; 

     int totalSeconds = (int)(dateTimeToConvert.Year * secsInAYear) + 
         (dateTimeToConvert.DayOfYear * secsInADay) + 
         (dateTimeToConvert.Hour * secsInAnHour) + 
         (dateTimeToConvert.Minute * secsInAMin) + 
         dateTimeToConvert.Second; 

     return totalSeconds; 
    } 

Tôi nhận ra rằng tôi cắt ngắn tính toán trong vài giây trong một năm, nhưng tôi không cần tính toán chính xác. Tôi thực sự muốn biết liệu phương pháp mà tôi đang sử dụng để tính giây là chính xác hay không.

Có ai có bất kỳ thứ gì có thể tính toán số giây được đưa ra từ đối tượng DateTime tốt hơn không?

Ngoài ra, loại trả về có phải là int64 nếu tôi đang mã hóa trong C# nếu tôi tính toán tất cả giây kể từ 0 AD?

+2

Xin lỗi nếu tôi đang tò mò, nhưng tại sao bạn so sánh giây thay vì công cụ tính toán ngày tháng được xây dựng? – Marko

+0

Tôi đang cố gắng trừ một biến là số nguyên được cho trong vài giây từ một trong hai đối tượng được ghi chú ở trên. – AndHeCodedIt

Trả lời

24

Loại DateTime hỗ trợ comparison operators:

if (dateTimeA > dateTimeB) 
{ 
    ... 

này cũng làm việc cho DateTime giá trị trả về bởi DateTime.AddSeconds:

if (dateTimeA.AddSeconds(42) > dateTimeB) 
{ 
    ... 

Nếu bạn thực sự muốn số giây mà trôi qua kể từ 01/01/0001 00:00:00, bạn có thể tính toán sự khác biệt giữa wo Giá trị ngày giờ. Kết quả TimeSpan giá trị có một tài sản TotalSeconds:

double result = DateTime.Now.Subtract(DateTime.MinValue).TotalSeconds; 
+0

+1 ở đây, tôi đã sử dụng cái này. Cảm ơn câu trả lời nhanh chóng. – AndHeCodedIt

5

Nếu mục đích là tìm số giây giữa hai ngày, bạn muốn được tốt hơn bằng cách sử dụng các đối tượng TimeSpan.

TimeSpan span = date2 - date1; 
double seconds = span.TotalSeconds; 
+0

Thận trọng: bạn muốn TimeSpan.TotalSeconds, không phải TimeSpan.Seconds – dtb

+0

Vui lòng sử dụng TotalSeconds, không phải giây. Số giây biểu thị số giây còn lại sau khi bạn tính theo ngày, giờ, phút, v.v ... – rein

+0

Cảm ơn; đã sửa. Nếu được trộn lẫn và nghĩ rằng các hàm "tổng cộng" trả về số lượng toàn bộ đơn vị, thay vì bao gồm bất kỳ phân số nào của các đơn vị đó. – GendoIkari

4

Nếu bạn muốn so sánh 2 đối tượng DateTime, tại sao không sử dụng toán tử được cung cấp? http://msdn.microsoft.com/en-us/library/aa326723%28v=VS.71%29.aspx

DateTime a, b; 
if (a > b) //a is after b 
+0

sẽ làm việc này nếu (a.AddSeconds> b)? Lý do tôi hỏi là bởi vì tôi có một thời gian đệm mà tôi sẽ phải trừ một trong hai đối tượng. Thời gian đệm là tính bằng giây. – AndHeCodedIt

+2

Có, bạn có thể làm điều này: nếu DateTime.Now.AddSeconds (10)> otherDateTime – rein

+0

+1 Đây là triển khai mà tôi sẽ sử dụng. – AndHeCodedIt

3

tôi sẽ sử dụng lớp TimeSpan để có được sự khác biệt chính xác giữa hai trường DateTime. Dưới đây là một ví dụ:

DateTime dt1 = DateTime.Now; 
    DateTime dt2 = new DateTime(2003,4,15); 
    TimeSpan ts = dt1.Subtract(dt2); 

Khi giá trị TimeSpan (ts, trong đoạn mã trên) có sẵn, bạn có thể kiểm tra giá trị của nó để chuyển đổi một cách chính xác các đối tượng TimeSpan đến một số lượng nhất định của giây.

+2

Một bắt để đảm bảo sử dụng ts.TotalSeconds chuyển đổi TimeSpan thành giây thay vì ts.Seconds chỉ là thành phần giây. –

6

Nó thực sự không có ý nghĩa để chuyển đổi một đối tượng DateTime để giây. Giây chỉ có ý nghĩa nếu bạn đang xử lý một khoảng thời gian (TimeSpan). Nếu bạn muốn so sánh hai ngày để có được số giây giữa chúng:

TimeSpan diff = DateTime.Now - PreviousDateTime; 
double seconds = diff.TotalSeconds; 
3

Giả sử bạn thực sự cần phải có được những giây cho đối tượng datetime, bạn trực tiếp có thể nhận được các "Bọ ve" bất động sản từ nó. Đây không phải là trong vài giây nhưng bạn có thể dễ dàng chia cho các yếu tố thích hợp để chuyển đổi các Ticks để giây. Xem: http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx

Vì vậy, một cái gì đó như:

 DateTime.Now.Ticks/TimeSpan.TicksPerSecond 
2

Sử dụng một TimeSpan để có được thời gian trôi qua giữa hai DateTimes có lẽ là cách tốt nhất để đi nhưng nếu bạn thực sự muốn nhận được số giây cho một DateTime cụ thể, bạn có thể thực hiện một số việc như sau:

DateTime dateTimeToConvert = DateTime.Now; 
TimeSpan tsElapsed = dateTimeToConvert - DateTime.MinValue; 
return tsElapsed.TotalSeconds; 

Lưu ý rằng tsElapsed.TotalSeconds là Double, không phải Int.

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