[英]Convert ISO 8601 Date to a Standard String Format
我正在嘗試將有效的ISO 8601字符串轉換為一致的格式,以便可以使用簡單的字典順序進行排序和搜索。
我的應用程序可以使用以下任何格式接收日期/時間,例如:
2015-02-05T02:05:17.000+00:00
2015-02-05T02:05:17+00:00
2015-02-05T02:05:17Z
這些都代表相同的日期/時間,我想將它們全部轉換為規范的存儲形式,例如:
2015-02-05T02:05:17.000Z
我的第一個想法是使用從將ISO 8601兼容的String轉換為java.util.Date的技術解析它們,然后轉換回所需的字符串,但在處理不太精確的日期/時間時會出現故障,例如:
2015-02-05T02:05:17Z
2015-02-05T02:05Z
2015-02-05Z
2015-02Z
2015Z
應該保留這些時代的不精確性。 它們不應轉換為:
2015-02-05T00:00:00.000Z
我看過Java 8和Joda-Time,但他們似乎想把所有內容都視為特定的時間點,並且不能模擬不精確的性質或部分日期/時間。
更新:
使用Java 8,我可以這樣做:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
System.out.println(dateTime.toString());
這給了我:
2015-02-05T02:05:17Z
這是我想要的,但是:
OffsetDateTime dateTime = OffsetDateTime.parse("2015-02-05T02:05:17.000+00:00");
System.out.println(dateTime.toString());
也給了我:
2015-02-05T02:05:17Z
請注意,java已經拋棄了毫秒精度。 指定000與未指定任何內容相同,這似乎不太正確。
在Java 8中,您可以使用LocalDate.parse()或LocalDateTime.parse()在String
沒有為它提供一個模式,如果String為ISO 8601格式。
parse()
,從文本字符串(如2007-12-03parse()
獲取LocalDate的實例。 該字符串必須表示有效日期,並使用DateTimeFormatter.ISO_LOCAL_DATE進行解析。
和,
DateTimeFormatter.ISO_LOCAL_DATE
,這將返回一個能夠格式化和解析ISO 8601的不可變格式化程序
例如,
String strDate = "2015-08-04";
LocalDate aLD = LocalDate.parse(strDate);
System.out.println("Date: " + aLD);
String strDatewithTime = "2015-08-04T10:11:30";
LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime);
System.out.println("Date with Time: " + aLDT);
給,
Date: 2015-08-04
Date with Time: 2015-08-04T10:11:30
更新:
你的日期,即"2015-02-05T02:05:17.000+00:00"
只會在它們全為零時拋出零,如果納秒的值不是零,那么它將顯示正常,但是,如果要顯示過零,那么你可以簡單地添加if/else
塊和追加零到你的約會if
您納米的秒是零( yourdate.getNano()==0
), else
打印出來,因為它是,
String dateTimestr = "2015-02-05T02:05:17.000+00:00";
OffsetDateTime dateTime = OffsetDateTime.parse(dateTimestr);
if ((dateTime.getNano() == 0) && (dateTimestr.length() > 25 ))
System.out.println(dateTime.toLocalDateTime() + ".000Z");
else
System.out.println(dateTime.toString());
會給,
2015-02-05T02:05:17.000Z
把你的約會時間改為,
String dateTimestr = "2015-02-05T02:05:17+00:00";
給,
2015-02-05T02:05:17Z
將日期改為
String dateTimestr = "2015-02-05T02:05:17.100+00:00";
給,
2015-02-05T02:05:17.100Z
改變它,
String dateTimestr = "2015-02-05T02:05:17Z";
給,
2015-02-05T02:05:17Z
您必須明白, 精度的保留只能發生在文本空間中,而不能發生在價值空間中 。 因此,可以以文本方式表示不同的精度(請參閱輸入),但不能在值對象(此處為OffsetDateTime
類型)中表示。 Latter僅存儲日期時間值,但不存儲任何額外的精度信息。 如果你真的想要實現這個目標,那么你別無選擇,只能將自己的類編寫為OffsetDateTime
和精度(表示為ChronoUnit
-enum)的包裝器。
否則,如果您始終希望保留輸出的精度(以毫秒為單位),則不應使用toString()
- 方法,而應使用專用格式化程序。 在Java-8中,這將是:
OffsetDateTime odt = OffsetDateTime.parse("2015-02-05T02:05:17+00:00");
String dateTimeWithMilliSecondPrecision =
odt.format(DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSxxx"));
System.out.println(dateTimeWithMilliSecondPrecision);
// output: 2015-02-05T02:05:17.000+00:00
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.