JavaSE学习进阶day04_01 Date类

news2024/11/17 5:50:08

第一章 Date类

首先对时间的几个补充有必要知道:

时间起点:

心得:

如果以后我们仅仅要展示时间,那么可以用Date和SimpleDateFormat(格式化)

如果我们要拿着两个时间进行计算,用Date和SimpleDateFormat(解析)

如果我们要修改时间,可以使用Calendar简化开发。

1.1 Date概述

Date其实是JDK提供的Javabean类,用来描述时间的。

如果我们自己去编写一个描述时间的类,那么按照习惯,肯定要思考有什么属性,空参构造,带参构造还有对应的get和set方法,toString方法。看看Date类的几个重要成员和方法。

class Date{
    //属性
    //毫秒值(从计算机的时间原点开始,到指定时间的毫秒值)
    long fastTime;
    
    //如果是空参,我们要给fastTime赋一个默认值
    //默认使用系统当前时间会更方便。
    public Date(){
        fastTime = System.currentTimeMillis();
    }
    
    //传递的是0,表示Date对象,记录的就是时间原点的那个时间。
     public Date(long time){
        this.fastTime = time;
    }
    
    //修改了当前Date对象记录的毫秒值。
    public void setTime(long time){
        this.fastTime = time;
    }
    
    public long getTime(){
        return fastTime;
    }
    
}

可知,空参构造,就是获取当前的时间值,如下:

发现Date空参构造打印的时间确实是现在目前的时间

那有参构造是什么意思呢?

有参构造是在起始时间(C语言诞生时间)的基础上加一个值,单位为毫秒。打印的是加上该值的时间

