簡體   English   中英

日期格式轉換為Java中特定格式的Date對象

[英]Date format conversion as a Date object in a particular format in java

我正在使用Date date3 = Calendar.getInstance().getTime();查找當前時間Date date3 = Calendar.getInstance().getTime(); 這給了我Thu Oct 25 11:42:22 IST 2012

現在,我希望我的Date的格式為2012.10.25 ,並且也作為Date對象而不是字符串。

我嘗試使用以下代碼

DateFormat df = new SimpleDateFormat("yyyy.MM.dd");
Date startDate = df.parse(c_date1);

但是當我最終使用System.out.println(startDate.toString()); 它再次給了我Thu Oct 25 00:00:00 IST 2012.這實際上是因為toString()函數已以顯示這種格式的方式實現。

因此,還有什么其他方法可以將日期獲取為2012.10.25以及日期格式。 Date對象是必需的,因為它將作為日期字段保存在db中。

您需要使用df.format(Date)方法以所需格式獲取日期

Date類沒有“內部”格式,它僅表示日期元素。 要使用特定格式輸出它,您需要執行以下操作:String tDate = formatter1.format(date);

之所以認為它具有“錯誤的格式”,可能是因為當您嘗試輸出它時,默認情況下它會執行toString(),但不會按照您想要的方式對其進行格式化。

如果您向我們提供了有關如何使用該日期(包括您的代碼)的更多詳細信息,那么我們也許可以提供有關如何將格式化程序注入其中的建議。

日期本身不存儲任何格式信息。

