热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决前端存入时间和从数据库读取时间不一致

这个问题根本上是前端时区和数据库时区不一致导致的,最简单的方式就是把db的链接手动设置时区,这样的话就可以解决时区问题,但是这样还有一个问题.如果用户不在你的时区登录你的系统的话,

这个问题根本上是前端时区和数据库时区不一致导致的,最简单的方式就是把db的链接手动设置时区,这样的话就可以解决时区问题,但是这样还有一个问题.如果用户不在你的时区登录你的系统的话,这样的解决方式就失效了,接下来我就会给出一个完美的答案,因为公司的db链接规定的是新加坡,而我在中国,测试必出现问题,所以想到了下面的解决方案.



Front-End

首先是前端的处理,我是用的是angular,使用的是TypeScript

private convert(holiday: Holiday): Holiday {holiday.fromDate = new Date(holiday.fromDate.getTime() + Math.abs(new Date().getTimezoneOffset()) * 60 * 1000);holiday.toDate = new Date(holiday.toDate.getTime() + Math.abs(new Date().getTimezoneOffset()) * 60 * 1000);const copy: Holiday = Object.assign({}, holiday);return copy;}

这段代码是重要的转换代码,因为从前端取到的时间都是带有时区的,这时候我们手动把这个带有时区的时间转换成UTC,也就是国际标准时间,从而消除了时区的影响,这时候只需要在call back-end api 的时候call一下这个方法