java.util.Date`类 表示特定的瞬间,精确到毫秒

继续查阅Date类的描述,发现Date拥有多个构造函数,只是部分已经过时,我们重点看以下两个构造函数

  • public Date():从运行程序的此时此刻到时间原点经历的毫秒值,转换成Date对象,分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒)。即打印现在的时间

  • public Date(long date):将指定参数的毫秒值date,转换成Date对象,分配Date对象并初始化此对象,以表示自从标准基准时间(称为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数。以起始时间为起点,形参为偏移量计算。

tips: 由于中国处于东八区(GMT+08:00)是比世界协调时间/格林尼治时间(GMT)快8小时的时区,当格林尼治标准时间为0:00时,东八区的标准时间为08:00。

简单来说:使用无参构造,可以自动设置当前系统时间的毫秒时刻;指定long类型的构造参数,可以自定义毫秒时刻。例如:

import java.util.Date;
​
public class Demo01Date {
    public static void main(String[] args) {
        // 创建日期对象,把当前的时间
        System.out.println(new Date()); // Tue Jan 16 14:37:35 CST 2020
        // 创建日期对象,把当前的毫秒值转成日期对象
        System.out.println(new Date(0L)); // Thu Jan 01 08:00:00 CST 1970
    }
}

tips:在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串。之前已经学过toString方法,已经知道它的作用了

注意:在创建有参构造时,当实参是一个表达式值时,表达式的每一个部分都要写成long类型,因为不这样可能出错。例如实参3600L*24L*365L,而不是写成3600*24*365,写成这样不严谨。因为毫米很大,有时候会超过int型范围,会出错,因此每个部分都要加上L

1.2 Date常用方法

Date类中的多数方法已经过时,常用的方法有:

  • public long getTime() 把日期对象转换成对应的时间毫秒值。

  • public void setTime(long time) 把方法参数给定的毫秒值设置给日期对象

示例代码

通过代码可知,getTime()是获得当前时间到起始时间的毫秒值

System.currentTimeMillis()也是返回起始时间到现在经历的毫秒值。这个在前一节我们就学过的,这里温习一下。

setTime()的功能就是设置偏移值以毫秒为单位。以C语言生日为起始地址

小结:Date表示特定的时间瞬间,我们可以使用Date对象对时间进行操作。

1.3练习:当前时间加1小时

需求:

请打印:当前时间往后走1小时的时间

代码示例:

//1.创建一个Date对象,表示当前时间
Date d = new Date();
//2.获取当前时间毫秒值
long time = d.getTime();
//3.往后走1小时
//此时time计算完毕之后,表示的就是当前时间之后,1小时的时间毫秒值
time = time + 3600 * 1000;
//4.再设置回去
d.setTime(time);
//5.打印时间
System.out.println(d);

第二章 SimpleDateFormat类

SimpleDateFormat用于日期格式化,他的父类:java.text.DateFormat 是日期/时间格式化的抽象类,我们通过SimpleDateFormat类可以帮我们完成日期和文本之间的转换,也就是可以在Date对象与String对象之间进行来回转换。

  • 格式化按照指定的格式,把Date对象转换为String对象

  • 解析按照指定的格式,把String对象转换为Date对象

2.1 构造方法

由于DateFormat为抽象类,不能直接使用,所以需要常用的子类java.text.SimpleDateFormat。这个类需要一个模式(格式)来指定格式化或解析的标准。构造方法为:

  • public SimpleDateFormat(String pattern):用给定的模式和默认语言环境的日期格式符号构造SimpleDateFormat。参数pattern是一个字符串,代表日期时间的自定义格式。

2.2 格式规则

常用的格式规则为:

标识字母(区分大小写)含义
y
M
d
H
m
s

备注:更详细的格式规则,可以参考SimpleDateFormat类的API文档。

2.3 常用方法

DateFormat类的常用方法有:

public String format(Date date):将Date对象格式化为字符串。

public Date parse(String source):将字符串解析为Date对象。

public class SimpleDateFormatDemo {
    public static void main(String[] args) throws ParseException {
        //格式化:从 Date 到 String
        Date d = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        String s = sdf.format(d);
        System.out.println(s);
        System.out.println("--------");
​
        //从 String 到 Date
        String ss = "2048-08-09 11:11:11";
        //ParseException
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date dd = sdf2.parse(ss);
        System.out.println(dd);
    }
}

运行结果:

有必要注意的是对月份格式化时得用大写的MM,而不是小写的mm,小写mm是对分钟进行格式化。这是要注意的一个点,其次下面这个语句

Date dd = sdf2.parse(ss);

这条语句在写的时候会有错误,按住alt+回车,选择第一个添加异常,后面会学。

添加以后是这样:

小结:DateFormat可以将Date对象和字符串相互转换。

2.4练习:格式化时间

需求:

将当前的时间按照以下格式打印:XXXX年XX月XX日 XX:XX:XX

代码示例:

//创建对象,指定对应的模式
//如果空参构造,那么采取默认的模式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
​
//创建Date对象,表示当前时间
Date d = new Date();
//把当前时间格式化成指定的模式
String result = sdf.format(d);
//System.out.println(result);
​
​
Date date = sdf.parse("2021年11月11日 11:11:11");
System.out.println(date.getTime());

运行结果:

2.5练习:秒杀活动

需求:

肯打鸡品牌有一个秒杀活动:

活动开始时间为:2020年11月11日 0:0:0

活动结束时间为:2020年11月11日 0:10:0

现在,有两名同学参加了活动,小贾下单并付款的时间为:2020年11月11日 0:03:47。

小皮下单并付款的时间为:2020年11月11日 0:10:11

要求:

用代码说明这两位同学有没有参加上秒杀活动?

分析:

  • 判断下单时间是否在开始到结束的范围内。

  • 把字符串形式的时间变成毫秒值。

代码示例:

//1.创建日期格式化对象,并指定对应的格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
//2.计算活动开始时间的毫秒值
String start = "2020年11月11日 0:0:0";//定义字符串表示活动开始时间
Date startDate = sdf.parse(start);//把字符串解析成Date对象
long startTime = startDate.getTime();//获取Date对象中的时间毫秒值
//3.计算活动结束时间的毫秒值
String end = "2020年11月11日 0:10:0";
Date endDate = sdf.parse(end);
long endTime = endDate.getTime();
//4.计算小贾同学下单时间的毫秒值
String user = "2020年11月11日 0:03:47";
Date userDate = sdf.parse(user);
long userTime = userDate.getTime();
//5.判断userTime是否在活动时间之内即可
if(userTime >= startTime && userTime <= endTime){
    System.out.println("参加活动成功");
}else{
    System.out.println("参加活动失败");
}

再看一个综合练习,一定要掌握这个练习:

将2048-08-09 11:11:11打印成2048年08月09号 11点11分11秒格式

代码如下:

得先把之前的格式解析为date对象,然后再将此date对象按照指定格式打印。这个小练习还是有点综合哦。多多练习。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/419833.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++升级之路】第十二篇:模板进阶 | 非类型模板参数 模板特化 类模板的分离编译 模板优缺点总结

&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f; &#x1f36d;&#x1f36d;系列专栏&#xff1a;【C学习与应用】 ✒️✒️本篇内容&#xff1a;非类型模板参数&#xff0c;函数模板特化&#xff0c;类模板特化&#xff08;全特化&#xff0c;部分特化&a…

【系统集成项目管理工程师】信息系统集成专业知识

信息系统集成专业技术 一 信息系统建设 1 信息系统生命周期 立项阶段&#xff1a;即概念阶段或需求阶段&#xff0c;这一阶段根据用户业务发展和经营管理的需要&#xff0c;提出建设信息系统的初步构想&#xff0c;然后对企业信息系统的需求进行深入调研和分析&#xff0c;形…

K8s结合docker部署

原生安装步骤 安装必要的环境依赖与工具 sudo apt-get install \apt-transport-https \ca-certificates \curl \gnupg \lsb-release下载证书更新 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-key…

Linux基础命令-seq打印数字序列

Linux基础命令-sed流编辑器 前言 seq命令通常是用来打印一串有规律的数字&#xff0c;常与其他命令搭配使用&#xff0c;一起来看下它的用法。 一. 命令介绍 在doc文档中查看seq命令的含义 NAMEseq - print a sequence of numbers DESCRIPTIONPrint numbers from FIRST to…

4.14-4.16学习总结

多线程&#xff1a; 线程&#xff1a; 线程是操作系统能够进行运算调度的最小单位。它被包含在进程之中&#xff0c;是进程中的实际运作单位。 进程&#xff1a; 进程是程序的基本执行实体 举个例子&#xff1a;360运行之后&#xff0c;它就可以看做是一个进程&#xff0c;但…

【UE4】关卡流送的demo

关卡流送功能可以将地图文件加载到内存中&#xff0c;或者从内存中卸载&#xff0c;并在游戏过程中切换地图的可视性。 这样一来&#xff0c;场景便能拆分为较小的地图块&#xff0c;并且只有相关部分才会占用资源并被渲染。 正确设置后&#xff0c;开发者便能创建大型、无缝衔…

c++STL容器之序列式容器

目录 vector容器 vector对象的默认构造 vector的初始化 vector的遍历 vector的增删改查 vector末尾的添加移除操作 vector的数据存取 deque容器 deque对象的默认构造 deque末尾的添加移除操作 deque的数据存取 stack容器 stack对象的默认构造 stack的push()与po…

Midjourney科普介绍

Midjourney是啥&#xff1f; Midjourney是一个由Midjourney研究实验室开发的人工智能程序&#xff0c;可根据文本生成图像&#xff0c;于2022年7月12日进入公开测试阶段&#xff0c;使用者可通过Discord的机器人指令进行操作&#xff0c;可以创作出很多的图像作品。 以下这些…

ROS2中将octomap发布到Moveit中作为碰撞物体

1.安装准备 这里假设你已经装好了ROS2以及Moveit2&#xff08;都用二进制安装就行&#xff0c;不用从源码安转&#xff09;&#xff0c;没有安装好的&#xff0c;可以按照鱼香ROS的教程安装&#xff0c;两三行命令就搞定了。 我的ROS2版本为humble&#xff0c;请根据你使用的实…

银行数字化转型导师坚鹏:银行同业核心产品与营销策略解读

数字化背景下银行同业核心产品与营销策略解读课程背景&#xff1a; 数字化背景下&#xff0c;很多银行存在以下问题&#xff1a; 不清楚银行同业核心产品发展现状&#xff1f; 不清楚如何银行同业产品营销策略&#xff1f; 不知道如何更好地挖掘他行优质客户&#xff1f; 课…

国产化系统改造实践(未完)

一、项目背景 2020 年,红帽公司宣布,将在 2021 年 12 月 31 日和 2024 年 6 月 30 日分别终止对 CentOS 8 和 CentOS 7 的服务支持,把 CentOS 项目的工作和投资集中在CentOS Stream 上。 CentOS Linux 8已于2021年12月31日停止维护,CentOS Linux7也 将于2024年6月停服。s所…

技术创业者必读:从验证想法到技术产品商业化的全方位解析

导语 | 技术创业之路往往充满着挑战和不确定性&#xff0c;对于初入创业领域的人来说&#xff0c;如何验证自己的创业想法是否有空间、如何选择靠谱的投资人、如何将技术产品商业化等问题都需要认真思考和解决。在「TVP 技术夜未眠」第六期直播中&#xff0c;正马软件 CTO、腾讯…

【《C Primer Plus》读书笔记】第17章:高级数据表示

【《C Primer Plus》读书笔记】第17章&#xff1a;高级数据表示17.1 研究数据表示17.2 从数组到链表17.3 抽象数据类型&#xff08;ADT&#xff09;17.4 队列ADT17.5 用队列进行模拟17.6 链表和数组17.7 二叉查找树17.8 其他说明17.1 研究数据表示 在开始编写代码之前&#xf…

【2023】前端JWT详解

概述 回顾登录的流程&#xff1a; 接下来的问题是&#xff1a;这个出入证&#xff08;令牌&#xff09;里面到底存啥&#xff1f; 一种比较简单的办法就是直接存储用户信息的JSON串&#xff0c;这会造成下面的几个问题&#xff1a; 非浏览器环境&#xff0c;如何在令牌中记录…

C/C++每日一练(20230416)

目录 1. 求数列第n项值 ※ 2. 整数转换英文表示 &#x1f31f;&#x1f31f;&#x1f31f; 3. 数组中找出最大值及索引位置 ※ &#x1f31f; 每日一练刷题专栏 &#x1f31f; Golang每日一练 专栏 Python每日一练 专栏 C/C每日一练 专栏 Java每日一练 专栏 1. 求数…

微信小程序引入骨架屏

骨架屏的使用越来越广泛。在微信小程序中使用骨架屏如果自己实现&#xff0c;不同的页面对应不同的骨架屏&#xff0c;会有一定难度&#xff1b;不过&#xff0c;微信小程序已经提供生成骨架屏功能&#xff0c;使得我们在开发中非常方便&#xff0c;下面介绍如何生成 在生成骨架…

[Linux]管理用户和组

​⭐作者介绍&#xff1a;大二本科网络工程专业在读&#xff0c;持续学习Java&#xff0c;输出优质文章 ⭐作者主页&#xff1a;逐梦苍穹 ⭐所属专栏&#xff1a;Linux基础操作。本文主要是分享一些Linux系统常用操作&#xff0c;内容主要来源是学校作业&#xff0c;分享出来的…

JavaEE 协议 信息是如何在一个机器传到另一个机器的(理论)

抓住你了&#xff01; 文章目录JavaEE & 协议 & 信息是如何在一个机器传到另一个机器的1. 局域网2. 广域网3. IP与端口号&#xff08;初识&#xff09;4. 协议4.1 协议分类分层4.2 协议分层的好处4.3 真实的网络协议分层&#xff0c;TCP/IP五层网络模型4.3.1 应用层4.3…

Spark 3.0中 Spark SQL优化

在Spark3.x版本提供Adaptive Query Execution自适应查询技术&#xff0c;通过在”运行时”对查询执行计划进行优化&#xff0c;允许Planner在运行时执行可选计划&#xff0c;这些可选计划将会基于运行时数据统计进行动态优化&#xff0c;从而提高性能。 Adaptive Query Execut…

在DongshanPI-D1开箱使用分享与折腾记录实现MPU6050数据读取

前言 上一篇文章使用RT-Smart的IIC驱动OLED屏幕&#xff0c;进行基本的字符串显示,在使用过程中对RT-Smart有了一定熟悉&#xff0c;准备使用SPI驱动ST7789&#xff0c;但SPI接口没有引出&#xff0c;本次使用手上已有的传感器MPU6050进行使用。 过程 本次直接开始添加离线包…