Date date3 = Calendar.getInstance().getTime();
SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");
System.out.println(df.format(date3));
    Date date3 = Calendar.getInstance().getTime();
    SimpleDateFormat df = new SimpleDateFormat("yyyy.MM.dd");

    java.sql.Date date = null;

    try {
        date =new java.sql.Date(df.parse(df.format(date3)).getTime());
    } catch (ParseException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    System.out.println(date);

tl; dr

避免使用可怕的舊式日期時間類( DateSimpleDateFormat )。 僅使用現代的java.time類。

LocalDate.now(                                    // Instantiate a date-only object, without time-of-day and without time zone.
    ZoneId.of( "India/Kolkata" )                  // Capture the current date, “today”, as seen by the people in a certain region (a time zone). For any given moment, the date varies around the globe by zone.
)
.format(                                          // Generate a String whose text represents the date-time value of our `LocalDate` object.
    DateTimeFormatter.ofPattern( "uuuu.MM.dd" )   // Specify your desired formatting pattern.
)

2012.10.25

要將當前日期的僅日期值插入數據庫中:

myPreparedStatement.setObject( 
    … , 
    LocalDate.now( ZoneId.of( "India/Kolkata" ) ) 
) ;

日期時間值與字符串混淆

日期時間值沒有“格式”。 僅字符串具有格式。 不要將兩者混為一談。 可以通過解析String實例化日期時間對象。 日期時間對象可以生成一個String以文本形式表示其值。 但是日期時間對象和這樣的字符串仍然是分開且不同的。

它再次給了我Thu Oct 25 00:00:00 IST 2012 這實際上是因為toString()函數已以顯示這種格式的方式實現。

不, toString方法不會“顯示”此格式。 該措辭暗示該格式存在於Date對象中。 但是格式不存在Date對象中Date根本沒有“格式”。 toString方法生成一個String,其字符以這種格式排列。

僅將日期與日期時間混淆

您似乎對僅包含日期的值,沒有日期的時間和沒有時區的值感興趣。 如果是這樣,請使用LocalDate類。

通過解析字符串為所需的值創建LocalDate對象。 最容易使用java.time類中默認使用的標准ISO 8601格式: YYYY-MM-DD

String input = "2012-10-25" ;
LocalDate ld = LocalDate.parse( input ) ;  // No need to specify a formatting pattern, as ISO 8601 format used by default.

您的輸入字符串為非標准格式。 恰好是相同的年月日順序,所以我只用連字符替換FULL STOP點。

String input = "2012.10.25".replace( "." , "-" ) ;  // Convert from custom format to standard ISO 8601 format.
LocalDate ld = LocalDate.parse( input ) ;  // No need to specify a formatting pattern, as ISO 8601 format used by default.

或指定格式模式。

String input = "2012.10.25" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern( "uuuu.MM.dd" ) ;
LocalDate ld = LocalDate.parse( input , f ) ;

使用相同的格式化程序對象生成一個字符串。

String output = ld.format( f ) ;  // Generate a string in this custom format.

當前的日期

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

如果未指定時區,則JVM隱式應用其當前的默認時區。 該默認值可能隨時更改,因此您的結果可能會有所不同。 最好將您的期望/期望時區明確指定為參數。

continent/region的格式指定正確的時區名稱 ,例如America/MontrealAfrica/CasablancaPacific/Auckland 切勿使用ESTIST等3-4個字母的縮寫,因為它們不是真實的時區,不是標准化的,甚至不是唯一的(!)。

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

如果要使用JVM的當前默認時區,請提出要求並作為參數傳遞。 如果省略,則隱式應用JVM的當前默認值。 最好明確一點,因為缺省值可以在運行時隨時由JVM中任何應用程序的任何線程中的任何代碼更改。

ZoneId z = ZoneId.systemDefault() ;  // Get JVM’s current default time zone.

或指定一個日期。 您可以用數字設置月份,一月至十二月的理智編號為1-12。

LocalDate ld = LocalDate.of( 1986 , 2 , 23 ) ;  // Years use sane direct numbering (1986 means year 1986). Months use sane numbering, 1-12 for January-December.

或者,最好使用預定義的Month枚舉對象,一年中的每個月使用一個。 提示:在整個代碼庫中使用這些Month對象,而不是僅使用整數,可以使您的代碼更具自文檔性,確保有效值並提供類型安全

LocalDate ld = LocalDate.of( 1986 , Month.FEBRUARY , 23 ) ;

數據庫

從JDBC 4.2及更高版本開始,我們可以直接與數據庫交換java.time對象。

如果將此LocalDate對象存儲到SQL標准的DATE列中:

myPreparedStatment.setObject( … , ld ) ;

和檢索:

LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;

如果存儲到SQL標准的TIMESTAMP WITH TIME ZONE列,則需要日期時間值而不是僅日期值。 也許您想使用當天的第一時間? 如果是這樣,請讓java.time確定該第一時刻。 不要假設00:00。 諸如夏時制(DST)之類的異常表示一天可能在另一個時間(如01:00)開始。

ZoneId z = ZoneId.of( "Asia/Kolkata" ) ;
ZonedDateTime zdt = ld.atStartOfDay( z ) ;  // First moment of the day for that date for the people in India.

大多數數據庫通過調整為UTC來存儲分區的日期時間。 JDBC驅動程序和數據庫可以為您完成此操作,或者您可以從ZonedDateTime提取UTC值( Instant )。

Instant instant = zdt.toInstant() ;  // Adjust from zoned time to UTC time.

myPreparedStatment.setObject( … , instant ) ;

和檢索:

Instant instant = myResultSet.getObject( … , Instant.class ) ;
ZonedDateTime zdt = instant.atZone( z ) ;

關於java.time

java.time框架內置於Java 8及更高版本中。 這些類取代了麻煩的舊的舊式日期時間類,例如java.util.DateCalendarSimpleDateFormat

現在處於維護模式Joda-Time項目建議遷移到java.time類。

要了解更多信息,請參見Oracle教程 並在Stack Overflow中搜索許多示例和說明。 規格為JSR 310

您可以直接與數據庫交換java.time對象。 使用與JDBC 4.2或更高版本兼容的JDBC驅動程序 不需要字符串,不需要java.sql.*類。

在哪里獲取java.time類?

ThreeTen-Extra項目使用其他類擴展了java.time。 該項目為將來可能在java.time中添加內容提供了一個試驗場。 您可以在這里找到一些有用的類,比如IntervalYearWeekYearQuarter ,和更多

日期對象沒有任何格式。 即您不能將任何Date對象轉換為垂直格式。 因為它具有自己的字符串格式,所以在您打印任何日期時都會返回。 您只能轉換任何字符串格式。

您可以從特定格式的日期字符串轉換或構造任何Date對象。 但是該日期對象將不會采用特定格式。

您的問題就像問:

我有一個值1234567的int變量,並且我希望它在該變量中存儲為“ 1,234,567”。

這根本不合理。

值的存儲方式與值的顯示方式無關。

如果要以給定的日期格式日期保存在數據庫中,則可以使用

DateFormat df = new SimpleDateFormat("yyyy.MM.dd");

    Date date3 = Calendar.getInstance().getTime();

    String startDate = df.format(date3);

    try {

    java.sql.Date date = new java.sql.Date(df.parse(startDate).getTime());

    System.out.println(date);

    } catch (ParseException ex) {
      Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
    }

很簡單

SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd");
format.parse(dateObject.toString());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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