当前位置: 首页 > 知识库问答 >
问题:

java.util.日期不工作之间的Android和Spring启动

贺立果
2023-03-14

在我用Spring启动编写的简单Web服务中,我有像这样的简单对象:

@Entity
@Table(name = "my_amazing_object", schema="s")
public class MyAmazingObject implements Serializable {
  @Id
  @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(unique=true, nullable=false, pecision=10)
  private int id;

  @Column(name="capture_datetime")
  private Date captureDatetime;

  public void setCaptureDatetime(Date aCaptureDatetime){
    this.captureDatetime = aCaptureDatetime;
  }

  public Date getCaptureDatetime(){
    return this.captureDatetime;
  }
}

在我的Android应用程序中,我有一个非常相似的对象,但没有所有这些注释:

public class MyAmazingObject implements Serializable {
  private int id;

  private Date captureDatetime;

  public void setCaptureDatetime(Date aCaptureDatetime){
    this.captureDatetime = aCaptureDatetime;
  }

  public Date getCaptureDatetime(){
    return this.captureDatetime;
  }
}

我的问题是,当我使用2将这个对象发送到spring应用程序时,我得到了一个错误

2021-08-06 14:02:03.610  WARN 20440 --- [nio-8080-exec-1] .w.s.m.s.DefaultHandlerExceptionResolver : Failed to read HTTP message: org.springframework.http.converter.HttpMessageNotReadableException: JSON parse error: Can not deserialize value of type java.util.Date from String "Aug 6, 2021 2:02:03 PM": not a valid representation (error: Failed to parse Date value 'Aug 6, 2021 2:02:03 PM': Can not parse date "Aug 6, 2021 2:02:03 PM": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd")); nested exception is com.fasterxml.jackson.databind.exc.InvalidFormatException: Can not deserialize value of type java.util.Date from String "Aug 6, 2021 2:02:03 PM": not a valid representation (error: Failed to parse Date value 'Aug 6, 2021 2:02:03 PM': Can not parse date "Aug 6, 2021 2:02:03 PM": not compatible with any of standard forms ("yyyy-MM-dd'T'HH:mm:ss.SSSZ", "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", "yyyy-MM-dd'T'HH:mm:ss.SSS", "EEE, dd MMM yyyy HH:mm:ss zzz", "yyyy-MM-dd"))
 at [Source: java.io.PushbackInputStream@f588781; line: 2, column: 22] (through reference chain: com.example.spring.server.entities.MyAmazingObject["captureDatetime"])

我注意到的问题是,在我的Android应用程序中,当我记录我发送的对象时,我可以看到这样的日期时间:

"captureDatetime": "Fri Aug 06 14:02:03 GMT+01:00 2021"

但在spring应用程序中,我收到了类似的消息(您可以在错误消息中看到)

"captureDatetime": "Aug 6, 2021 2:02:03 PM":

我解决了android应用程序中的日期格式化问题,将其设置为类似于dd/MM/yyyy HH:MM的字符串,并将其发送到spring,在spring服务器上,我必须修改每个设置器(对于日期),如下所示:

 public void setCaptureDatetime(String aCaptureDatetime){
    this.captureDatetime = new SimpleDateFormat("dd/MM/yyyy HH:mm").parse(aCaptureDatetime);
  }

而且效果很好。但是,我知道我有一个对象,它有不止一个日期,在我看来,向每个对象添加SimpleDataFormat解决方案并不是最好的解决方案,我几乎可以肯定,必须有其他方法来做这件事。

我正在考虑从android发送日期,并在spring服务器上保持相同的方式,而不将其解析为正确的格式。

我试图使用JsonFormats(模式="dd/MM/yyyyyHH: mm")但是没有帮助。

有什么解决办法吗?


共有2个答案

邢运良
2023-03-14

你可以为服务器使用LocalDateTime甚至OffsetDateTime,并在android应用程序中使用@JsonFormat进行日期设置。只要两端都使用ISO 8601即可。如图所示:https://stackoverflow.com/a/36253614/3841161

我不确定JsonFormat是否也适用于java。时间类,但我知道有一个依赖项可以简单地添加到项目中,为这些类启用序列化程序。你可能只需要Android应用端的注释,或者两边都需要不同的格式描述符。

高德水
2023-03-14

不要使用java。util。日期。它已经过时了,而且矛盾的是,它没有基本的日期UTIL(时区、日历、格式…)。

我建议您使用java。时间即时java。时间改为LocalDate

 类似资料:
  • 问题内容: 如何计算SQL Server中两个日期之间的工作日数? 星期一至星期五,它必须是T-SQL。 问题答案: 对于周一至周五的工作日,您可以使用单个SELECT进行操作,如下所示: 如果要包括假期,则必须进行一些调整…

  • 我只是想知道Joda的LocalDate类和java.util的Date类有什么不同。另外,使用其中一个比使用另一个有什么好处吗?

  • 问题内容: 我想计算两个给定日期之间的工作日数。例如,如果我要计算2013年1月10日至2013年1月15日之间的工作日,则结果必须为3个工作日(我没有考虑该间隔中的最后一天,因此我减去了周六和周日)。我有以下适用于大多数情况的代码,除了我的示例中的代码。 我该怎么做?我需要整天检查一下吗?还是有一个简单的方法来做到这一点。 问题答案: 请,请使用日历表。SQL Server对国定假日,公司活动,

  • 问题内容: 从上面的代码中,我能够找到两个日期之间员工的总工作日。 但现在我想要其他列名称的总工作日。我想计算两个日期之间的总工作日。 我怎样才能做到这一点? 问题答案: 如果您只想排除周末,则可以通过添加以下条件来简单地使用条件计数排除周末: 因此,您的查询变为: 但是, 我真的建议向您的数据库添加日历表。它使一切变得如此简单,您的查询将变为: 这样,您可以定义公共假期,周末等。它比任何其他解决

  • 问题内容: 因此,对于一个开始日期和结束日期,我想确定在这两个日期之间发生的一周中的特定天数。 那么多少个星期一,星期二等 我知道我可以在“开始日期”和“结束日期”之间循环并每天检查一次,但是可能相差很多天。我更喜欢不需要循环的东西。有任何想法吗?(必须在SQL Server2005+中受支持) 问题答案: 鉴于我 认为 您正在尝试获得的结果,应该这样做:

  • 问题内容: Excel具有NETWORKDAYS()函数,该函数可查找两个日期之间的工作日数。 有人对MySQL有类似功能吗?由于假期增加了复杂性,因此该解决方案不必处理假期。 问题答案: 这个表达- 计算开始日期@S和结束日期@E之间的工作日数。 假设结束日期(@E)不早于开始日期(@S)。与DATEDIFF兼容,因为相同的开始日期和结束日期为零个工作日。忽略假期。 数字字符串的结构如下。创建一