我想寫一個DateTimeFormatter
,這將允許我採取多種不同的字符串格式,然後將字符串格式轉換爲特定類型。由於項目的範圍和已存在的代碼,我不能使用不同類型的格式化程序。DateTimeFormatter接受多個類型並轉換爲一個
例如。 我想接受MM/dd/yyyy
以及yyyy-MM-dd'T'HH:mm:ss
,但隨後轉換爲MM/dd/yyyy
。
有人可以建議如何做到這一點與org.joda.time.format
?
我還沒有找到這個在線的好/工作示例。
我想寫一個DateTimeFormatter
,這將允許我採取多種不同的字符串格式,然後將字符串格式轉換爲特定類型。由於項目的範圍和已存在的代碼,我不能使用不同類型的格式化程序。DateTimeFormatter接受多個類型並轉換爲一個
例如。 我想接受MM/dd/yyyy
以及yyyy-MM-dd'T'HH:mm:ss
,但隨後轉換爲MM/dd/yyyy
。
有人可以建議如何做到這一點與org.joda.time.format
?
我還沒有找到這個在線的好/工作示例。
我正在使用Joda-Time 2.9.7和JDK 1.7.0_79。
可以使用DateTimeFormatterBuilder.append
method:它接收打印機(與用於打印的日期/時間的圖案)和解析器與所有可能的輸入模式的數組:
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;
import org.joda.time.format.DateTimeFormatterBuilder;
import org.joda.time.format.DateTimeParser;
// MM/dd/yyyy format
DateTimeFormatter monthDayYear = DateTimeFormat.forPattern("MM/dd/yyyy");
// array of parsers, with all possible input patterns
DateTimeParser[] parsers = {
// parser for MM/dd/yyyy format
monthDayYear.getParser(),
// parser for yyyy-MM-dd'T'HH:mm:ss format
DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ss").getParser() };
DateTimeFormatter parser = new DateTimeFormatterBuilder()
// use the monthDayYear formatter for output (monthDayYear.getPrinter()) and parsers array for input (parsers)
.append(monthDayYear.getPrinter(), parsers)
// create formatter (using UTC to avoid DST problems)
.toFormatter().withZone(DateTimeZone.UTC);
// test with MM/dd/yyyy
DateTime datetime1 = parser.parseDateTime("06/14/2017");
System.out.println(parser.print(datetime1)); // 06/14/2017
// test with yyyy-MM-dd'T'HH:mm:ss
DateTime datetime2 = parser.parseDateTime("2017-06-14T10:30:40");
System.out.println(parser.print(datetime2)); // 06/14/2017
我使用DateTimeZone.UTC
以避免出現問題夏令時。
例如,在我的默認時區(America/Sao_Paulo
),去年(2016),DST在10月16日開始第:在午夜,時鐘向前移動1小時(因此,tecnically,半夜不因爲時間從23:59:59
變爲01:00:00
)。
問題是,當分析MM/dd/yyyy
格式時,沒有字段可以是小時,分鐘或秒,並且解析器將0
設置爲所有這些字段的默認值(因此小時變爲午夜)。但是,如果我嘗試解析DST開始的日期(如10/16/2016
)並且不使用上述的UTC
,則代碼將引發異常,因爲當天不存在午夜(由於DST小時偏移)。
使用UTC
可避免此錯誤,因爲DateTimeZone.UTC
沒有DST效果。有了這個,代碼獨立於系統的默認時區。
輸出是:
2017年6月14日
2017年6月14日
PS:當你只關心日期部分(日/月/年),您也可以使用org.joda.time.LocalDate
類。要使用它,只需更改代碼的最後一部分(你可以使用相同的parser
):
// test with MM/dd/yyyy
LocalDate dt1 = parser.parseLocalDate("06/14/2017");
System.out.println(parser.print(dt1)); // 06/14/2017
// test with yyyy-MM-dd'T'HH:mm:ss
LocalDate dt2 = parser.parseLocalDate("2017-06-14T10:30:40");
System.out.println(parser.print(dt2)); // 06/14/2017
輸出是一樣的:
2017年6月14日
06/14/2017
使用LocalDate
是避免夏令時問題的另一種方法(如上所述)。在這種情況下,您不需要設置UTC
,因爲LocalDate
沒有時區信息。 。
@AlexKornhauser我已經更新了答案:做了一些測試,發現DST存在一些潛在的錯誤,所以我相應地修復了代碼。 – 2017-06-14 19:42:44
我確認了這個作品。多謝你們!! ESP。 @Hugo –
我怎樣才能做到這一點與java.time庫相反,例如DateTimeFormatter.ofPattern(「MM/dd/yyyy」); + DateTimeFormatter.ofPattern(「yyyy-MM-dd'T'HH:mm:ss」); –
我不知道的區別是什麼,但我想將字符串轉換爲DateTime,即DateTimeFormatter dateTimeFormatter = DateTimeFormat.forPattern( 「MM/DD/YYYY」); –