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] 的相关文章

随机推荐

  • 通过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的转换 五 日期之间的比较 前