2010-05-10 87 views
13

我需要一個Java程序來獲得當前日期而沒有給時間Java程序來獲得當前的日期沒有時間戳

Date d = new Date(); 

給我的日期和時間戳。

但我只需要日期,沒有時間戳。我使用這個日期來比較沒有時間戳的另一個日期對象。

上打印

System.out.println("Current Date : " + d) 
的d

它應該打印May 11 2010 - 00:00:00

+1

是否要比較兩個日期以查看它們是否在同一天(忽略時間),還是要輸出沒有時間部分的日期?我得到了你想要的第一印象,但答案似乎認爲你想要第二個 – 2010-05-10 20:53:40

+0

那麼,首先他談到比較,然後他給出了打印它作爲一個例子,以表明他沒有時間戳意味着什麼,所以我猜測他真的想比較時間而不是打印它,但如果這是他想要的,他可能不應該提及打印出來,因爲這會混淆問題。 – 2010-05-10 21:02:06

回答

36

一個java.util.Date對象一種時間戳的 - 它包含了自1970年1月1日00:00:00 UTC毫秒數。所以你不能使用標準的Date對象只包含一天/一年/一年,而沒有時間。

據我所知,沒有真正簡單的方法來比較日期,只需在標準Java API中考慮日期(而不是時間)即可。您可以使用Calendar類疏通小時,分鐘,秒和毫秒:

Calendar cal = Calendar.getInstance(); 
cal.clear(Calendar.HOUR_OF_DAY); 
cal.clear(Calendar.AM_PM); 
cal.clear(Calendar.MINUTE); 
cal.clear(Calendar.SECOND); 
cal.clear(Calendar.MILLISECOND); 

不要使用包含要比較它的日期另一個Calendar對象相同,並使用after()before()方法做比較。

如所解釋成java.util.Calendar.clear(INT字段)的的Javadoc:

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

編輯 - 上面的答案是從2010年開始的;在Java 8中,包java.time中有一個新的日期和時間API,它比舊的java.util.Datejava.util.Calendar類更加強大和有用。使用新的日期和時間類,而不是舊的。

+1

我不知道cal.clear(),我會偷它並更新我的答案。 – staticman 2010-05-10 21:08:11

+0

你可以,如果你給我+1 ;-) – Jesper 2010-05-10 21:08:57

+0

沒問題,已經完成。 – staticman 2010-05-11 17:29:52

4

你可以使用

// Format a string containing a date. 
import java.util.Calendar; 
import java.util.GregorianCalendar; 
import static java.util.Calendar.*; 

Calendar c = GregorianCalendar.getInstance(); 
String s = String.format("Duke's Birthday: %1$tm %1$te,%1$tY", c); 
// -> s == "Duke's Birthday: May 23, 1995" 

看一看的Formatter API documentation

+0

我不會像你提到的那樣通過任何日期。 – minil 2010-05-10 20:51:55

+0

更新了要通過返回當前日期的GregorianCalendar.getInstance()的代碼。 – aioobe 2010-05-10 20:55:06

+1

爲什麼明確使用'GregorianCalendar' - 爲什麼不直接使用'Calendar.getInstance()'? – Jesper 2010-05-10 21:01:18

3
DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy"); 
    java.util.Date date = new java.util.Date(); 
    System.out.println("Current Date : " + dateFormat.format(date)); 
11

您可以隨時使用apache commons'DateUtils類。它具有靜態方法isSameDay(),它「檢查兩個日期對象是否在同一天忽略時間。」

static boolean isSameDay(Date date1, Date date2) 
+0

我讀了isSameDay的文檔,我不明白它的工作原理。它如何確定一天而不使用時區?有時兩個Date實例可以在同一天或不同日期(午夜之前和之後),具體取決於假定的時區。它是否假定系統的默認時區? – 2010-05-10 21:59:03

+1

我不知道它究竟做了什麼。你一定要看看源代碼。但是,如果您查看Date API,則它會根據當地時區執行所有操作。實際上,與轉換到其他時區有關的所有方法都已棄用。所以,Date看起來好像並不真正處理時區。如果您想對時區進行任何操作,請查看日曆。 – 2010-05-10 22:23:28

+0

自1970年1月1日00:00:00 GMT以來,內部的日期爲毫秒。我希望每天的計算也在GMT。 – ToolmakerSteve 2015-09-06 20:22:33

0

我認爲這會奏效。使用日曆處理時間字段(將它們重置爲零),然後從日曆中獲取日期。

Calendar c = GregorianCalendar.getInstance(); 
c.clear(Calendar.HOUR_OF_DAY); 
c.clear(Calendar.MINUTE); 
c.clear(Calendar.SECOND); 
c.clear(Calendar.MILLISECOND); 
Date today = c.getTime(); 

或者做相反的事。把你要比較的日期在日曆和比較日曆日期

Date compareToDate; // assume this is set before going in. 
Calendar today = GregorianCalendar.getInstance(); 
Calendar compareTo = GregorianCalendar.getInstance(); 
compareTo.setTime(compareToDate); 
if(today.get(Calendar.YEAR) == compareTo.get(Calendar.YEAR) && 
    today.get(Calendar.DAY_OF_YEAR ) == compareTo.get(Calendar.DAY_OF_YEAR )) { 
    // They are the same day! 
} 
0

下面是快速做它無需額外的依賴關係的不雅方式。
您可以使用擴展java.util.Date的java.sql.Date,儘管爲了比較您必須比較字符串。

