我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java 8日期与数据库日期的映射关系是什么

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java 8日期与数据库日期的映射关系是什么

Java 8日期与数据库日期的映射关系是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

Java8中有很多新型的日期类型,比传统的日期类型好用。使用什么和数据库的日期进行映射,却是一个比较复杂的问题。

JDBC 4.2 规范

根据JDBC4.2的规范,Java日期类型和数据库日期类型关系如下:

Java 日期数据库日期
java.sql.DateDATE
java.sql.TimeTIME
java.sql.TimestampTIMESTAMP
java.util.CalendarTIMESTAMP
java.util.DateTIMESTAMP
java.time.LocalDateDATE
java.time.LocalTimeTIME
java.time.LocalDateTimeTIMESTAMP
java.time.OffsetTimeTIME_WITH_TIMEZONE
java.time.OffsetDatetimeTIMESTAMP_WITH_TIMEZONE

有两个是比较特别的。

  • TIMESTAMP_WITH_TIMEZONE:包含 Time Zone 的日期时间(DateTime),映射为OffsetDatetime。

  • TIME_WITH_TIMEZONE:包含 Time Zone 的时间(Time),映射为OffsetTime。

java8中新的日期类型代替旧日期类型

  • java.time.LocalDate代替java.sql.Date

  • java.time.LocalTime代替java.sql.Time

  • java.time.LocalDateTime代替java.sql.Timestamp

注意:JDBC4.2规范不支持Instant和ZonedOffsetDateTime

PostgreSQL JDBC 实现

Java 日期数据库日期
java.time.LocalDateDATE
java.time.LocalTimeTIME[ WITHOUT TIME ZONE ]
java.time.LocalDateTimeTIMESTAMP [ WITHOUT TIME ZONE ]
java.time.OffsetDatetimeTIMESTAMP WITH TIME ZONE

除了不支持Instant和ZonedOffsetDateTime外,OffsetTime也不支持。

参考:PostgreSQL JDBC: Using Java 8 Date and Time classes

PostgreSQL 数据库

timestamp类似LocalDateTime,只是本地时间。要确保JVM的时区和数据库的时区一致,否则会出现时差。

timestamptz是TIMESTAMP WITH TIME ZONE类型,但并没有保存 Time Zone 信息,只是简单的使用UTC标准时间。理由是Time Zone只用于显示,而如何显示时间应该由应用程序处理,没有必要保存到数据库中。

mysql-">MySQL 数据库

MySQL甚至没有提供TIMESTAMP WITH TIME ZONE的类型,日期时间类型只有DateTime,没有 Time Zone 概念。必须使用jdbc连接中的serverTimezone确定时区。如jdbc:mysql://localhost/ujcms?serverTimezone=Asia/Shanghai。

Oracle 数据库

Date:本地时间。精度到秒。
Timestamp:本地时间。精度可以到纳秒。
TIMESTAMP WITH TIME ZONE:标准的OffsetDateTime,保存有Time Zone 信息。
TIMESTAMP WITH LOCAL TIME ZONE:和PostgresSQL的timestamptz类似,只保存标准的UTC时间,然后根据本地的 Time Zone 进行计算。

SQL Server 数据库

datetime2:本地时间。
datetimeoffset:标准的OffsetDateTime,保存有 Time Zone 信息。

JPA

JPA对日期的支持于JDBC规范是一致的。

Hibernate

Hibernate在JPA的基础上进行了扩展,支持Instant、ZonedDateTime。

但所有的Java8日期类型最后都转换成Timestamp进行处理。也就是说即使数据库支持TIMESTAMP WITH TIME ZONE并保存了时区信息,Hibernate也会将其丢弃,转而使用JVM的时区(时间是确保正确的)。

MyBatis

支持Instant。转为Timestamp处理。

支持ZonedDateTime,直接使用原生的。兼容性差,如PostgreSQL JDBC不支持这种类型的,会报错。

Freemarker

