首页 > 数据库 >【Java教程】Day11-07 时间与日期:日期与时间API的转换与数据库存储

【Java教程】Day11-07 时间与日期:日期与时间API的转换与数据库存储

时间:2025-01-01 16:27:45浏览次数:3  
标签:java 07 long 日期 API 时间 Java ZonedDateTime

Java 提供了两个日期与时间处理API:旧的 java.util.Date 和 java.util.Calendar,以及新的 java.time 包。新的 API 以 InstantLocalDateTime 等为核心,具有更清晰的设计和更强大的功能。除非你需要与遗留代码进行交互,否则建议使用新的 API。在需要将新旧 API 进行转换时,了解如何在这两者之间互相转换就显得尤为重要。

 

1. 旧 API 转 新 API

1.1 Date 转 Instant 和 ZonedDateTime

Java 8 之前的 java.util.Date 和 java.util.Calendar 对象可以通过 toInstant() 方法转换为新的 Instant 对象。Instant 表示一个瞬时点,之后可以通过它来生成 ZonedDateTime,进一步获取包含时区信息的时间。

示例:

java// Date -> InstantInstant ins1 = new Date().toInstant();// Calendar -> Instant -> ZonedDateTimeCalendar calendar = Calendar.getInstance();Instant ins2 = calendar.toInstant();ZonedDateTime zdt = ins2.atZone(calendar.getTimeZone().toZoneId());

 

在这段代码中,calendar.getTimeZone().toZoneId() 将旧的 TimeZone 对象转换为新的 ZoneId 对象。

1.2 旧 API 的 TimeZone 转 ZoneId

我们还可以注意到,旧版 TimeZone 类提供了 toZoneId() 方法,它允许将旧时区转换为新的时区 ID。这是迁移代码时很常用的技巧。

 

2. 新 API 转 旧 API

2.1 ZonedDateTime 转 long 和 Date

当需要将新的 ZonedDateTime 对象转换为旧的 Date 或 Calendar 对象时,我们可以使用 ZonedDateTime.toEpochSecond() 方法将 ZonedDateTime 转换为秒级时间戳,然后将其转化为 long 类型,再进行转换。

示例:

java// ZonedDateTime -> long (秒级时间戳)ZonedDateTime zdt = ZonedDateTime.now();long ts = zdt.toEpochSecond() * 1000;  // 转换为毫秒// long -> DateDate date = new Date(ts);// long -> CalendarCalendar calendar = Calendar.getInstance();calendar.clear();calendar.setTimeZone(TimeZone.getTimeZone(zdt.getZone().getId()));calendar.setTimeInMillis(ts);

2.2 ZoneId 转 TimeZone

在新 API 中,ZoneId 表示时区信息,而在旧 API 中则是 TimeZone。我们可以通过 ZoneId.getId() 获取时区的 ID 字符串,再使用它来创建旧的 TimeZone 对象。

 

 

3. 在数据库中存储日期和时间

3.1 数据库日期时间类型

数据库中通常使用几种不同类型的字段来存储日期和时间:

  • DATETIME:存储日期和时间。

  • DATE:仅存储日期。

  • TIME:仅存储时间。

  • TIMESTAMP:类似 DATETIME,但数据库在创建或更新记录时会自动更新此字段。

3.2 数据库与 Java 类型的映射

在使用 Java 操作数据库时,常常需要将数据库中的日期和时间类型映射到 Java 类。以下是常见的数据库日期时间类型与 Java 类的映射关系:

数据库类型对应 Java 类(旧 API)对应 Java 类(新 API)
DATETIMEjava.util.DateLocalDateTime
DATEjava.sql.DateLocalDate
TIMEjava.sql.TimeLocalTime
TIMESTAMPjava.sql.TimestampLocalDateTime

3.3 使用 long 存储时间戳

在数据库中,我们可以选择使用 long 类型来存储时间戳,通常使用 BIGINT 类型进行存储。通过存储一个时间戳,我们可以在不同的时区下,灵活地显示本地时间。

示例:将 long 类型时间戳转化为不同地区的本地时间