create(holiday: Holiday): Observable<Holiday> {const copy &#61; this.convert(holiday);return this.http.post(this.holidayAdminUrl, copy).pipe(map((res: any) &#61;> {const jsonResponse &#61; res.body;this.convertItemFromServer(jsonResponse);return jsonResponse;}));}

就可以了.


Back-End

其实后端的code都差不多,但是有一个问题必须要注意,使用的时间类型必须是包含时分秒的,不能是例如LocalDate这种类型,因为这种只包含日月年,这样就会导致我们前端对时区的处理完全失效了.我个人使用的是Timestamp,做逻辑处理的时候再转成Calendar来处理.


Enhance

使用 ZonedDateTime, 可以看我另外一篇blog.

前端传过来之后用 ZonedDateTime转成UTC进行存储.


Enhance2

或者后端使用Instant作为字段类型,前端传入用toJSON(),这样就不会有时区问题了

&#64;Column(name &#61; "start_dt")private Instant startDt;&#64;Column(name &#61; "end_dt")private Instant endDt;

protected convertDateFromClient(record: IRecord): IRecord {const copy: IRecord &#61; Object.assign({}, record, {startDt: record.startDt && record.startDt.isValid() ? record.startDt.toJSON() : undefined,endDt: record.endDt && record.endDt.isValid() ? record.endDt.toJSON() : undefined,});return copy;}

前端接收的时候用moment把Date String 转换成moment就可以了.

//"moment": "2.27.0",import * as moment from &#39;moment&#39;;query(req?: any): Observable<EntityArrayResponseType> {const options &#61; createRequestOption(req);return this.http.get<IRecord[]>(this.resourceUrl, { params: options, observe: &#39;response&#39; }).pipe(map((res: EntityArrayResponseType) &#61;> this.convertDateArrayFromServer(res)));}protected convertDateArrayFromServer(res: EntityArrayResponseType): EntityArrayResponseType {if (res.body) {res.body.forEach((record: IRecord) &#61;> {record.startDt &#61; record.startDt ? moment(record.startDt) : undefined;record.endDt &#61; record.endDt ? moment(record.endDt) : undefined;});}return res;}

推荐阅读
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • SpringDataJPA是SpringBoot体系中约定优于配置的最佳实现,大大简化了项目中数据库的操作。从本课开始将会从JPA的由来开始讲解,什么是JPA、SpringBoot ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • Netty框架中运用Protobuf实现高效通信协议
    在Netty框架中,通过引入Protobuf来实现高效的通信协议。为了使用Protobuf,需要先准备好环境,包括下载并安装Protobuf的代码生成器`protoc`以及相应的源码包。具体资源可从官方下载页面获取,确保版本兼容性以充分发挥其性能优势。此外,配置好开发环境后,可以通过定义`.proto`文件来自动生成Java类,从而简化数据序列化和反序列化的操作,提高通信效率。 ... [详细]
  • 利用树莓派畅享落网电台音乐体验
    最近重新拾起了闲置已久的树莓派,这台小巧的开发板已经沉寂了半年多。上个月闲暇时间较多,我决定将其重新启用。恰逢落网电台进行了改版,回忆起之前在树莓派论坛上看到有人用它来播放豆瓣音乐,便萌生了同样的想法。通过一番调试,终于实现了在树莓派上流畅播放落网电台音乐的功能,带来了全新的音乐享受体验。 ... [详细]
  • Java 8 引入了 Stream API,这一新特性极大地增强了集合数据的处理能力。通过 Stream API,开发者可以更加高效、简洁地进行集合数据的遍历、过滤和转换操作。本文将详细解析 Stream API 的核心概念和常见用法,帮助读者更好地理解和应用这一强大的工具。 ... [详细]
  • 本文将详细介绍如何在SSM框架中无缝集成ShardingSphere 4.10,以实现高效的数据分片和读写分离。通过实例演示和代码解析,帮助开发者快速掌握这一复杂但实用的技术。文章从基础概念入手,逐步深入到具体配置和应用实践,旨在为读者提供一个全面、易懂的整合指南。 ... [详细]
  • 本文深入解析了通过JDBC实现ActiveMQ消息持久化的机制。JDBC能够将消息可靠地存储在多种关系型数据库中,如MySQL、SQL Server、Oracle和DB2等。采用JDBC持久化方式时,数据库会自动生成三个关键表:`activemq_msgs`、`activemq_lock`和`activemq_ACKS`,分别用于存储消息数据、锁定信息和确认状态。这种机制不仅提高了消息的可靠性,还增强了系统的可扩展性和容错能力。 ... [详细]
  • 在对WordPress Duplicator插件0.4.4版本的安全评估中,发现其存在跨站脚本(XSS)攻击漏洞。此漏洞可能被利用进行恶意操作,建议用户及时更新至最新版本以确保系统安全。测试方法仅限于安全研究和教学目的,使用时需自行承担风险。漏洞编号:HTB23162。 ... [详细]
  • 在PHP中实现腾讯云接口签名,以完成人脸核身功能的对接与签名配置时,需要注意将文档中的POST请求改为GET请求。具体步骤包括:使用你的`secretKey`生成签名字符串`$srcStr`,格式为`GET faceid.tencentcloudapi.com?`,确保参数正确拼接,避免因请求方法错误导致的签名问题。此外,还需关注API的其他参数要求,确保请求的完整性和安全性。 ... [详细]
  • 在当前的软件开发领域,Lua 作为一种轻量级脚本语言,在 .NET 生态系统中的应用逐渐受到关注。本文探讨了 Lua 在 .NET 环境下的集成方法及其面临的挑战,包括性能优化、互操作性和生态支持等方面。尽管存在一定的技术障碍,但通过不断的学习和实践,开发者能够克服这些困难,拓展 Lua 在 .NET 中的应用场景。 ... [详细]
  • 本文详细介绍了使用 Python 进行 MySQL 和 Redis 数据库操作的实战技巧。首先,针对 MySQL 数据库,通过 `pymysql` 模块展示了如何连接和操作数据库,包括建立连接、执行查询和更新等常见操作。接着,文章深入探讨了 Redis 的基本命令和高级功能,如键值存储、列表操作和事务处理。此外,还提供了多个实际案例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 在使用 SQL Server 时,连接故障是用户最常见的问题之一。通常,连接 SQL Server 的方法有两种:一种是通过 SQL Server 自带的客户端工具,例如 SQL Server Management Studio;另一种是通过第三方应用程序或开发工具进行连接。本文将详细分析导致连接故障的常见原因,并提供相应的解决策略,帮助用户有效排除连接问题。 ... [详细]
  • 在 Ubuntu 系统中安装 Python pip 时遇到错误的解决方案 ... [详细]
  • 开发笔记:Webpack5 搭建 Vue3 + TS 项目
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了Webpack5搭建Vue3+TS项目相关的知识,希望对你有一定的参考价值。 ... [详细]
author-avatar
LIN-少爷
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有