不確定問題是否適用於java.util.Date
(日期加上時間)或一個java.sql.Date
(僅限日期)。在這兩種情況下,您應該使用現代java.time類而不是麻煩的遺留日期 - 時間類。
其他一些java.sql.Date
問題鏈接爲這一個的重複。所以我在這裏處理這兩個類(sql & util)。
java.util.Date
遺留java.util.Date
類表示UTC時間線上的時刻。這意味着一個具有時間的日期。訣竅是您的輸入字符串僅用於日期值。您可以首先將字符串解析爲僅限日期的值,然後根據需要指定一個時間段。
您的輸入字符串符合YYYY-MM-DD格式的標準ISO 8601。解析/生成字符串時,java.time類默認爲標準格式。所以不需要指定格式化模式。
LocalDate ld = LocalDate.parse("2013-05-16") ;
對於一天中的某個時刻,您可能需要一天的第一時刻。不要假設第一刻是00:00:00
。在某些時區,夏令時(DST)等異常情況可能導致在不同時間開始一天,如01:00:00
。爲了解決這種異常情況,我們必須指定一個時區來確定當天的第一時刻。
在continent/region
的格式指定一個proper time zone name,如America/Montreal
,Africa/Casablanca
,或Pacific/Auckland
。切勿使用3-4字母縮寫,如EST
或IST
,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。
ZoneId z = ZoneId.of("America/Montreal") ;
在詢問java.time中應用該區域以確定一天的第一時刻。作爲結果,我們產生了一個ZonedDateTime
對象。
ZonedDateTime zdt = ld.atStartOfDay(z) ;
如果你希望一天中的特定時間,應用LocalTime
對象。請記住,您的特定時間段可能不適用於該特定區域的特定日期。例如,您可能正在指定在DST切換期間發生的每日時間。在這種情況下,ZonedDateTime
班有調整適應的政策。請務必閱讀文檔以瞭解該政策和最終的行爲。
LocalTime lt = LocalTime.of(12 , 0) ;
ZonedDateTime zdt = ZonedDateTime.of(ld , lt , z) ; // Time-of-day may be adjusted as needed.
java.sql.Date
無需使用java.sql.Date
。該班級被LocalDate
取代。 LocalDate
類表示沒有時間和不帶時區的僅限日期的值。
與JDBC 4.2符合
JDBC驅動程序可以通過調用java.time類型直接處理:
要向用戶呈現LocalDate
,請在用戶界面中生成一個顯示字符串。使用DateTimeFormatter
自動本地化。要進行本地化,請指定:
FormatStyle
確定字符串應該多長或縮短多少。
Locale
確定(a)用於翻譯日期名稱,月份名稱等的人類語言,以及(b)用於確定縮寫,大寫,標點符號,分隔符等問題的文化規範。
例子:
Locale l = Locale.CANADA_FRENCH ;
DateTimeFormatter f = DateTimeFormatter.ofLocalizedDate(FormatStyle.MEDIUM).withLocale(l);
String output = zdt.format(f);
你可以去其他的方向爲好,parsing輸入字符串獲得一個約會。
LocalDate ld = LocalDate.parse(input , f) ;
如果用戶輸入錯誤或意外發生,則拋出異常陷阱。
try{
LocalDate ld = LocalDate.parse(input , f) ;
myPrepStmt.setObject(… , ld) ;
} catch (DateTimeParseException e) {
… // Handle the error condition of faulty/unexpected input by user.
}
關於java.time
的java.time框架是建立在Java 8和更高版本。這些類取代了日期時間類legacy,如java.util.Date
,Calendar
,& SimpleDateFormat
。
Joda-Time項目現在位於maintenance mode,建議遷移到java.time類。請參閱Oracle Tutorial。並搜索堆棧溢出了很多例子和解釋。規格是JSR 310。
從何處獲取java.time類?
的ThreeTen-Extra項目與其他類擴展java.time。這個項目是未來可能增加java.time的一個試驗場。您可以在這裏找到一些有用的類,如Interval
,YearWeek
,YearQuarter
和more。
你如何構造日期解析器? – MadProgrammer
聽起來像你可能會遇到與默認區域設置的問題。也許它使用了不同的時區或日光節約設置。 –