验证ISO-8601输入字符串

时间:2017-06-12 15:21:30

标签: java datetime iso8601

我将使用String-以及:

的ISO-8601格式20170609T184237Z

什么是最好的方式

  1. 验证输入字符串
  2. 将其转换为毫秒字符串
  3. 我能想到的唯一方法是创建一个DateTime对象,然后从那里将其转换为毫秒,然后再转换为String。还有更好的方法吗?

1 个答案:

答案 0 :(得分:2)

我假设您的意思是没有 -:。不,您解析为适当的日期时间对象并转换为毫秒的方式是好的和标准的,没有什么更好的。

您打算使用Joda-Time吗?你可能想再想一想。 Joda-Time主页说

  

请注意,Joda-Time被认为是一个很大程度上“完成”的项目。   没有计划重大改进。如果使用Java SE 8,请迁移   到java.time(JSR-310)。

JSR-310也被反向移植到Java 6和7,因此我建议使用该移植优先于Joda-Time。

以下内容可能超出您的要求。我建议使用一种方法:

/**
 * 
 * @param dateTimeString String in 20170609T184237Z format
 * @return milliseconds since the epoch as String
 * @throws IllegalArgumentException if the String is not in the correct format
 */
private static String isoToEpochMillis(String dateTimeString) {
    try {
        OffsetDateTime dateTime = OffsetDateTime.parse(dateTimeString,
                DateTimeFormatter.ofPattern("uuuuMMdd'T'HHmmssX"));
        if (! dateTime.getOffset().equals(ZoneOffset.UTC)) {
            throw new IllegalArgumentException("Offset is not Z");
        }
        return String.valueOf(dateTime.toInstant().toEpochMilli());
    } catch (DateTimeException dte) {
        throw new IllegalArgumentException("String is not in format uuuuMMddTHHmmssZ",
                                           dte);
    }
}

我们这样称呼它:

    String milliseconds = isoToEpochMillis("20170609T184237Z");
    System.out.println(milliseconds);

打印

1497033757000

我不知道您想要的验证有多严格。您的示例字符串包含Z个时区;如您所见,我需要UTC时区,但也会接受20170609T184237+00。如果必须Z,我认为您需要使用dateTimeString.endsWith("Z")