使用freemarker-java-8进行格式化。

支持OffsetDateTime和ZonedDateTime的格式化,使用对象中自带的时区。

不支持Instant格式化,会直接调用toString()方法。官方说会增加Instant的支持,但已经3年没有发布新版本。

Thymeleaf

支持OffsetDateTime和ZonedDateTime的格式化,使用对象中自带的时区。

支持Instant格式化,使用JVM默认时区。

Jackson

  • Instant:2008-08-08T08:00:00Z

  • OffsetDateTime:与Instant一致。

  • ZondDateTime:2008-08-08T08:00:00Z[UTC]

如何选择

LocalDateTime虽然日期显示友好,但时区不确定,取决于JVM的时区。这导致时间也不确定,不同时区的JVM访问数据库,会得到不一样的时间。这非常致命,使用LocalDateTime一定要确保JVM和数据库的时区一致。

按照JDBC规范,毫无疑问应该选择OffsetDateTime。OffsetDateTime是一个好选择,具有像LocalDateTime一样直观友好的日期显示,又能确保时间的确定性。

但由于MySQL和PostgreSQL都没有提供真正的保存时区的TIMESTAMP WITH TIME ZONE,OffsetDateTime其实已经降级为Instant(PostgresSQL的timestamptz本质上就是Instant)。特别是PostgreSQL提供的是一个标准UTC时区,而实际需要的是UTC+8的北京时间,这导致在Freemarker和Thymeleaf中都无法得到正确的格式化。

考虑到数据库兼容性的问题,Instant似乎是一个更好的选择。但JDBC4.2及JDBC4.3都不支持Instant,且Instant在Freemarker中也无法格式化。

大部分数据库都提供真正的TIMESTAMP WITH TIME ZONE,即使是MySQL也能通过设置serverTimezone得到时区正确的OffsetDateTime,再加上JDBC规范的要求,OffsetDateTime还是首选。至于PostgreSQL的兼容性,可以在FreeMarker和Thymeleaf中自定义日期格式化方法。

Java是什么

Java是一门面向对象编程语言,可以编写桌面应用程序、Web应用程序、分布式系统和嵌入式系统应用程序。

看完上述内容,你们掌握Java 8日期与数据库日期的映射关系是什么的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注编程网行业资讯频道,感谢各位的阅读!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java 8日期与数据库日期的映射关系是什么

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java 8日期与数据库日期的映射关系是什么

Java 8日期与数据库日期的映射关系是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Java8中有很多新型的日期类型,比传统的日期类型好用。使用什么和数据库的日期进行映射
2023-06-26

mybatis Plus实体类与数据库表映射关系是什么

这篇“mybatis Plus实体类与数据库表映射关系是什么”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“mybatis P
2023-06-26

Python3 JSON数据解析、日期和时间转换的方法是什么

这篇文章主要介绍“Python3 JSON数据解析、日期和时间转换的方法是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python3 JSON数据解析、日期和时间转换的方法是什么”文章能帮助大
2023-07-05

云服务器与数据库的关系是什么

云服务器和数据库都是存储和管理数据的软件系统。云服务器是一种虚拟的服务器,可以在网络上托管并提供云存储服务。数据库通常也是一个大型、复杂的存储系统,用于存储各种类型的信息,包括结构化数据、非结构化数据和对象数据。两者之间的关系是相互依存、相互促进的。云服务器通常使用负载均衡技术将多个云服务器组成一个集群,以提高系统的可用性和性能。同时,为了确保数据的一致性和安全性,云服务器通常支持数据备份和复
2023-10-26

云服务器与云数据库的关系是什么

云服务器和云数据库之间存在一些关系。云服务器是一种虚拟服务器,它能够为多个用户分配相同的资源和计算能力。因此,它可以作为多个云计算应用的一种存储服务器,以供多个用户使用。例如,一个网站可能需要大量的存储空间来存储大量的图片和视频,而云服务器就可以为网站分配存储空间,同时将这些资源分配到不同的用户手中。云数据库是一种数据库管理系统,它可以连接多个云计算应用程序,将它们的数据存储在一个数据库中。例如,一个聊天应...
2023-10-27

