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

spring boot data rest中的日期问题

池砚文
2023-03-14

在SO(ex1、ex2、ex3)中有一些相关的帖子,但都没有解决这个问题。

我有一个具有以下localdate的实体:

@Column(nullable=true)
private LocalDate birthDate;

我也有这个存储库:

@RepositoryRestResource(collectionResourceRel = "person", path = "person")
public interface PersonRepository extends PagingAndSortingRepository<Person, Long>{

}

当我在数据库中保存birthdate时(我使用的是MySQL),它会正确保存。然而,当我进行这个查询时,例如:

Person p = personRepo.findById(1L).get();

日期的提取延迟了一天(就像上面的例子一样)。我试图实现这个建议,即将LocalDate更改为Date,并包含Jackson注释,但这并不奏效。我还尝试包含jackson-modules-java8,但问题仍然存在。

+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@session.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | -02                |
+--------------------+---------------------+--------------------+
1 row in set (0,00 sec)

共有1个答案

卫琛
2023-03-14

终于,我找到了解决办法。在@Ilyacyclone和@Olev.v之后。注释,我开始搜索时区、spring boot和localdate。确实,localdate并不携带UTC信息。但是,当我从数据库中提取这些数据时,JVM需要进行转换,使SQLdate变成localdate

因此,我做的第一件事就是检查数据库时区:

SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP) as GMT_TIME_DIFF;

它返回:

+--------------------+---------------------+--------------------+
| @@GLOBAL.time_zone | @@session.time_zone | @@system_time_zone |
+--------------------+---------------------+--------------------+
| SYSTEM             | SYSTEM              | -02                |
+--------------------+---------------------+--------------------+
SELECT TIMEDIFF(NOW(), UTC_TIMESTAMP)

返回:

+--------------------------------+
| TIMEDIFF(NOW(), UTC_TIMESTAMP) |
+--------------------------------+
| -02:00:00                      |
+--------------------------------+

所有这些SQL答案都是OK的。问题出在弹簧靴上。解决问题的方法是在代码中设置UTC。我在这里找到了这个提示。

@PostConstruct
void started() {
    TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
}

之后,所有的日期开始正常工作。

 类似资料:
  • 问题内容: 我试图列出使用SQL Server在表中注册的日期,但是我的问题是我提取的所有日期与表中的日期相差2天。 例如,我在数据库中得到了2012-12-25,当我检索它并将其转换为Java.util.Date时,它变成了2012-12-23 … 我在另一个表中的日期上有工作正常的进程。 我正在使用SQL Server 2008,Hibernate 3和Spring 3。 编辑: 该表的列数据

  • 我有日期输入为“20170101”(YYYYMMDD),我只需编写freemarker模板将上述日期转换或格式化为“2017-01-01 00:00:00”(YYYY-MM-DD HH:MM:SS)作为日期-时间以上格式。 但它返回错误为“字符串与预期的日期/时间/日期-时间格式不匹配。要分析的字符串是:”20170101“。预期的格式是:”MMM dd yyyy HH:MM:SS“。给出的嵌套原

  • 我正在构建一个react应用程序,使用MongoDb和express后端作为数据库。我的一个模型具有属性日期,类型为date。 然后,在我的反应应用程序上,我有一个表单,我在其中输入所有这些信息。但是如果我把一个日期,比如01/11/2017,保存的日期是31/10/2017。据我所知,这是因为MongoDd以UTC格式存储日期。有没有办法改变这种行为?因为同样,当我尝试按日期搜索时,这个问题也给

  • 例如:字符串日期:Wed Jan 15 14:29:00 2020,DB:2020-01-16 05:50:40.000000+0000 有时,我还会遇到这样的错误:DateOverflowWarning:有些时间戳比Python datetime所能表示的要大。时间戳从纪元开始以毫秒为单位显示。

  • 我无法确定日期。据我所见,它只设定了正确的日期,而不是月份和年份。我不明白我做错了什么。 这是我的密码: 格式化ate.js 和组件: 我使用的npm反应下拉日期,并遵循从他们的留档的例子。也许我用错了useState或Use效应钩子?也许有人与React和日期的经验可以帮助我解决这个问题。

  • 问题内容: 在我的应用程序中,我通过使用SharedPreferences将其作为长字符串写出到文件中来保留CookieStore。重新读回此String时,我使用regexps从String解析每个cookie及其属性(名称,值,域,路径,版本,到期日期)。解析这些属性时,我通过为每个解析的cookie创建一个新的BasicClientCookie对象来重建一个CookieStore,然后将每个