Java基础 时间相关类小结[Timestamp,Date,Calendar]

2023-11-01

前言

记录一下与时间相关的几个java基础类,这里JDK的版本为1.8

一、Timestamp(时间戳)

  1. 时间戳是什么?
    时间戳是指格林威治时间自1970年1月1日(00:00:00 GMT)至某个时间的总秒数。通俗的讲,时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。
  2. java时间戳的初始化

查看Timestamp的源码,可以知道,Timestamp的构造函数到1.8只剩下了一个,源码如下

public Timestamp(long time) {
        super((time/1000)*1000);
        nanos = (int)((time%1000) * 1000000);
        if (nanos < 0) {
            nanos = 1000000000 + nanos;
            super.setTime(((time/1000)-1)*1000);
        }
    }

根据构造函数可知需要使用一个long类型的数字来初始化TimeStamp,
long类型为8字节,每字节8big,能表示-2的64次方 至 2的64次方-1(即-9223372036854775808到9223372036854775807),正数部分转换成年为292271023.05年,所以是足够的
既然初始化TimeStamp需要一个long型的参数,那么我们先从这个long型的参数入手,当然我们不可能一年份一年份的去算这个毫秒数,所以需要通过已有的api来得到这个参数,以下三种方式都可以获得自1970年1月1日到当前的时间的毫秒数。

        long t1 = System.currentTimeMillis();
        long t2 = new Date().getTime();//等同于第一种不推荐使用
        long t3 = System.currentTimeMillis();

那么初始化TimeStamp就可以应用以上三个long值来进行初始化,其中第二种方式使用Date来获取毫秒数,查看Date构造函数源码这个方法的底层依旧是调用的System.currentTimeMillis(),所以不推荐使用,源码如下

public Date() {
        this(System.currentTimeMillis());
    }
  1. 时间戳初始化
Timestamp time1 = new Timestamp(System.currentTimeMillis());
Timestamp time2 = new Timestamp(Calendar.getInstance().getTimeInMillis());

二、Date(日期)

Date可能是日常使用比较频繁的一个类,常用语日期按照特定的格式转换成字符串(配合SimpleDateFormat),查看jdk 1.8版本的源码可知
在这里插入图片描述
目前初始化Date的构造方法剩两种,其中无参构造生成的Date表示当前时间,有参构造需传入一个long值来得到一个Date(这点与TimeStamp一致)

三、Calendar(日历)

Calender的构造主要依据,TimeZone zone(时区), Locale(语言环境值)
在这里插入图片描述

四、Timestamp、Date、Calendar的转换

import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimeCase {
    public static void main(String[] args) throws ParseException {
        //字符串转Date
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String timeStr = "2021-07-07 16:30:00";
        Date time = sdf.parse(timeStr);

        //字符串转Timestamp
        Timestamp timestamp = Timestamp.valueOf(timeStr);

        //Date转Calender
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(time);

        //Calender转Date
        Date date1 = calendar.getTime();
        
        //Date Calender 转Timestamp可使用上述说的,Timestamp构造函数来构造
        Timestamp time1 = new Timestamp(System.currentTimeMillis());
        Timestamp time2 = new Timestamp(new Date().getTime());//不推荐使用
        Timestamp time3 = new Timestamp(Calendar.getInstance().getTimeInMillis());
    }
}

五、日期之间的比较

  1. Date的After,Before函数
  2. Date的compareTo函数
    A.compareTo(B)
    如果A和B时间相同,结果为0
    A早于B,结果为负数
    A晚于B,结果为正数
import java.sql.Timestamp;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

public class TimeCase {
    public static void main(String[] args) throws ParseException {
        //日期的比较
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

        Calendar nowCalender = Calendar.getInstance();
        nowCalender.setTime(new Date());
        //这里需要注意不可以用nowCalender对象直接赋值到yesterdayCalender,因为这里直接赋值实际上赋的是对象的引用而不是复制
        Calendar yesterdayCalender = (Calendar) nowCalender.clone();
        yesterdayCalender.add(Calendar.DATE, -1);
        Calendar tomorrowCalender = (Calendar) nowCalender.clone();
        tomorrowCalender.add(Calendar.DATE, 1);

        Date now = nowCalender.getTime();
        Date yesterday = yesterdayCalender.getTime();
        Date tomorrow = tomorrowCalender.getTime();
        System.out.println("now:" + simpleDateFormat.format(now));
        System.out.println("yesterday:" + simpleDateFormat.format(yesterday));
        System.out.println("tomorrow:" + simpleDateFormat.format(tomorrow));

        System.out.println("---------------Date的before,after方法---------------");
        System.out.println("now比yesterday早:" + now.before(yesterday));
        System.out.println("now比tomorrow早:" + now.before(tomorrow));
        System.out.println("now比yesterday晚:" + now.after(yesterday));
        System.out.println("now比tomorrow晚:" + now.after(tomorrow));

        System.out.println("---------------Date的compareTo方法---------------");
        System.out.println("now.compareTo(now):" + now.compareTo(now));
        System.out.println("now.compareTo(yesterday):" + now.compareTo(yesterday));
        System.out.println("now.compareTo(tomorrow):" + now.compareTo(tomorrow));
    }
}