javaimport java.time.*;import java.time.format.*;import java.util.Locale;public class Main {    public static void main(String[] args) {        long ts = 1574208900000L;  // 示例时间戳(毫秒)        System.out.println(timestampToString(ts, Locale.CHINA, "Asia/Shanghai"));        System.out.println(timestampToString(ts, Locale.US, "America/New_York"));    }    static String timestampToString(long epochMilli, Locale lo, String zoneId) {        Instant ins = Instant.ofEpochMilli(epochMilli);  // 将时间戳转换为 Instant        DateTimeFormatter f = DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM, FormatStyle.SHORT);        return f.withLocale(lo).format(ZonedDateTime.ofInstant(ins, ZoneId.of(zoneId)));  // 格式化为指定时区的日期时间    }}

 

输出示例:

yaml2019年11月20日 上午8:15Nov 19, 2019, 7:15 PM

 

在上述例子中,时间戳 1574208900000L 转化为中国和美国纽约的本地时间,并通过 DateTimeFormatter 格式化显示。

 

 

4. 小结

  1. 使用新的 java.time 包:在处理日期和时间时,尽量使用新的 java.time 包,它提供了更加简洁、灵活且类型安全的 API。

  2. 新旧 API 之间的转换:Java 提供了多种方式将旧的 Date 和 Calendar 转换为新的 InstantZonedDateTime 等,也可以通过 long 类型的时间戳进行转换,确保兼容性。

  3. 数据库中的时间存储:使用 long 类型时间戳存储日期和时间是一个不错的选择,既可以节省空间,又可以方便地跨时区显示本地时间。

  4. 时区的转换:新旧时区类型(ZoneId 和 TimeZone)之间的转换同样很重要,尤其是在处理跨时区的应用时。

通过合理的转换和存储方式,可以确保我们在不同的应用场景中高效、准确地处理日期和时间。

 

 

标签:java,07,long,日期,API,时间,Java,ZonedDateTime
From: https://blog.csdn.net/max202011161630/article/details/144767765

相关文章

  • java毕业设计基于SpringBoot的高校运动会管理系统
    一、项目介绍开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:Maven————————————————二、功能介绍后端技术SpringBoot:作为系统的后端框架,SpringBoot提供了快速搭建......
  • [Java/Spring] 深入理解:Spring Web DispatcherServlet
    1概述:SpringWebDispatcherServletDispatcherServlet简介org.springframework.web.servlet.DispatcherServlet是一个Servlet,它接收所有的HTTP请求,并根据请求的信息将其分发给相应的处理器(Handler)进行处理。它是SpringMVC架构模式中的关键部分,将请求处理逻辑与实际的......
  • JAVA生成验证码
    1、生成方式(验证码字符串、图片验证码、base64验证码图片)/***@description:使用方式1:直接获取验证码字符串,前端进行自定义渲染*@date:2024/12/1611:37*@param*@returnjava.lang.String*/@GetMapping('/getCode')public......
  • [Java] Spring Event 发布-订阅模式:解耦与异步通信的高效实现
    序Spring框架通过发布/订阅模式为组件间通信提供了高效且松散耦合的解决方案,提升了系统的灵活性和扩展性。本文探讨该模式的原理、实现、应用场景及其优势与挑战。1发布订阅模式:基本概念发布-订阅模式,又称为观察者模式(ObserverPattern)的一种变体,是一种基于消息传递的设......
  • 记忆旅游系统|Java|SSM|VUE| 前后端分离
                  【技术栈】1⃣️:架构:B/S、MVC2⃣️:系统环境:Windowsh/Mac3⃣️:开发环境:IDEA、JDK1.8、Maven、Mysql5.7+4⃣️:技术栈:Java、Mysql、SSM、Mybatis-Plus、VUE、jquery,html5⃣️数据库可视化工具:navicat6⃣️服务器:SpringBoot自带apacheto......
  • Java代码实现优先级队列
         最近看了PriorityQueue的源码实现后,我深有感悟,其实本质上就是用了堆的数据结构,我也自己尝试实现了优先级队列的代码,不多说了,代码如下。目录源码实现 测试用例代码源码实现    最近看了PriorityQueue的源码实现后,我深有感悟,其实本质上就是用了堆......
  • Java重要面试名词整理(十七):Nacos
    文章目录架构演化技术选型概念相关核心概念核心功能设计注册中心CP架构分析BASE理论配置中心架构演化我们认为架构发展历史经历了这样一个过程:单体架构——>垂直架构——>SOA面向服务架构——>微服务架构。SOA(Service-OrientedArchitecture),面向服务的架......
  • [2608]基于JAVA的纪念品拍卖智慧管理系统的设计与实现
    毕业设计(论文)开题报告表姓名学院专业班级题目基于JAVA的纪念品拍卖智慧管理系统的设计与实现指导老师(一)选题的背景和意义选题背景和意义随着互联网技术的快速发展,电子商务已经成为全球商业活动的重要组成部分。其中,拍卖作为一种特殊的交易方式,在线拍卖系统也逐渐受到......
  • springboot527基于Java企业项目管理系统(论文+源码)_kaic
    摘 要如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统企业项目管理系统信息管理难度大,容错率低,管理人员处理数据费工费时,所以专门为解决这个难题开发了一个企业项......
  • springboot526基于Java的大学生考勤系统的设计与实现(论文+源码)_kaic
    摘  要信息数据从传统到当代,是一直在变革当中,突如其来的互联网让传统的信息管理看到了革命性的曙光,因为传统信息管理从时效性,还是安全性,还是可操作性等各个方面来讲,遇到了互联网时代才发现能补上自古以来的短板,有效的提升管理的效率和业务水平。传统的管理模式,时间越久管理......