簡體   English   中英

將Java SQL Date從yyyy-MM-dd轉換為dd MMMM yyyy格式的最佳方法

[英]Best way to convert Java SQL Date from yyyy-MM-dd to dd MMMM yyyy format

有沒有一種直接的方法將Java SQL Date從格式yyyy-MM-dd轉換為dd MMMM yyyy格式?

我可以將日期轉換為字符串,然后操縱它,但我寧願將其保留為Java SQL日期。 在我需要這樣做的時候,數據已經從MySQL數據庫中讀取,所以我不能在那里進行更改。

諸如java.sql.Datejava.util.Date (其中java.sql.Date是子類)之類的對象沒有自己的格式。 您使用java.text.DateFormat對象以特定格式顯示這些對象,並且它是確定格式的DateFormat (而不是Date本身)。

例如:

Date date = ...;  // wherever you get this
DateFormat df = new SimpleDateFormat("dd MMMM yyyy");
String text = df.format(date);
System.out.println(text);

注意:在不使用DateFormat對象的情況下打印Date對象時,如下所示:

Date date = ...;
System.out.println(date);

然后它將使用一些默認格式進行格式化。 但是,該默認格式不是您可以更改的Date對象的屬性。

如果是用於演示,您可以立即使用SimpleDateFormat:

package org.experiment;

import java.sql.Date;
import java.text.SimpleDateFormat;

public class Dates {
    private static SimpleDateFormat df = new SimpleDateFormat("MMMM yyyy");

    public static void main(String[] args){

        Date oneDate = new Date(new java.util.Date().getTime());
        System.out.println(df.format(oneDate));
    }

}

目前尚不清楚“Java SQL Date”的含義。 如果你的意思是作為java.sql.Date ,那么它並沒有真正一個字符串格式...它只是一個數字。 特定方式格式化,使用類似java.text.SimpleDateFormat

或者,將其轉換為Joda Time DateTime ; Joda Time是比內置API更好的日期和時間API。 例如, SimpleDateFormat不是線程安全的。

(請注意, java.sql.Date比普通的java.util.Date更精確,但看起來你不需要它。)

TL;博士

myJavaSqlDate.toLocalDate()
             .format(
                 DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG )
                                  .withLocale ( Locale.UK )
             )

2017年5月11日

不要將日期時間值與其文本表示混淆

正如其他人所說, 日期時間對象沒有格式 只有從對象生成或由對象解析的字符串才具有格式。 但是這樣的字符串總是與日期時間對象分開並且不同。

使用對象,而不是字符串

避免使用字符串與數據庫之間傳遞日期時間值。 對於日期時間值,請使用日期時間類來實例化日期時間對象。

JDBC的目的是調解數據庫和Java之間的類型差異。

使用java.time

其他答案已經過時,因為他們使用麻煩的舊遺留日期時間類或古老的Joda-Time庫。 兩者都被java.time類所取代。

如果您手頭有java.sql.Date對象, java.time.LocalDate通過調用添加到舊類的新方法toLocalDate將其轉換為java.time.LocalDate

LocalDate ld = myJavaSqlDate.toLocalDate() ;

對於符合JDBC 4.2及更高版本的JDBC驅動程序 ,您可以直接使用java.time類型。

您似乎對僅限日期的值感興趣。 所以使用LocalDate LocalDate類表示沒有時間且沒有時區的僅日期值。

要以所需格式生成字符串,您可以指定自定義格式設置模式。 但我建議讓java.time自動本地化。

要進行本地化,請指定:

  • FormatStyle用於確定字符串的長度或縮寫。
  • 用於確定(a)翻譯日期名稱,月份名稱等的人類語言的Locale ,以及(b)決定縮寫,大小寫,標點符號,分隔符等問題的文化規范。

例…

LocalDate ld = LocalDate.now ( ZoneId.of ( "America/Montreal" ) );  // Today's date at this moment in that zone.
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate ( FormatStyle.LONG ).withLocale ( Locale.UK );
String output = ld.format ( f );

輸出:2017年5月11日


關於java.time

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

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

要了解更多信息,請參閱Oracle教程 並搜索Stack Overflow以獲取許多示例和解釋。 規范是JSR 310

從哪里獲取java.time類?

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

暫無
暫無

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

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