Android 如何使用改型将带Z和T格式的日期发送到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( @路径(“国家”)国

我的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(
@路径(“国家”)国家:字符串,
@查询(“发件人”)发件人:字符串,
@查询(“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}

所以我的问题是-

  • 如何设置Kotlin日期对象的格式,使其具有像API所需的Z和T格式
  • 如何将格式化的日期发送到查询中而不将其删除
  • java.time中的Instant.toString() 您的
    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

  • 如何将格式化的日期发送到查询中而不将其删除
  • 我认为URL中的冒号需要进行URL编码(除了协议后面的冒号,
    https://
    中的冒号)。所以它应该变成
    %3A
    Instant
    中字符串的其余部分应清晰可读

    链接
    • 解释如何使用java.time
    • ,其中首先描述了
      java.time
    • ,java.time的后端口到Java6和Java7(JSR-310为三十)
    • ,Android版Three Ten Backport
    • ,解释得非常透彻

    如果您可以使用java.time中的
    Instant
    ,即现代java日期和时间API,您可以使用
    Instant.toString()
    生成ISO 8601格式,这是您使用
    T
    Z
    的格式名称。哦,天哪……我在这方面花了太多时间。非常感谢,请评论,我会批准的。