Java字符串到日期的轉換

用Java將「 2010年1月2日」格式的String轉換爲Date的最佳方法是什麼? html

最終,我想將月份,日期和年份分解爲整數,以即可以使用 java

Date date = new Date();
date.setMonth()..
date.setYear()..
date.setDay()..
date.setlong currentTime = date.getTime();

將日期轉換爲時間。 api


#1樓

並且,某些客戶端技術(例如GWT )不提供SimpleDateFormat。 安全

選擇Calendar.getInstance()是個好主意,您的要求是比較兩個日期。 長時間約會。 oracle


#2樓

String str_date = "11-June-07";
DateFormat formatter;
Date date;
formatter = new SimpleDateFormat("dd-MMM-yy");
date = formatter.parse(str_date);

#3樓

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
Date date;
try {
    date = dateFormat.parse("2013-12-4");
    System.out.println(date.toString()); // Wed Dec 04 00:00:00 CST 2013

    String output = dateFormat.format(date);
    System.out.println(output); // 2013-12-04
} 
catch (ParseException e) {
    e.printStackTrace();
}

這對我來講能夠。 框架


#4樓

儘管某些答案在技術上是正確的,但不建議這樣作。 ide

  • 衆所周知,java.util.Date和Calendar類很麻煩。 因爲設計和實現中的缺陷,請避免它們。 幸運的是,咱們能夠選擇其餘兩個出色的日期時間庫:
    • 喬達時代
      這個流行的開源免費庫可在多個Java版本中使用。 在StackOverflow上能夠找到其用法的許多示例。 閱讀其中一些內容將幫助您快速上手。
    • java.time。*包
      這些新的類集受到Joda-Time的啓發,並由JSR 310定義。這些類內置於Java 8中。正在進行將這些類向後移植到Java 7的項目,可是Oracle不支持向後移植。
  • 正如克里斯托弗·約翰遜(Kristopher Johnson)在對該問題的評論中正確指出的那樣,其餘答案忽略瞭如下重要問題:
    • 一天中的時間
      日期同時具備日期部分和時間部分)
    • 時區
      一天的開始取決於時區。 若是您未能指定時區,那麼將應用JVM的默認時區。 這意味着當在其餘計算機上運行或使用修改的時區設置時,代碼的行爲可能會更改。 可能不是您想要的。
    • 語言環境
      語言環境的語言指定了如何解析在解析過程當中遇到的單詞(月和日的名稱)。 ( BalusC答案正確地解決了這一問題。)此外,在生成日期時間的字符串表示形式時,語言環境會影響某些格式器的輸出。

喬達時代

有關Joda-Time的一些注意事項以下。 spa

時區

Joda-Time中DateTime對象真正知道其本身分配的時區。 這與java.util.Date類造成了對比,後者彷佛有一個時區,但沒有。 線程

請注意,在下面的示例代碼中,咱們如何將時區對象傳遞給解析字符串的格式化程序。 該時區用於將日期時間解釋爲發生在該時區中。 所以,您須要考慮並肯定該字符串輸入所表明的時區。 設計

因爲輸入字符串中沒有時間部分,所以Joda-Time會將指定時區中一天的第一時刻指定爲一天中的時間。 因爲夏令時(DST)或其餘異常,一般這表示00:00:00但並不是老是如此。 順便說一句,您能夠經過調用withTimeAtStartOfDay對任何DateTime實例執行相同的withTimeAtStartOfDay

格式化程序模式

在Joda-Time中,格式化程序模式中使用的字符與java.util.Date/Calendar中的字符類似,但並不徹底相同。 仔細閱讀文檔。

不變性

咱們一般在Joda-Time中使用不可變的類。 而不是修改現有的Date-Time對象,咱們調用的方法是基於另外一個對象建立一個新的新實例,並複製了大多數方面,除非須要進行更改。 下面的最後一行是對withZone的調用。 不變性有助於使Joda-Time很是線程安全,還可使某些工做更加清晰。

轉換次數

您將須要java.util.Date對象,以與其餘不瞭解Joda-Time對象的類/框架一塊兒使用。 幸運的是,來回移動很是容易。

