当前位置: 首页 > ds >正文

java/mysql/ES下的日期类型分析

mysql的timestamp和datetime

mysql的TIMESTAMP类型内部存的是unix时间戳,可认为是一个32位的整型,它记录了1970.1.1以来的秒数。因为存储长度4字节的限制,所以有2038年限制。

DATETIME类型内部存的是long型,记录了1000.1.1以来的秒数,因为有8个字节,所以能支持到9999年。

TIMESTAMP是时区相关的,它把客户端输入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,又转化为客户端当前时区返回。

DATETIME则是时区无关的,不做任何改变,原样输入和输出。

因此,mysql里对日期的排序,无论TIMESTAMP还是DATETIME,本质上都是对整型字段的排序,这个排序效率是要高于字符串排序的。在mysql层面用字符串存储日期,不谈准确性,至少效率上都不过关。

ES的日期字段

mysql存储日期的结论也适用于ES。因为,ES里的日期也是按秒存储的:

Internally, dates are converted to UTC (if the time-zone is specified) and stored as a long number representing milliseconds-since-the-epoch.
Queries on dates are internally converted to range queries on this long representation, and the result of aggregations and stored fields is converted back to a string depending on the date format that is associated with the field.

我们可以让ES里的date字段同时接收日期格式和long型数字:

PUT test_index
{"mappings": {"properties": {"TimeData": {"type": "date","format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis"}}}
}

这里,epoch_millis就是epoch以来的毫秒数,是一个long。

java的日期类型

  1. java.util.Date:
    java.util.Date是Java中最早的日期时间类之一,它提供了用于表示和操作日期的方法。这个类通常用于表示特定的瞬间,精确到毫秒。然而,由于其设计上的限制,java.util.Date在很多情况下已经不再被推荐使用。
  2. java.sql.Date:
    java.sql.Date是用于处理SQL日期的类,只包含日期部分,不包含时间部分。它主要用于与数据库中的日期字段进行交互。需要注意的是,java.sql.Date是从java.util.Date派生的,因此可以通过调用getTime()方法获取毫秒值。
  3. java.sql.Time:
    java.sql.Time是用于处理SQL时间的类,只包含时间部分,不包含日期部分。它主要用于与数据库中的时间字段进行交互。同样地,java.sql.Time也是从java.util.Date派生的。
  4. java.sql.Timestamp:
    java.sql.Timestamp是用于处理SQL日期和时间的类,既包含日期部分,也包含时间部分。它主要用于与数据库中的日期时间字段进行交互。java.sql.Timestamp也是从java.util.Date派生的。

本质上,上述4个类都属于java.util.Date体系,下面是一个使用的例子:

@Testpublic void testDate() {// Date构造器接收long型,该数字代表epoch以来的毫秒数。它实际内部存储的也是这个long值。java.util.Date date = new Date(3600 * 1000);// Thu Jan 01 09:00:00 CST 1970System.out.println(date);java.sql.Date sqlDate = new java.sql.Date(3600 * 1000);// 1970-01-01System.out.println(sqlDate);java.sql.Time sqlTime = new java.sql.Time(3600 * 1000);// 09:00:00System.out.println(sqlTime);java.sql.Timestamp timestamp = new java.sql.Timestamp(3600 * 1000);// 1970-01-01 09:00:00.0        System.out.println(timestamp);}

我们注意到,java.util.Date打印时会自动转换到当前时区。

java8还可以用LocalDateTime。下面是一个例子:

@Testpublic void testLocalDateTime() {// 第一个参数是epoch以来的秒数,第二个是纳秒矫正,一般是0,第三个是时区偏移LocalDateTime localDateTime = LocalDateTime.ofEpochSecond(3600L, 0, ZoneOffset.of("+8"));System.out.println(localDateTime);}

Date到LocalDateTime的转换:

LocalDateTime cvtDate2Local(java.util.Date date) {Instant instant = date.toInstant();return instant.atZone(ZoneId.systemDefault()).toLocalDateTime();}
http://www.xdnf.cn/news/10116.html

相关文章:

  • 【FlashRAG】本地部署与demo运行(二)
  • PHP7内核剖析 学习笔记 第九章 PHP基础语法的实现
  • [特殊字符] xbatis 一款好用 ORM 框架 1.8.8-M2 发布,节省 1/3 代码和时间的框架!!!
  • Drawio编辑器二次开发
  • 【pytorch学习】土堆pytorch学习笔记2
  • 【Linux】权限相关指令
  • Axure疑难杂症:中继器新增数据时如何上传并存储图片(玩转中继器)
  • 【仿生机器人系统设计】涉及到的伦理与安全问题
  • 数据基座觉醒!大数据+AI如何重构企业智能决策金字塔(上)
  • 代码随想录打卡|Day53 图论(Floyd 算法精讲 、A * 算法精讲 (A star算法)、最短路算法总结篇、图论总结 )
  • 历年武汉大学计算机保研上机真题
  • 服务器液冷:突破散热瓶颈,驱动算力革命的“冷静”引擎
  • 美国服务器文件系统的基本功能和命令
  • ansible-playbook 进阶 接上一章内容
  • dart实现单client连接的grpc server (以ip地址作判断)
  • Yum配置第三方源与本地源详解
  • 日常--OBS+mediamtx实现本地RTMP推流环境搭建(详细图文)
  • RPG17.蓝图函数库与轻重攻击连击
  • C++ 5.29 dddd
  • 【深度剖析】义齿定制行业数字化转型模式创新研究(上篇2:痛点和难点分析)
  • AI智能监控系统:赋能厂区安全管理的数智化革新
  • [Dify] 如何应对明道云API数据过长带来的Token超限问题
  • OAuth协议中的Token、Ticket
  • (NAT64)IPv6网络用户访问IPv4网络服务器(动态映射方式)
  • Linux服务器时间同步——Chronyd
  • MyBatis动态SQL
  • Baklib知识中台驱动业务创新
  • 【HarmonyOS 5】鸿蒙中的UIAbility详解(二)
  • 深化生态协同,宁盾身份域管完成与拓波软件兼容互认证
  • 19、Python字符串高阶实战:转义字符深度解析、高效拼接与输入处理技巧