运行结果:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java基础 时间相关类小结[Timestamp,Date,Calendar] 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • 文本在指定长度后分割,但不要使用 grails 打断单词

    我有一个长字符串 需要将其解析为长度不超过 50 个字符的字符串数组 对我来说 棘手的部分是确保正则表达式找到 50 个字符之前的最后一个空格 以便在字符串之间进行彻底的分隔 因为我不希望单词被切断 public List
  • Logback:SizeAndTimeBasedRollingPolicy 不遵守totalSizeCap

    我正在尝试以一种方式管理我的日志记录 一旦达到总累积大小限制或达到最大历史记录限制 我最旧的存档日志文件就会被删除 当使用SizeAndTimeBasedRollingPolicy在 Logback 1 1 7 中 滚动文件追加器将继续创建
  • 您建议使用哪种压缩(GZIP 是最流行的)servlet 过滤器?

    我正在寻找一个用于大容量网络应用程序的 GZIP servlet 过滤器 我不想使用容器特定的选项 要求 能够压缩响应负载 XML Faster 已在大批量应用的生产中得到验证 应适当设置适当内容编码 跨容器移植 可选择解压缩请求 谢谢 我
  • 在 MongoDB 和 Apache Solr 之间同步数据的简单方法

    我最近开始使用 MongoDB 和 Apache Solr 我使用 MongoDB 作为数据存储 并且希望 Apache Solr 为我的数据创建索引 以实现应用程序中的搜索功能 经过一些研究 我发现 基本上有两种方法可以在 MongoDB
  • 如何使用正则表达式验证 1-99 范围?

    我需要验证一些用户输入 以确保输入的数字在 1 99 范围内 含 这些必须是整数 Integer 值 允许前面加 0 但可选 有效值 1 01 10 99 09 无效值 0 007 100 10 5 010 到目前为止 我已经制定了以下正则
  • 从直方图计算平均值和百分位数?

    我编写了一个计时器 可以测量任何多线程应用程序中特定代码的性能 在下面的计时器中 它还会在地图中填充花费了 x 毫秒的调用次数 我将使用这张图作为我的直方图的一部分来进行进一步的分析 例如调用花费了这么多毫秒的百分比等等 public st
  • 添加到列表时有没有办法避免循环?

    我想知道这样的代码 List
  • Java:如何确定文件所在的驱动器类型?

    Java 是否有一种独立于平台的方法来检测文件所在的驱动器类型 基本上我有兴趣区分 硬盘 可移动驱动器 如 USB 记忆棒 和网络共享 JNI JNA 解决方案不会有帮助 可以假设 Java 7 您可以使用 Java 执行 cmd fsut
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 使用Java绘制维恩图

    我正在尝试根据给定的布尔方程绘制维恩图 例如 a AND b AND c我想在 Android 手机上执行此操作 因此我需要找到一种使用 Java 来执行此操作的方法 我找到了一个完美的小部件 它可以完成我在这方面寻找的一切布尔代数计算器
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • 替换文件中的字符串

    我正在寻找一种方法来替换文件中的字符串而不将整个文件读入内存 通常我会使用 Reader 和 Writer 即如下所示 public static void replace String oldstring String newstring
  • 何时在 hibernate 中使用 DiscriminatorValue 注解

    在 hibernate 中使用 DiscriminatorValue 注释的最佳场景是什么以及何时 这两个链接最能帮助我理解继承概念 http docs oracle com javaee 6 tutorial doc bnbqn html
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 记录类名、方法名和行号的性能影响

    我正在我的 java 应用程序中实现日志记录 以便我可以调试应用程序投入生产后可能出现的潜在问题 考虑到在这种情况下 人们不会奢侈地使用 IDE 开发工具 以调试模式运行事物或单步执行完整代码 因此在每条消息中记录类名 方法名和行号将非常有
  • 如何使用通配符模拟泛型方法的行为

    我正在使用 EasyMock 3 2 我想基于 Spring Security 为我的部分安全系统编写一个测试 我想嘲笑Authentication http docs spring io autorepo docs spring secu