從java.util.Date對象(此處稱爲date )到Joda-Time DateTime…

org.joda.time.DateTime dateTime = new DateTime( date, timeZone );

從Joda-Time轉到java.util.Date對象的另外一方向…

java.util.Date date = dateTime.toDate();

樣例代碼

String input = "January 2, 2010";

java.util.Locale locale = java.util.Locale.US;
DateTimeZone timeZone = DateTimeZone.forID( "Pacific/Honolulu" ); // Arbitrarily chosen for example.
DateTimeFormatter formatter = DateTimeFormat.forPattern( "MMMM d, yyyy" ).withZone( timeZone ).withLocale( locale );
DateTime dateTime = formatter.parseDateTime( input );

System.out.println( "dateTime: " + dateTime );
System.out.println( "dateTime in UTC/GMT: " + dateTime.withZone( DateTimeZone.UTC ) );

運行時...

dateTime: 2010-01-02T00:00:00.000-10:00
dateTime in UTC/GMT: 2010-01-02T10:00:00.000Z

#5樓

使用Java 8,咱們得到了一個新的日期/時間API( JSR 310 )。

可使用如下方式在Java 8中解析日期,而無需依賴Joda-Time

String str = "January 2nd, 2010";

// if we 2nd even we have changed in pattern also it is not working please workout with 2nd 
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMMM Q, yyyy", Locale.ENGLISH);
LocalDate date = LocalDate.parse(str, formatter);

// access date fields
int year = date.getYear(); // 2010
int day = date.getDayOfMonth(); // 2
Month month = date.getMonth(); // JANUARY
int monthAsInt = month.getValue(); // 1

LocalDate是用於表示日期(無時間)的標準Java 8類。 若是要解析包含日期和時間信息的值,則應使用LocalDateTime 。 對於具備時區的值,請使用ZonedDateTime 。 二者都提供相似於LocalDateparse()方法:

LocalDateTime dateWithTime = LocalDateTime.parse(strWithDateAndTime, dateTimeFormatter);
ZonedDateTime zoned = ZonedDateTime.parse(strWithTimeZone, zoneFormatter);

DateTimeFormatter Javadoc中的列表格式字符:

All letters 'A' to 'Z' and 'a' to 'z' are reserved as pattern letters. 
The following pattern letters are defined:

Symbol  Meaning                     Presentation      Examples
------  -------                     ------------      -------
 G       era                         text              AD; Anno Domini; A
 u       year                        year              2004; 04
 y       year-of-era                 year              2004; 04
 D       day-of-year                 number            189
 M/L     month-of-year               number/text       7; 07; Jul; July; J
 d       day-of-month                number            10

 Q/q     quarter-of-year             number/text       3; 03; Q3; 3rd quarter
 Y       week-based-year             year              1996; 96
 w       week-of-week-based-year     number            27
 W       week-of-month               number            4
 E       day-of-week                 text              Tue; Tuesday; T
 e/c     localized day-of-week       number/text       2; 02; Tue; Tuesday; T
 F       week-of-month               number            3

 a       am-pm-of-day                text              PM
 h       clock-hour-of-am-pm (1-12)  number            12
 K       hour-of-am-pm (0-11)        number            0
 k       clock-hour-of-am-pm (1-24)  number            0

 H       hour-of-day (0-23)          number            0
 m       minute-of-hour              number            30
 s       second-of-minute            number            55
 S       fraction-of-second          fraction          978
 A       milli-of-day                number            1234
 n       nano-of-second              number            987654321
 N       nano-of-day                 number            1234000000

 V       time-zone ID                zone-id           America/Los_Angeles; Z; -08:30
 z       time-zone name              zone-name         Pacific Standard Time; PST
 O       localized zone-offset       offset-O          GMT+8; GMT+08:00; UTC-08:00;
 X       zone-offset 'Z' for zero    offset-X          Z; -08; -0830; -08:30; -083015; -08:30:15;
 x       zone-offset                 offset-x          +0000; -08; -0830; -08:30; -083015; -08:30:15;
 Z       zone-offset                 offset-Z          +0000; -0800; -08:00;
相關文章
相關標籤/搜索