Android 如何使用改型将带Z和T格式的日期发送到API?
我的API有以下示例路径-Android 如何使用改型将带Z和T格式的日期发送到API?,android,rest,date,kotlin,retrofit,Android,Rest,Date,Kotlin,Retrofit,我的API有以下示例路径- base_url/path/{country}/path/path?from=2020-03-01T00:00:00Z&to=2020-03-02T00:00:00Z 因此,我需要使用Z和T格式传递2个日期对象,但我无法真正了解如何将新的Kotlin Date()对象格式化为这些Z和T格式 我当前的get方法- @GET(“path/{country}/path/path/”) suspend fun getCountryModelByDate( @路径(“国家”)国
base_url/path/{country}/path/path?from=2020-03-01T00:00:00Z&to=2020-03-02T00:00:00Z
因此,我需要使用Z和T格式传递2个日期对象,但我无法真正了解如何将新的Kotlin Date()对象格式化为这些Z和T格式
我当前的get方法-
@GET(“path/{country}/path/path/”)
suspend fun getCountryModelByDate(
@路径(“国家”)国家:字符串,
@查询(“发件人”)发件人:字符串,
@查询(“to”)到:字符串
):型号
但是当我尝试像下面这样测试我的方法时-
class RemoteDataSource(私有val api:api){
挂起getCountryModelByDate():资源{
回击{
Resource.Success(coronaVirusApi.getCovidDeathsByDeathFromCountry(“意大利”,Date().toString(),Date().toString()))
}捕获(异常:异常){
资源异常(异常)
}
}
}
这导致我出现以下404错误,请查看正在发送的URL-
Response{protocol=h2,code=404,message=,url=https://api.covid19api.com/country/italy/status/deaths/?from=Tue%20Nov%2017%2010%3A47%3A30%20GMT%2B02%3A00%202020&to=Tue%20Nov%2017%2010%3A47%3A30%20GMT%2B02%3A00%202020}
所以我的问题是-
T
和Z
格式是ISO 8601。您可能需要查阅底部的链接。现代java日期和时间API java.time的类通过其toString
方法生成ISO 8601。使用Instant
类。有关Java的简短演示:
Instant i = Instant.now();
System.out.println(i);
示例输出:
2020-11-18T09:31:33.613965Z
如果瞬间
与您的一样在UTC的午夜,则输出如下:
2020-11-18T00:00:00Z
在第一种情况下,秒上的小数对于API来说可能不是问题,因为根据ISO 8601标准,分数是可选的。如果您想摆脱它,最简单的方法是截断即时
:
Instant instantToPrint = i.truncatedTo(ChronoUnit.SECONDS);
System.out.println(instantToPrint);
2020-11-18T09:31:33Z
如何使即时对象始终返回到0:00:00Z,如图所示
我的API需要什么
编辑:假设您已经获得了UTC中所需日期的瞬间,只需将其截断为整天:
Instant instantToPrint = i.truncatedTo(ChronoUnit.DAYS);
2020-11-18T00:00:00Z
但问题是,你的约会对象来自哪里。使用java.time日历中的一天将由LocalDate
表示,因此我们需要转换
LocalDate fromDate = LocalDate.of(2020, Month.MARCH, 1);
Instant fromDateTimeUtc = fromDate.atStartOfDay(ZoneOffset.UTC).toInstant();
System.out.println(fromDateTimeUtc);
2020-03-01T00:00:00Z
https://
中的冒号)。所以它应该变成%3A
。Instant
中字符串的其余部分应清晰可读
链接
- 解释如何使用java.time
- ,其中首先描述了
java.time
- ,java.time的后端口到Java6和Java7(JSR-310为三十)
- ,Android版Three Ten Backport
- ,解释得非常透彻
Instant
,即现代java日期和时间API,您可以使用Instant.toString()
生成ISO 8601格式,这是您使用T
和Z
的格式名称。哦,天哪……我在这方面花了太多时间。非常感谢,请评论,我会批准的。