2012-03-09 76 views
2

目前我正在使用此代碼來獲取小時和分鐘:獲取日期和時間在.NET

DateTime currentDate = DateTime.Now.Date; 
int currentHour = DateTime.Now.Date.Hour; 
int currentMin = DateTime.Now.Date.Minute; 

但我正在逐漸零,而不是當前的小時和分鐘。我該如何解決這個問題?

+1

儘管有標籤,但這完全與C#語言無關。這只是.NET。 (現在已修復) – 2012-03-09 07:23:08

+1

我知道你已經有了正確的答案,但只是要知道你的問題是「DateTime.Now.Date」,你應該使用「DateTime.Now」 – 2012-03-09 10:25:54

回答

17

您正在使用Date屬性,該屬性在給定的DateTime中爲您提供午夜。你只是想現在:

​​

請注意,我的代碼僅適用於小時分鐘調用DateTime.Now一次,而不是一次,然後一次。這意味着如果你稱它接近(說)8  上午,你可能會得到7:59或者你可能會得到8:00 - 但你不會得到7:00或8:59,你可以得到如果你有以下任一:

// Bad option 1 (could get 7:00) 
int hour = DateTime.Now.Hour; 
// Imagine the clock rolls over now... 
int minute = DateTime.Now.Minute; 

// Bad option 1 (could get 8:59) 
int minute = DateTime.Now.Minute; 
// Imagine the clock rolls over now... 
int hour = DateTime.Now.Hour; 

你應該考慮不使用DateTime.Now直接的。它有兩個問題:

  • 它返回本地時區的時間;這可能好於桌面應用程序,但不適合服務器端應用程序
  • 很難測試

如果您創建一個IClock接口或類似的東西其中有一個方法或屬性,給你當前UTC時間,你可以隨時將其轉換爲當地時間(毫不含糊地說,這不正確),並且還可以爲測試目的注入虛擬實現。

編輯:簡短而完整的程序,證明是,這個代碼真的確實工作:

using System; 

public class Test 
{ 
    static void Main(string[] args) 
    { 
     DateTime now = DateTime.Now; 
     int hour = now.Hour; 
     int minute = now.Minute; 
     Console.WriteLine(hour); 
     Console.WriteLine(minute); 
    } 
} 

在我的機器,現在,該打印7,然後35.如果打印0,然後0,那麼你的機器一定是午夜。


正如你可能會注意到,我已經添加到所有繼續做這個答案的註釋。道歉,如果這看起來像垃圾郵件,但我想要得到那些回答者的注意 - 這是一個常見的錯誤,我想幫助根除。如果沒有評論,海報可能會在沒有再次查看的情況下繼續前進......

+0

它不起作用 – 2012-03-09 07:19:54

+1

Works for fine for我。 – 2012-03-09 07:20:53

+0

它是如何工作的? – 2012-03-09 07:20:59

0

Date屬性不包含有關小時,分鐘,秒,毫秒的任何信息。只需使用DateTime.Now。

1

那是因爲Date刪除了DateTime的時間部分,所以Date.HourDate.Minute將始終爲00:00。試試這個:

DateTime currentDate = DateTime.Now.Date; 
int currentHour = DateTime.Now.Hour; 
int currentMin = DateTime.Now.Minute; 

編輯 根據喬恩斯基特的評論,我完全同意。我只是做了最小的改變,以消除給他提出問題的問題,特別是致電.Date

在真實情況下,您應該使用DateTime.Now一次,首先獲取時間,然後提取所需的部分,以確保您提取的部分完全相同的時間,並且在兩者之間沒有改變。我不打算在這裏寫這些代碼,因爲這是Jon的答案的副本,所以請看他的答案以獲取詳細信息。

+0

謝謝它適合我。 – 2012-03-09 07:22:42

+2

反覆使用'DateTime.Now'是一個非常糟糕的主意,而不是一次評估*。詳情請參閱我的回答。 – 2012-03-09 07:27:01

+0

我認爲將代碼放在這裏會更好,因爲這會作爲接受的答案,因此我們需要讓其他人更好地查看/查看答案。 – V4Vendetta 2012-03-09 07:35:42

0

應該是:

DateTime currentDate = DateTime.Now.Date; 
int currentHour = DateTime.Now.Hour; 
int currentMin = DateTime.Now.Minute; 
+0

請閱讀我的答案,爲什麼這個代碼是一個壞主意 - 想想如果你開始執行這個*會發生什麼,只是*在一小時的開始之前...... – 2012-03-09 07:30:22

+0

謝謝@Jon :)你的回答很有意義。 – gideon 2012-03-09 09:38:04

2

DateTime.Date財產returns

用相同的日期作爲該實例的新對象,而時間值 設定爲12:00:00午夜(00 :00:00)。

所以完全預計你會得到所有的「時間」字段的零。

只是不要使用Date屬性,而是直接在DateTime.Now上調用HourMinute

注意,獲得一致的值(和性能方面的原因),您存儲前人的精力當前DateTime.Now結果,並在有效的:

DateTime now = DateTime.Now; 
DateTime currentDate = now.Date; 
int currentHour = now.Hour; 
int currentMinute = now.Minute; 

最後,需要注意的是,只要你不「看看「時間分數,根本沒有使用DateTime.Date,只需使用DateTime.Now結果即可。