2013-06-21 74 views
0

我想將YYYY-MM-DD格式的日期解析爲YYYYMMDD。如果我使用以下功能,它將返回格式爲YYYYMMDD但具有不同的DD。 i.E:2013-05-16 BECOMES 20130515日期字段的解析錯誤

道歉聽起來不識字:)我是Java新手。

任何幫助,將不勝感激。

String TestDate=yyyymmddParser.format(oLifEExtension.TestDate().getTime()); 
        sb.append(TestDate) 
+1

你如何構造日期解析器? – MadProgrammer

+0

聽起來像你可能會遇到與默認區域設置的問題。也許它使用了不同的時區或日光節約設置。 –

回答

1

A SimpleDateFormat應該能夠達到你的要求。要非常小心的格式標記,Dd意味着不同的事情

String oldDateString = "2013-05-16"; 
System.out.println(oldDateString); 
Date date = new SimpleDateFormat("yyyy-MM-dd").parse(oldDateString); 
System.out.println(date); 
String newDateString = new SimpleDateFormat("yyyyMMdd").format(date); 
System.out.println(newDateString); 

(另外,提防Yy:P)

此輸出

2013-05-16 
Thu May 16 00:00:00 EST 2013 
20130516 

對我來說...

0

不確定問題是否適用於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/MontrealAfrica/Casablanca,或Pacific/Auckland。切勿使用3-4字母縮寫,如ESTIST,因爲它們是而不是真正的時區,不是標準化的,甚至不是唯一的(!)。

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,YearQuartermore