SpringMvc 时间非国内系统部署大坑相差 8 小时

最近发现一个奇怪的现象,在国外 Linux 服务器上部署 Java 项目时间与国内 /Windows 上部署时间不一致,我用的是 docker 部署,因此在 Linux 宿主机与 docker 容器中时区都做了更改,但是还是有问题,存在八小时的时差,经多次尝试可以使用以下方式解决:

SpringMvc 时间非国内系统部署大坑相差 8 小时

@ResponseBody 注解默认使用 jackson 解析,因此我们可以配置其参数。

对于 SpringBoot,在 spring 下面配置 jackson 相关属性统一处理。

spring:
#     设置 jackson 时区  +8  一般系统时间是正确就不需要 (json 时间)
  jackson:
    time-zone: GMT+8
#     给返回时间格式化
    date-format: yyyy-MM-dd HH:mm:ss

SpringMVC 同理

 <mvc:annotation-driven>
        <!--  处理请求时返回 json 字符串的中文乱码问题  -->
        <mvc:message-converters register-defaults="true">
            <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                <constructor-arg value="UTF-8" />
            </bean>
            <!-- 处理时区问题 -->
            <bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                <property name="objectMapper">
                    <bean class="com.fasterxml.jackson.databind.ObjectMapper">
                        <!--  处理 responseBody  里面日期类型  -->
                        <property name="dateFormat">
                            <bean class="java.text.SimpleDateFormat">
                                <constructor-arg type="java.lang.String" value="yyyy-MM-dd HH:mm:ss" />
                            </bean>
                        </property>
                        <!--  时区指定  -->
                        <property name="timeZone" value="GMT+8" />
                        <!--  为 null 字段时不显示  -->
                        <property name="serializationInclusion">
                            <value type="com.fasterxml.jackson.annotation.JsonInclude.Include">NON_NULL</value>
                        </property>
                    </bean>
                </property>
           </bean>
        </mvc:message-converters>
    </mvc:annotation-driven>

当然也可对实体类中单独时间属性进行格式化,例如:

@JsonFormat(pattern="yyyy-MM-dd HH:mm:ss")
private Date creatTime;

以上是对返回的 json 进行时区设置,接下来对代码中现在时间操作进行时区获取,最简单的方法:

//     注意大写 HH 是 24 小时制   小写为 12 小时制
    static final String TIME_PATTERN = "yyyy-MM-dd HH:mm:ss";
    static final String DATE_PATTERN = "yyyy-MM-dd";
    /**
     *  获取东 8 区当前时间
     * @return
     */
    public static Date getDate() {        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("+08:00"));
        String formatNow = now.format(DateTimeFormatter.ofPattern(TIME_PATTERN));
        Date parse = null;
        try {            parse = new SimpleDateFormat(TIME_PATTERN).parse(formatNow);
        } catch (ParseException e) {            e.printStackTrace();
        }
        return parse;
    }

    public static String getDateStr(){        ZonedDateTime now = ZonedDateTime.now(ZoneId.of("+08:00"));
        return now.format(DateTimeFormatter.ofPattern(DATE_PATTERN));
    }

但是最后发现前端居然还是差 8 小时,但查看 post 请求接收的数据是正确的!但是前端框架我也用了 js 格式化日期方法对时间进行格式化!解决这个问题最简单方法使用上述的后端进行格式化时间返回给前端即可,前端不必再进行时间格式化操作。

其实也可以这样

@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")

需要引入依赖

<dependency>
   <groupId>com.fasterxml.jackson.core</groupId>
   <artifactId>jackson-databind</artifactId>
   <version>2.11.2</version>
</dependency>


手机扫描二维码访问

本文标题:《SpringMvc 时间非国内系统部署大坑相差 8 小时》作者:极四维博客
原文链接:https://cway.top/post/560.html
特别注明外均为原创,转载请注明。

分享到微信

扫描二维码

可在微信查看或分享至朋友圈。

相关文章

chw chw 发布于 2019-09-27 16:53:11  
#cmt25
电商专用快递网站,空包网,单号网www.danhw.com 回复
发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2024年10月    »
123456
78910111213
14151617181920
21222324252627
28293031

搜索

控制面板

您好,欢迎到访网站!
  查看权限

最新留言

文章归档

  • 订阅本站的 RSS 2.0 新闻聚合