[英]Java program to get the current date without timestamp
我需要一個 Java 程序來獲取沒有時間戳的當前日期:
Date d = new Date();
給我日期和時間戳。
但我只需要日期,沒有時間戳。 我使用這個日期與另一個沒有時間戳的日期對象進行比較。
印刷時
System.out.println("Current Date : " + d)
d 它應該打印May 11 2010 - 00:00:00
。
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 field)的 Javadoc 中所解釋的:
HOUR_OF_DAY 、 HOUR和AM_PM字段是獨立處理的,並且應用了一天中的時間的解析規則。 清除其中一個字段不會重置此日歷的一天中的小時值。 使用 set(Calendar.HOUR_OF_DAY, 0) 重置小時值。
編輯- 以上答案來自 2010 年; 在 Java 8 中,包java.time
有一個新的日期和時間 API,它比舊的java.util.Date
和java.util.Calendar
類更強大和有用。 使用新的日期和時間類而不是舊的。
你總是可以使用apache commons的DateUtils
類。 它有靜態方法isSameDay()
,它“檢查兩個日期對象是否在同一天忽略時間”。
static boolean isSameDay(Date date1, Date date2)
使用DateFormat來解決這個問題:
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
我做了以下工作並且它有效:(當前日期沒有時間戳)
SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
Date today = dateFormat.parse(dateFormat.format(new Date()));
您可以在此日期之前獲得:
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
print(dateFormat.format(new Date());
你可以用
// 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"
DateFormat dateFormat = new SimpleDateFormat("MMMM dd yyyy");
java.util.Date date = new java.util.Date();
System.out.println("Current Date : " + dateFormat.format(date));
Jesper 接受的答案是正確的,但現在已經過時了。 java.util.Date 和 .Calendar 類是出了名的麻煩。 避開它們。
而是使用java.time框架,內置於 Java 8 及更高版本中,向后移植到 Java 6 和 7並進一步適應 Android 。
如果你真的不關心時間和時區,使用 java.time 框架中的LocalDate
()。
LocalDate localDate = LocalDate.of( 2014 , 5 , 6 );
時區對於確定日期至關重要。 對於任何給定時刻,日期因地區而異。 例如,在法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。
如果未指定時區,JVM 會隱式應用其當前默認時區。 該默認值可能會在運行時隨時更改(!),因此您的結果可能會有所不同。 最好將您想要/預期的時區明確指定為參數。 如果您想使用 JVM 的當前默認時區,請通過調用ZoneId.systemDefault()
明確您的意圖。 如果關鍵,請與您的用戶確認該區域。
以Continent/Region
格式指定正確的時區名稱,例如America/Montreal
、 Africa/Casablanca
或Pacific/Auckland
。 永遠不要使用EST
或IST
等 2-4 個字母的縮寫,因為它們不是真正的時區,不是標准化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of( "America/Montreal" ) ;
LocalDate today = LocalDate.now( z ) ;
如果您想使用 JVM 的當前默認時區,請詢問它並作為參數傳遞。 如果省略,代碼讀起來會變得模棱兩可,因為我們不確定您是否打算使用默認值,或者您是否像許多程序員一樣沒有意識到這個問題。
ZoneId z = ZoneId.systemDefault() ; // Get JVM’s current default time zone.
LocalDate today = LocalDate.now( z ) ;
如果您關心特定時刻、時間線上的特定點,請不要使用LocalDate
。 如果您關心通過某個地區的人們使用的掛鍾時間看到的日期,請不要使用LocalDate
。
要知道,如果你有需要處理其他時區或UTC的任何機會,這是錯誤的路要走。 天真的程序員往往認為他們不需要時區,但實際上他們確實需要時區。
調用toString
以生成標准ISO 8601格式的字符串。
String output = localDate.toString();
2014-05-06
對於其他格式,在 Stack Overflow 中搜索DateTimeFormatter
類。
雖然現在被 java.time 取代,但您可以使用Joda-Time庫中類似的LocalDate
類(java.time 的靈感)。
LocalDate localDate = new LocalDate( 2014, 5, 6 );
您也可以使用 apache commons 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
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();
}
}
我做了以下工作,它起作用了:
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
對要比較的其他實例執行此操作。 這個邏輯對我有用; 我必須比較日期是否相等,但是您可以進行不同的比較(之前、之后、等於等)
如果您真的想使用 Date 代替 Calendar 進行比較,這是您可以使用的最短代碼:
Calendar c = Calendar.getInstance();
Date d = new GregorianCalendar(c.get(Calendar.YEAR),
c.get(Calendar.MONTH),
c.get(Calendar.DAY_OF_MONTH)).getTime();
這樣您就可以確保小時/分鍾/秒/毫秒值是空白的。
我正在尋找相同的解決方案,以下對我有用。
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 而不是使用 clear 方法,因為在 Calendar.clear 方法的 javadocs 中建議如下
HOUR_OF_DAY、HOUR 和 AM_PM 字段是獨立處理的,並且應用了一天中的時間的解析規則。 清除其中一個字段不會重置此日歷的一天中的小時值。 使用 set(Calendar.HOUR_OF_DAY, 0) 重置小時值。
使用上面發布的解決方案,我得到的輸出為
Wed Sep 11 00:00:00 EDT 2013
對 HOUR_OF_DAY 使用 clear 方法在 12PM 之后執行時將小時重置為 12 或在 12PM 之前執行時將小時重置為 00。
我認為這會奏效。 使用日歷操作時間字段(將它們重置為零),然后從日歷中獲取日期。
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!
}
這是一種在沒有額外依賴的情況下快速完成的不優雅方式。
您可以只使用 java.sql.Date,它擴展了 java.util.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
日期比較錯誤
字符串比較為真
這是我僅獲取日期的代碼:
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));
這是它的完整示例。但是您必須將 Sting 轉換回 Date。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
//TODO OutPut should LIKE in this format MM dd yyyy HH:mm:ss.SSSSSS
public class TestDateExample {
public static void main(String args[]) throws ParseException {
SimpleDateFormat changeFormat = new SimpleDateFormat("MM dd yyyy HH:mm:ss.SSSSSS");
Date thisDate = new Date();//changeFormat.parse("10 07 2012");
System.out.println("Current Date : " + thisDate);
changeFormat.format(thisDate);
System.out.println("----------------------------");
System.out.println("After applying formating :");
String strDateOutput = changeFormat.format(thisDate);
System.out.println(strDateOutput);
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.