簡體   English   中英

Java程序獲取沒有時間戳的當前日期

[英]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_DAYHOURAM_PM字段是獨立處理的,並且應用了一天中的時間的解析規則。 清除其中一個字段不會重置此日歷的一天中的小時值。 使用 set(Calendar.HOUR_OF_DAY, 0) 重置小時值。

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

你總是可以使用apache commonsDateUtils類。 它有靜態方法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"

查看Formatter API 文檔

  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 中所有日期時間類型的表,包括現代和遺留.png

如果你真的不關心時間和時區,使用 java.time 框架中的LocalDate ()。

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

今天

時區對於確定日期至關重要。 對於任何給定時刻,日期因地區而異。 例如,在法國巴黎午夜過后幾分鍾是新的一天,而在魁北克蒙特利爾仍然是“昨天”。

如果未指定時區,JVM 會隱式應用其當前默認時區。 該默認值可能會在運行時隨時更改(!),因此您的結果可能會有所不同。 最好將您想要/預期的時區明確指定為參數。 如果您想使用 JVM 的當前默認時區,請通過調用ZoneId.systemDefault()明確您的意圖。 如果關鍵,請與您的用戶確認該區域。

Continent/Region格式指定正確的時區名稱,例如America/MontrealAfrica/CasablancaPacific/Auckland 永遠不要使用ESTIST等 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM