固定瞬間
你似乎是困惑的java.util.Date &的java.util.Calendar類的性質。它們代表了宇宙時間軸上的固定時刻,而不是正在進行的移動時鐘。
計算機(因此你JVM)已經有一個物理時鐘跟蹤持續時間。日期&日曆類會詢問當前時間的物理時鐘,然後記錄該時刻。或者課程從過去(或未來)重新創造一個時刻。但日期/日曆實例中存儲的日期和時間不會更改,不會隨時鐘一起前滾。
定時器
如果您正在尋找在某個時間到必須解僱一些事件,看到與Java捆綁Timer class。
喬達時間
順便說一句,與java.util.Date &的java.util.Calendar類是出了名的麻煩。多年以來,第三方開源Joda-Time庫曾作爲流行的替代品。
Joda-Time與日期/日曆類相似,其中DateTime
表示時間線上的固定時刻。在內部,java.util.Date和Joda-Time都保留一個長整數,這是自1970年初以來的毫秒數(Unix Epoch)的UTC/GMT(無時區偏移量)。這個數字和一個時間的DateTime商店區偏移。
DateTime now = new DateTime(); // Current date-time in default time zone.
一般最好指定一個時區...
DateTime nowInBoston = new DateTime(DateTimeZone.forID("America/New_York"));
代表了一會兒過去......
DateTime aMomentInThePastInBoston = new DateTime(2007, 9, 23, 13, 14, 15, DateTimeZone.forID("America/New_York"));
喬達時間大多是不可變的(線程安全)。所以我們創建新的實例而不是改變現有實例中的數據。讓我們以上面創建的實例爲同一日期和時區創建一個新實例,但將其時間設置爲一天的第一個時刻(通常意味着時間爲00:00:00)...
DateTime firstMomentOfThatPastDayInBoston = aMomentInThePastInBoston.withTimeAtStartOfDay();
執行此代碼時,每個DateTime實例都位於內存中。他們的日期時間值(即長整數)保持不變。
如果你想提取毫秒紀元以來(也許這就是你的「時間戳」的意思),調用getMillis
方法的數...
long millisSinceEpoch = firstMomentOfThatPastDayInBoston.getMillis(); // Use 'long' not 'int'!
警惕使用這種基於整數的「時間戳」的。不同的編程語言,庫,數據庫引擎,文件系統和其他系統在各種時期使用各種計數(秒,毫秒,納秒)(1970年1月1日的Unix式不是唯一的時代)。傳遞一個原始整數值會變得棘手。
如果你需要使用的java.util.Date與其他班級,轉換...
java.util.Date date = firstMomentOfThatPastDayInBoston.toDate();
搜索StackOverflow上的「喬達」,找到更多的例子。
的Java 8
在Java 8,新java.time.* package是捆綁在一起的Java平臺。這些新課程由JSR 310定義,取代舊的捆綁課程,並受Joda-Time的啓發。
請發佈編譯的代碼。 –
你每次都在同一時間播種日曆,所以你不期望它會返回相同的結果嗎? –
定義「時間戳」。 Java中的時間通常是Unix時代以來的毫秒數。默認API中的Date(包括'Calendar','java.sql.Timestamp'和其他日期/時間組件)沒有格式意義。 – MadProgrammer