java.sql.Date dt1 = new java.sql.Date(System.currentTimeMillis()); 
String dt1Text = dt1.toString(); 
System.out.println("Current Date1 : " + dt1Text); 

Thread.sleep(2000); 

java.sql.Date dt2 = new java.sql.Date(System.currentTimeMillis()); 
String dt2Text = dt2.toString(); 
System.out.println("Current Date2 : " + dt2Text); 

boolean dateResult = dt1.equals(dt2); 
System.out.println("Date comparison is " + dateResult); 
boolean stringResult = dt1Text.equals(dt2Text); 
System.out.println("String comparison is " + stringResult); 

輸出:

當前日期1:2010-05-10
當前日期2:2010-05-10
日期比較假
字符串比較虛

1
private static final DateFormat df1 = new SimpleDateFormat("yyyyMMdd"); 
    private static Date NOW = new Date(); 
    static { 
     try { 
      NOW = df1.parse(df1.format(new Date())); 
     } catch (ParseException e) { 
      e.printStackTrace(); 
     } 
    } 
0

我做了如下,它的工作:

calendar1.set(Calendar.HOUR_OF_DAY, 0); 
calendar1.set(Calendar.AM_PM, 0); 
calendar1.set(Calendar.HOUR, 0); 
calendar1.set(Calendar.MINUTE, 0); 
calendar1.set(Calendar.SECOND, 0); 
calendar1.set(Calendar.MILLISECOND, 0); 
Date date1 = calendar1.getTime();  // Convert it to date 

對您想要比較的其他實例執行此操作。這個邏輯對我有用;我不得不日期它們是否相等或無法比較,但你可以做不同的比較(前,後,等於等)

7

我做了如下,它的工作:(沒有時間戳當前日期)

SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy"); 
Date today = dateFormat.parse(dateFormat.format(new Date())); 
4

您可以在此日期前得到:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
print(dateFormat.format(new Date()); 
0

如果你真的想用一個日期,而不是用於比較的日曆,這是最短的那一塊的代碼,你可以使用:

Calendar c = Calendar.getInstance(); 
Date d = new GregorianCalendar(c.get(Calendar.YEAR), 
           c.get(Calendar.MONTH), 
           c.get(Calendar.DAY_OF_MONTH)).getTime(); 

通過這種方式,您可以確保小時/分鐘/秒/毫秒值爲空白。

0

我正在尋找相同的解決方案,以下爲我工作。

Calendar calendar = Calendar.getInstance(); 
    calendar.set(Calendar.HOUR_OF_DAY, 0); 
    calendar.clear(Calendar.HOUR); 
    calendar.clear(Calendar.MINUTE); 
    calendar.clear(Calendar.SECOND); 
    calendar.clear(Calendar.MILLISECOND); 

    Date today = calendar.getTime(); 

請注意,我用的calendar.set(Calendar.HOUR_OF_DAY,0)的HOUR_OF_DAY而不是使用明確的方法,因爲它是在Calendar.clear方法的Javadoc建議,如下

HOUR_OF_DAY,HOUR和AM_PM字段是獨立處理的,並且 將應用當天時間的解析規則。清除字段中的一個 不會重置此日曆的小時數值。 使用設置(Calendar.HOUR_OF_DAY,0)重置小時值。

利用上述貼溶液I得到輸出作爲

Wed Sep 11 00:00:00 EDT 2013 

使用明確方法,用於在HOUR_OF_DAY 12 12PM之前執行時12PM或00之後執行時重置小時。

8

使用日期格式來解決這個問題:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
DateFormat dateFormat2 = new SimpleDateFormat("MM-dd-yyyy"); 
print(dateFormat.format(new Date()); // will print like 2014-02-20 
print(dateFormat2.format(new Date()); // will print like 02-20-2014 
+0

這是以所需格式獲取日期的簡單方法。 – Janpan 2014-11-07 08:19:25

1

accepted answer by Jesper是正確的,但現在已經過時。 java.util.Date和.Calendar類是非常麻煩的。避免它們。

java.time

而是使用java.time框架,內置到Java 8和更高版本,back-ported to Java 6 & 7further adapted to Android

如果您真的不關心時間和時區,請在java.time framework()中使用LocalDate

LocalDate localDate = LocalDate.of(2014 , 5 , 6); 

請注意,如果您有任何機會需要處理與其他時區或UTC的,這是錯誤的路要走。天真的程序員傾向於認爲他們實際上不需要時區。

調用toString生成標準ISO 8601格式的字符串。

String output = localDate.toString(); 

2014年5月6日

對於其它的格式,搜索棧溢出了DateTimeFormatter類。

喬達時間

雖然現在java.time取代,您可以使用類似LocalDate類的Joda-Time庫(靈感java.time)。

LocalDate localDate = new LocalDate(2014, 5, 6); 
2

您也可以使用Apache的百科全書LIB DateUtils.truncate()

Date now = new Date(); 
Date truncated = DateUtils.truncate(now, Calendar.DAY_OF_MONTH); 

時間將被設置爲00:00:00這樣你就可以用這個日期工作或打印格式:

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 

System.out.println(dateFormat.format(now);  // 2010-05-11 11:32:47 
System.out.println(dateFormat.format(truncated); // 2010-05-11 00:00:00 
0

這裏我的密碼只有日期:

Calendar c=Calendar.getInstance(); 
DateFormat dm = new SimpleDateFormat("dd/MM/yyyy"); 
java.util.Date date = new java.util.Date(); 
System.out.println("current date is : " + dm.format(date));