随机推荐

  • 通过python写脚本简单爆破web页面登陆

    GET传参 import requests url payload username admin password admin submit 登陆 r requests get url params payload result r con
  • Jackson框架

    Jackson框架 一 Jackson简介 Jackson可以轻松的将Java对象转换成json对象和xml文档 同样也可以将json xml转换成Java对象 相比json lib框架 Jackson所依赖的jar包较少 简单易用并且性能
  • 金蝶EAS-BOS二开详细过程

    我们在做金蝶的项目时 经常会要求更改其项目本身的代码 但是它的代码都被封装在jar包中 我们应该怎么做呢 将要二开的单据实体或者facade 复制到我们的本地项目中 选中你要修改的具体实体或者facade 右键点击复制 重命名 复制到我们的
  • 配置Hadoop集群+WordCount案例

    配置Hadoop集群 配置环境变量 etc profile export HADOOP HOME bigData hadoop 2 8 0 export PATH P A T H PATH PATH HADOOP
  • cannot read property ‘line‘ of undefined

    环境 vite vue3 ts 这个问题的点还挺不明显的 翻了翻代码修改记录 发现是漏了结尾的 lt style gt 标签 做好本地代码管理真的很重要
  • gradle 两种更新方法

    第一种 Android studio更新 第一步 在你所在项目文件夹下 你项目根目录gradlewrappergradle wrapper properties 替换 distributionUrl https services gradl
  • 【算法/剑指Offer】地上有一个m行和n列的方格。一个机器人从坐标0,0的格子开始移动,每一次只能向左,右,上,下四个方向移动一格,但是不能进入行坐标和列坐标的数位之和大于k的格子。

    题目描述 地上有一个m行和n列的方格 一个机器人从坐标0 0的格子开始移动 每一次只能向左 右 上 下四个方向移动一格 但是不能进入行坐标和列坐标的数位之和大于k的格子 例如 当k为18时 机器人能够进入方格 35 37 因为3 5 3 7
  • java螺旋数组

    1 程序设计题 对于一个 n 行 m 列的表格 我们可以使用螺旋的方式给表格依次填上正整数 我们称填好的表格为一个螺旋矩阵 例如 一个 4 行 5 列的螺旋矩阵如下 1 2 3 4 5 14 15 16 17 6 13 20 19 18 7
  • jquery 等待3秒钟执行函数

    setTimeout function div2 hide 3000
  • CF1249B2 Books Exchange (hard version) 题解

    题目大意 共 q q q 组询问 对于每一组询问有长度为 n n n 的序列 p p
  • Linux进程内核栈

    进程创建的时候Linux内核会创建内核栈 arm手册也要求内核态有单独的栈 如应用进程在用户态通过系统调用陷入内核态的时候 上下文信息 如cpu寄存器 需要有个地方保存 如此 从内核态切换回用户态时候 能继续从系统调用之后的代码开始执行 这
  • JSON数据采集(采集JSON格式数据)

    如果想要采集JSON格式数据的网页怎么办 Json数据格式的页面 常出现于以下场景 1 滚动加载页面采集 瀑布流加载采集 2 网址没有变化的页面采集 3 采集点击加载更多的页面 这些页面我们都可以尝试使用简数采集器来实现JSON数据采集 1
  • Java 1.5, 1.6, 1.7, 1.8的区别

    对于很多刚接触java语言的初学者来说 要了解一门语言 最好的方式就是要能从基础的版本进行了解 升级的过程 以及升级的新特性 这样才能循序渐进的学好一门语言 今天先为大家介绍一下JDK1 5版本到JDK1 7版本的特性 希望能给予帮助 JD
  • MybatisPlus自定义sql多表关联分页条件查询

    MybatisPlus自定义sql多表关联分页条件查询 mp封装了crud但是对应复杂sql还是需要自己定义 网上对于多表分页查询的mp描述不是很清楚 我在这里重新写一篇文章 1 数据库准备 需要实现的sql是两表关联条件查询 select
  • MeterSphere 至善篇

    简介 MeterSphere 是一站式开源持续测试平台 涵盖测试跟踪 接口测试 UI 测试和性能测试等功能 全面兼容 JMeter Selenium 等主流开源标准 有效助力开发和测试团队充分利用云弹性进行高度可扩展的自动化测试 加速高质量
  • 自动适配手机网页 适配手机的网站网页 网页自动适配

    自动适配手机网页 适配手机的网站网页 网页自动适配 Category xy309 Time 2012 11 21 8 54 26 点击 14次 Source 兴移 允许网页宽度自动调整 自适应网页设计 到底是怎么做到的 其实并不难 首先 在
  • (面试题)如何解决MySQL慢查询

    慢查询出现原因以及解决方法 扫描多余的数据 避免使用select from xxx 跨多表扫描数据 可以减少join 并适当反范式化 增加冗余数据 以空间换时间 索引没有建立 索引优化不当 或未应用到最佳索引 联合索引使用最左匹配 CREA
  • 【无标题】UE5从百度盘下载UEC++项目到本地所遇到的一些问题和解决方法

    从百度盘里下载UEC 项目到自己的电脑 如果直接用VS打开C 会报打不开源文件等错误 如下图所示 解决方法 删除 图中用红线框的文件夹 若是VS 版本不同也可以把 sln 文件删除 删除后再生成c 项目 若是打开VS 编译是出现以下弹窗 则
  • 一级指针

    一级指针是一种指针 它指向一块内存地址 这块内存中存储的是另一个变量的内存地址 使用一级指针 你可以间接访问到这个变量 在 C C 中 可以使用一级指针来动态分配内存 改变函数参数的值 或者通过指针传递数组 下面是一个使用一级指针的例子 i
  • Java基础 时间相关类小结[Timestamp,Date,Calendar]

    Java基础 时间相关类 Timestamp Date Calendar 前言 一 Timestamp 时间戳 二 Date 日期 三 Calendar 日历 四 Timestamp Date Calendar的转换 五 日期之间的比较 前