簡體   English   中英

將ISO 8601日期轉換為標准字符串格式

[英]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-03 parse()獲取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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM