`

Spring项目前端显示的时间差8小时分析

阅读更多

  在开发中,有时听到其它项目的同事说前端展示的时间差了8小时,是由于时区的问题,因为中国恰好是GMT+8,比格林尼治时间早了8小时。但奇怪的是,为什么我们项目就没有碰到过呢?于是,特别写了一个简单的例子,确认了一下我们的确实没有问题,并咨询了其它项目组同事是怎么出现的,特在此记录一下。

一.写一个简单的demo,还原各种场景

        定义Controller

@RequestMapping("/list")
public String showAll(ModelMap modelMap) {

	List<Article> articles = mapper.getArticlesByUserId(1);
	modelMap.addAttribute("articles", articles);
	return "main.ftl";
}

@RequestMapping("/list2")
public ModelAndView listall(HttpServletRequest request, HttpServletResponse response) {

	List<Article> articles = mapper.getArticlesByUserId(1);
	ModelAndView mav = new ModelAndView("list");
	mav.addObject("articles", articles);
	return mav;
}

@ResponseBody
@RequestMapping("/list3")
public Map<String, Object> listall3(HttpServletRequest request, HttpServletResponse response) {

	List<Article> articles = mapper.getArticlesByUserId(1);
	Map<String, Object> map = new HashMap<String, Object>();
	map.put("articles", articles);
	return map;
}

1./list通过freemark模板展示,时间显示OK

<#list articles as article>
	<div>${article.id}. ${article.title}: ${article.content}: ${(article.updateTime)?string("yyyy-MM-dd HH:mm:ss")}</div>
</#list>

        访问请求,没有时间问题,如下所示:



2./list2通过jsp显示,时间也OK

list.jsp

 

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>article list</title>
</head>
<body>
	<c:forEach items="${articles}" var="item">  
        ${item.id }--${item.title }--${item.content}--${item.updateTime}<br />
	</c:forEach>
</body>
</html>

        访问请求,没有时间问题,如下所示:


 

3./list3直接返回map,json串展示


        时间字段变成了长整型显示,但时间还是对的,在我们项目实际应用中,前端JS转换成字符串展示出来。

        原来其它出问题的项目,他们是在后台的时间字段上通过@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")方式转换成字符串,然后直接在前端展示的。

        于是,我把Article.java的updateTime字段上加上@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")注解,再次请求页面显示如下,updateTime比数据库中的真正时间晚了8小时:


        在《SpringMVC中使用@RequestBody,@ResponseBody注解实现Java对象和XML/JSON数据自动转换(下)》一文中,我们知道,转换为JSON格式的对象提供前端显示,这个过程被Spring MVC的@RestController 注解识别并使用MappingJackson2HttpMessageConverter 进行消息转换,而我们的工程中都有jackson,且Jackson在对时间类型字段序列化(java.util.Date类型format为字符串)时是以GMT+0进行的,而不是"本地化"的时区设置。Jackson FAQ: Date Handling:All time objects that have associated TimeZone (java.util.Calendar etc) that Jackson constructs use the standard timezone (GMT), not the local time zone (whatever that might be). That is: Jackson defaults to using GMT for all processing unless specifically told otherwise.

        查资料发现,这个问题可以通过设置主机默认时区来解决,如下所示:


        但,通过查看源码,publicvoidconfigure(ObjectMapper objectMapper)方法里面设置的timezone恰好是没有赋值的。

 

二.解决办法

1.直接返回Date类型,让前端js或jsp来处理

2.Spring MVC的配置文件中的标签<mvc:annotation-driven>会默认实例化各种消息转换对象实例,解决上述问题的关键就是用自定的带时区的JSON消息转换器替换默认的。

 

<mvc:annotation-driven></mvc:annotation-driven>

修改为:

<mvc:annotation-driven>
	<mvc:message-converters>
	<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
		<property name="objectMapper">
				<bean class="com.fasterxml.jackson.databind.ObjectMapper">
					<property name="timeZone">
					<bean class="java.util.TimeZone" factory-method="getDefault" />
					</property>
				</bean>
		</property>
	</bean>
	</mvc:message-converters>
</mvc:annotation-driven>

        实例代码见附件。 

 

参考文章:https://blog.csdn.net/oShuSheng1/article/details/49614867

https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc#mvc-config-message-converters

  • 大小: 9.4 KB
  • 大小: 10.5 KB
  • 大小: 17.3 KB
  • 大小: 16.7 KB
  • 大小: 23.8 KB
分享到:
评论

相关推荐

    springboot+vue基于Spring Boot智能无人仓库管理java毕业论文.doc

    后端使用Spring Boot和Spring Data JPA与数据库交互,前端采用Vue.js和Element UI组件库构建用户界面。 2.2 数据库设计 数据库设计主要包括仓库信息表、物资信息表、出入库记录表等,通过ER图来规划各个实体之间的...

    JAVAWEB基于BS的销售数据的决策支持项目源码+毕业设计.rar

    9. **数据分析**:项目可能包含了对销售数据的统计分析,如平均值、中位数、标准差等,以及预测模型,如线性回归、时间序列分析等,以支持决策制定。 10. **权限控制**:为了保护数据安全,系统通常会实现角色权限...

    SpringBoot2.2.1整合项目.zip

    时间操作在开发中不可或缺,Java8引入的LocalDateTime和TemporalAdjusters等类提供了丰富的日期时间处理功能。在项目中,我们可以使用这些API进行日期格式化、计算日期差等操作。 HTTP通信则常常涉及到与外部服务的...

    教学评价及分析系统的设计与实现

    2. 数据处理与分析:系统需能对收集到的数据进行清洗、整合,通过统计分析方法(如平均分、标准差、频次分布等)揭示教学效果。 3. 反馈报告生成:系统应自动生成评价报告,包括教师个人报告、班级报告、课程报告等...

    SpringCloud经典面试题汇总(精华版).pdf

    ### SpringCloud经典面试题知识点详解 #### 一、Spring Cloud 的定义及特点 **知识点1:Spring Cloud 的概念** - **定义**:Spring Cloud 是一套完整的微服务解决方案,基于Spring Boot,提供了各种微服务开发所需...

    java ajax上传文件并显示进度条

    为了显示上传速度,我们需要记录每次进度更新的时间差,然后用已上传的数据量除以时间差,得到平均上传速率。这通常涉及到一些时间戳和速度计算的逻辑,可以使用JavaScript的`Date.now()`来获取当前时间。 在测试...

    t淘淘商城项目 商城项目 视频和源码教程 详细

    除了项目构建,Maven最核心的功能是软件包的依赖管理,能够自动分析项目所需要的依赖软件包,并到Maven中心仓库去下载。 A)管理依赖的jar包 B)管理工程之间的依赖关系。 3.2. Maven本地仓库 在当前系统用户的...

    keep面经,动手能力太差啊啊啊啊keep面经,动手能力太差啊啊啊啊.pdf

    2. 项目经验:面试者被要求介绍自己在bionio项目中的工作和角色,这体现了对实际项目经验的重视。 3. 内存泄漏和内存溢出:面试者需要解释内存泄漏和内存溢出的区别,并能够使用MAT(Memory Analyzer Tool)等工具...

    基于Springboot的红色革命文物征集管理系统的设计与实现论文

    针对传统信息管理模式中存在的问题,如时间消耗过多、数据准确性差、错误修正难及数据检索复杂等问题,该系统利用现代软件开发技术,特别是Spring Boot框架,来构建一个高效、精准的信息处理平台。 #### 关键词解释...

    精品源码 / 后台管理 / 企业订单 / 销售统计 / 后台管理

    【标题】"精品源码 / 后台管理 / 企业订单 / 销售统计 / 后台管理" 涵盖了多个IT领域的关键知识点,包括但不限于前端开发、后端架构、数据分析以及模板设计。这款资源是专为企业订单销售统计而设计的后台管理系统,...

    基于springboot的大学生就业需求分析系统源码数据库.doc

    - **前端技术**:采用HTML5、CSS3和JavaScript等前端技术,实现响应式设计,确保在不同设备上都能良好显示。 - **后端技术**:利用SpringBoot框架快速搭建服务端架构,结合SSM框架进行数据交互。 - **数据库设计**:...

    基于SpringBoot漫画系统论文

    - **Spring Boot**:使用Spring Initializr初始化项目,自动配置环境变量,集成Thymeleaf等模板引擎。 - **MyBatis**:作为ORM框架,简化数据库操作,实现对象关系映射。 - **MySQL**:设计数据库表结构时考虑到关联...

    基于springboot+BS的老年人体检管理系统源码数据库.doc

    **老年人体检管理系统**的开发背景主要是解决当前老年人体检信息管理存在的问题,如信息管理混乱、错误率高、信息安全性能差、劳动强度大以及耗时耗力等。随着互联网技术的发展及其在各行各业中的广泛应用,信息可以...

    基于springboot的医院资源管理系统源码数据库.doc

    由于采用了Spring Boot等现代开发框架和技术,该系统能够在较短的时间内完成数据处理和响应,大大提高了系统的运行效率。 **4.2 安全性** 通过Spring Security等技术实现了对用户身份的有效验证和权限管理,保障了...

    互联网分层架构,为啥要前后端分离

    4. **开发周期延长**:前端界面的修改通常需要后端配合调整,增加了项目的整体开发时间。 #### 二、前后端分离的提出 为了解决上述问题,前后端分离的概念应运而生。简单来说,前后端分离就是将前端界面展示和后端...

    基于SSM的简单人事管理系统+源代码+文档说明

    该项目前端采用了Bootstrap开源包进行网页前端界面的设计与美化,后端采用SSM(Spring,SpringMVC,MyBatis)框架进行业务逻辑的处理。 后端业务逻辑的实现采用了传统的MVC模式,将实现分为三部分,Mapper层(DAO层或...

    基于Springboot的在线英语阅读平台的设计与实现论文

    在该项目中,开发团队选择了Spring Boot作为主要的开发框架。Spring Boot以其简洁易用的特点著称,能够极大地减少开发过程中所需的样板代码量,使得开发者能够将更多的精力放在业务逻辑的实现上。此外,还选用了...

    基于SpringBoot在线远程考试系统源码数据库.doc

    本研究项目旨在开发一款基于Spring Boot框架的在线远程考试系统,旨在解决传统考试模式中的效率低、安全性差以及操作不便等问题。该系统主要面向教育机构、企业和个人,通过提供一个高效、安全、便捷的在线考试平台...

    SSM+bootstrap+手機考試系統

    考生在手机端进行身份验证后,可以浏览考试介绍,选择开始考试,系统根据设定的试题数量和类型展示题目,考生在限定时间内完成作答,最后提交试卷,系统即时或后台批改并显示成绩。 综上所述,"SSM+bootstrap+手機...

Global site tag (gtag.js) - Google Analytics