2011-10-28 131 views
18

我希望僅以年,月和日獲取當前日期(以毫秒爲單位)。但是,當我使用此代碼:Java日曆獲取當前日期,無需數小時,分鐘,秒和毫秒(以毫秒爲單位)

Calendar cal = Calendar.getInstance(); 
cal.clear(Calendar.HOUR); 
cal.clear(Calendar.MINUTE); 
cal.clear(Calendar.SECOND); 
cal.clear(Calendar.MILLISECOND); 
currentDate = cal.getTimeInMillis(); 

我仍然得到以小時爲單位的毫秒數。 我該如何解決這個問題?

//安德烈

回答

39
Calendar cal = Calendar.getInstance(); 
cal.set(Calendar.HOUR_OF_DAY, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 
currentDate = cal.getTimeInMillis(); 

要小心你的日曆的時區。

+0

謝謝,這樣做了! –

+0

@just_user然後驗證答案... – Fred

+0

它給了我昨天(午夜) – Anthony

5

javadoc: 的HOUR_OF_DAY,HOUR和AM_PM字段的獨立處理並應用了一天的時間分辨率規則。清除其中一個字段不會重置此日曆的小時數值。使用set(Calendar.HOUR_OF_DAY,0)重置小時值。

cal.set(Calendar.HOUR, 0); 
cal.set(Calendar.MINUTE, 0); 
cal.set(Calendar.SECOND, 0); 
cal.set(Calendar.MILLISECOND, 0); 

可能需要設置AM/PM以及

+0

上午/下午 - 這就是爲什麼你使用Calendar.HOUR_OF_DAY作爲另一個例子 – Mifune

8

如果你只希望這相對於GMT並明確只想毫秒,你可以使用這個:

long now = System.currentTimeMillis(); 
long today = now - now % 86400000; 
1

TL;博士

LocalDate.now() 

LocalDate

如果你想要的東西其實只是日期沒有時間,使用LocalDate類。

LocalDate類代表沒有時間和沒有時區的僅有日期的值。

時區對確定日期至關重要。對於任何特定的時刻,日期因地區而異。例如,Paris France午夜後幾分鐘是新的一天,而在Montréal Québec仍然是「昨天」。

continent/region的格式指定一個proper time zone name,如America/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

ZoneId z = ZoneId.of("America/Montreal"); 
LocalDate today = LocalDate.now(z); 

ZonedDateTime

如果你想用時間的日設定爲一天的第一刻的日期,請java.time以確定你的那一刻。不要假設第一時間是00:00:00。夏令時等異常意味着第一時刻可能會在其他時間發生,如01:00:00。

使用該時區對象ZoneId來生成ZonedDateTime對象。

ZonedDateTime zdt = today.atStartOfDay(z); // Determine the first moment of the day on this date for this time zone. 

要查看與UTC值相同的時刻,請提取Instant對象。

Instant instant = zdt.toInstant(); 

避免遺留日期時類

避免麻煩的舊日期,時間類,如Calendar。這些現在是遺留的,由java.time類代替。


關於java.time

java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date,Calendar,& SimpleDateFormat

Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310

從何處獲取java.time類?

ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval,YearWeek,YearQuartermore