如何在rest get调用中将Java日期作为path变量传递

如何在rest get调用中将Java日期作为path变量传递,java,date,http,spring-boot,get,Java,Date,Http,Spring Boot,Get,现有api的代码如下: @GetMapping(value = "/getAmount") public long getAmount(){ Date d = new Date(); long amountFetchedFromDb = callToDatabase(d); return amountFetchedFromDb; } 现在我需要更改以下功能: @GetMapping(value = "/getAmount") public long getAmount

现有api的代码如下:

@GetMapping(value = "/getAmount")
public long getAmount(){

    Date d = new Date();
    long amountFetchedFromDb = callToDatabase(d);
    return amountFetchedFromDb;
}
现在我需要更改以下功能:

@GetMapping(value = "/getAmount")
public long getAmount(){

    Date d = new Date();
    <CALL TO A NEW  REST API PASSING IT THE DATE d AND THE NEW API 
     WILL MAKE THE DB CALL AND RETURN THE AMOUNT>
    return amount;
}
@GetMapping("/getAmount/{dateTo}")
public long getAmount(@PathVariable Date dateTo){

   long amountFetchedFromDb = callToDatabase(d);
   return amountFetchedFromDb;
}
现在我需要测试我的新服务。如何在下面的请求中传递日期:

?

现有api中没有使用日期格式。它只是创建一个java日期并将查询传递给Db。没有转换。所以,我不确定它会传递给我什么。因此,我创建了一个简单的rest服务,它返回new Date()。当我运行它时,我得到了响应153013714267(今天是6月27日)。这是什么格式


我希望这不会太令人困惑。如果我的查询不清楚,请告诉我。

153013714267
是自Unix纪元以来的毫秒数

例如

$ date
Wed, Jun 27, 2018  3:28:30 PM
$ date +%s
1530138468
+%s
选项要求date命令返回自历元以来的秒数。如果将值格式化为
1530137142.067
,您可以看到它非常接近我的系统显示的值


这可能是将时间戳作为参数传输的“最佳”(最便携)方式,只要两端同意时区。
date+%s
命令返回的值以UTC为单位。为了实现最大的可移植性,您应该在任何地方使用UTC,并仅在输出时转换为本地时区。在内部,一切都应该是UTC。

有几种方法可以实现这一点

将简单的
字符串
日期作为路径变量传递。然后使用
SimpleDateFormat
字符串
解析为日期对象。请注意,通过这种方式,您将处理可能失败的转换。此外,您的客户应该知道他们将使用的日期格式。在我看来,这不是最好的方法,但确实可行

传入一个定义历元的数字,并使用它来构造日期对象。假设您对非常精细的精度(纳秒等)不感兴趣,您应该会很好

因此,在第一个选项的情况下,get请求如下所示:

someurl/getAmount/28-06-2018/

第二项:

someurl/getAmount/153013714267


我认为后者是最好的。

如果要使用PathVariable,可以使用下面的示例方法:

//You can consume the path .../getAmount/2019-04-25
@GetMapping("/getAmount/{dateTo}")
public long getAmount(@PathVariable("dateTo") @DateTimeFormat(pattern = "yyyy-MM-dd") Date dateTo) {
    long amountFetchedFromDb = callToDatabase(dateTo);
    return amountFetchedFromDb;
}

我采用了第二种方法。我收到错误:“消息”:“未能将类型“java.lang.String”的值转换为所需类型“java.util.Date”;嵌套异常为org.springframework.core.convert.ConversionFailedException:未能将类型[java.lang.String]转换为类型[@org.springframework.web.bind.annotation.PathVariable java.util.Date]对于值“153013714267”;嵌套异常为java.lang.IllegalArgumentException“,我想您是这样留下代码的:
@PathVariable Date dateTo
您需要将其更改为
@PathVariable Long dateTo
,并且使用
Date
构造函数接受长纪元。感谢您需要注意的一点是时区转换。但我认为只要您没有来自不同时区的多个客户端,您就可以了。目前,它是同一时区,但如果将来我收到来自不同时区的请求,应该采取什么方法?我建议您避免使用过时且臭名昭著的
SimpleDateFormat
类。至少作为第一选择。至少要预约一下。今天我们有了更好的课程。你为什么要使用
Date
课程?那门课早就过时了。今天我们的生活好多了。我建议您可以使用ISO8601格式来传递日期。就像2018年6月28日
LocalTime
from
java.time
通过其
toString
方法生成此格式,并将相同格式解析回
LocalDate
,而无需任何显式格式化程序。