【问题标题】:How to validate that time format in Java is as expected如何验证 Java 中的时间格式是否符合预期
【发布时间】:2016-12-12 08:57:02
【问题描述】:

在我的带有 @PathVariable("timestamp) 的 REST API 控制器中,我必须验证时间戳格式是否符合 ISO 8601 标准:例如 2016-12-02T18:25:43.511Z。

@RequestMapping("/v3/testMe/{timestamp}")
public class TestController {

    private static final String HARDCODED_TEST_VALUE = "{\n\t\"X\": \"01\",\n\t\"Y\": \"0.2\"\n}";

    @ApiOperation(nickname = "getTestMe", value = "Return TestMe value", httpMethod = "GET",
            authorizations = {@Authorization(value = OAUTH2,
                    scopes = {@AuthorizationScope(scope = DEFAULT_SCOPE, description = SCOPE_DESCRIPTION)})})
    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public String getTestMe(@PathVariable("timestamp") String timestamp) {

        if (timestamp != null)        {
            return HARDCODED_TEST_VALUE;
        }

        throw new ResourceNotFoundException("wrong timestamp format");
    }
}

我想要实现它的方式类似于上面检查时间戳是否为空的 if-else 语句 - 所以类似地,我想添加类似的 if-else 来验证时间戳的格式并返回正文 if so 或 404 错误代码,如果不是。

知道我可以用什么来做到这一点,请给我准备好的例子吗?我尝试过使用正则表达式进行简单验证,但不方便,不幸的是无论如何都没有用......

【问题讨论】:

  • " 404 错误代码,如果不是" - 这不是该错误的正确代码。在这里得到 404,我作为客户端会检查(当然没有结果)服务器是否可用以及我是否使用了正确的 URI ......只是说。

标签: java rest api validation timestamp


【解决方案1】:

您可以使用 Java 8 的 DateTimeFormatter 并确保它解析字符串而不抛出异常。如果输入字符串是有效的 ISO 日期,以下方法会返回 true

boolean isValidIsoDateTime(String date) {
        try {
            DateTimeFormatter.ISO_DATE_TIME.parse(date);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

要在响应正文中返回硬编码的测试值,您应该使用如下方法:

    public String getTestMe(@PathVariable("timestamp") String timestamp) {

            if (timestamp != null && isValidIsoDateTime(timestamp))        {
               return HARDCODED_TEST_VALUE;       
            }
            throw new ResourceNotFoundException("wrong timestamp format");


        }

【讨论】:

  • 如果时区必须是Z,请改用ISO_INSTANT。如果您还需要使用该值,而不仅仅是验证它,请改用ZonedDateTime.parse(timestamp)Instant.parse(timestamp)
  • 能否请您详细说明如何在我的实际代码中实现它?
  • 如果你想返回解析的日期,你应该遵循@Andreas的建议并使用ZonedDateTime,所以getTestMe方法看起来就像我编辑的答案的一个ID
  • 如果日期格式正确,我想返回 HARDCODED_TEST_VALUE,如果不是,我想返回 404 Bad Request。
  • 这行得通,但必须使用正则表达式为 RequestMapping 添加值,因为 rest 将点视为文件扩展名。 @RequestMapping(value="/v3/vatRates/{timestamp:.+}" ,method = RequestMethod.GET,produce = MediaType.APPLICATION_JSON_VALUE)
【解决方案2】:
public class MyClass {
    public static void main(String args[]) {
        System.out.println("-------------OK--------------");
        String inputTimeString = "makara_kann";
        if (!inputTimeString.matches("^([0-9]|0[0-9]|1[0-9]|2[0-3]):[0-5][0-9]$")){
             System.out.println("Invalid time string: " + inputTimeString);
        } else {
            System.out.println("valid time string: " + inputTimeString);
        }
    }
}

-------------OK-------------- 无效的时间字符串:makara_kann

【讨论】:

    猜你喜欢
    • 2019-03-16
    • 1970-01-01
    • 1970-01-01
    • 2020-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-16
    相关资源
    最近更新 更多