云服务器与数据库的关系是什么呢

云服务器和数据库都是常用的计算和存储平台,它们之间的关系可以概括为以下几种:云服务器是数据库的承载平台:云服务器提供了一种快速、弹性的计算资源,它可以被虚拟化为一种存储资源,通过API接口供数据库调用。云服务器为数据库提供了一个运行的环境,数据库可以通过云服务器对外提供数据库服务。云服务器为数据库提供了高可用性、高性能、低成本等特点,数据库也可以通过云服务器对外提供数据库服务。存储和访问是通过云服务器进行...
2023-10-27

云服务器与数据库的关系是什么样的

云服务器与数据库之间存在着密切的关系。云服务器是一种虚拟服务器,它允许用户通过互联网访问,从而可以将它们的数据存储在本地硬件上,并且随时随地访问它们。数据库则是存储和管理数据的软件系统,它们被广泛应用于企业内部和外部的各种应用程序,用于存储数据、管理数据和实现业务流程。云服务器和数据库通过网络连接在一起,可以实现数据共享和访问,使得数据分析和处理更加高效。虽然云服务器和数据库都是计算机架构,但它们具有不同...
2023-10-27

PHP 函数与数据库安全之间的关系是什么?

php 与数据库的安全漏洞密切相关。常见的漏洞包括 sql 注入、xss 和数据泄露。php 提供了多种函数来保护数据库安全,包括 addslashes()、htmlspecialchars() 和 mysqli_real_escape_s
PHP 函数与数据库安全之间的关系是什么?
2024-04-17

云服务器与数据库的关系是什么意思

云服务器与数据库之间有一些重要的区别。云服务器是一种软件,它是由大型计算机、服务器和网络技术组成的。在这种模式下,你可以购买一台服务器并托管它,然后可以使用它来托管自己的应用程序和数据。云服务器也需要数据库支持,这意味着您可以将数据存储在云服务器上以供其他人访问。您也可以使用云服务器来存储数据,并在需要时将数据从本地服务器上传送到云服务器上。云服务器的使用方式是无限制的,而数据库是有限制的。当你使用数据...
2023-10-27

Cassandra与传统关系型数据库的区别是什么

Cassandra是一个分布式的、高性能的、无schema的NoSQL数据库,与传统的关系型数据库有以下几点区别:数据模型:传统的关系型数据库采用表格的方式来组织数据,根据固定的schema定义数据结构,而Cassandra采用键值对的方式
Cassandra与传统关系型数据库的区别是什么
2024-04-09

java中基本数据类型与Object的关系是什么

这篇文章给大家分享的是有关java中基本数据类型与Object的关系是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基本数据类型与Object的关系我知道大家是不是都听说过Object是所有类型的基类,但是这
2023-06-29

云服务器与云数据库的关系是什么意思

云数据库是一种数据存储服务,可以在本地环境中存储和管理数据。云数据库通常使用关系型数据库技术,如MySQL、PostgreSQL和SQLServer等,可以实现高可用性、可扩展性和可靠性。云数据库可以提高云服务器的可扩展性和可靠性,并且可以与云服务器进行有效的集成,以实现更高效的数据存储和管理。两者之间的关系是相互依存
2023-10-27

AmazonAurora与传统关系型数据库在扩展性方面的差异是什么

Amazon Aurora与传统关系型数据库在扩展性方面的主要差异在于Amazon Aurora是一个云原生的关系型数据库服务,具有更高的可伸缩性和性能。传统关系型数据库在处理大规模数据和高并发负载时通常会遇到性能瓶颈,难以实现有效的水平扩
AmazonAurora与传统关系型数据库在扩展性方面的差异是什么
2024-04-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录