Java中的日期时间类详解(Date、DateFormat、Calendar)

news2024/11/19 23:27:48

1. Date类


1.1 概述


java.util.Date类表示特定的瞬间,精确到毫秒。Date类的构造函数可以把毫秒值转成日期对象。

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

1.2 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。

 利用空参构造可以自动设置当前系统时间的毫秒时刻

 //1.创建对象表示一个时间
        Date d1=new Date();
        System.out.println(d1);

 利用有参构造指定long类型的构造参数,可以自定义毫秒时刻。例如:

  //2.创建对象表示一个指定的时间
        Date d2=new Date(0L);
        System.out.println(d2);

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

//3.setTime修改时间
        //1000毫秒=1s
        d2.setTime(1000L);
        System.out.println(d2);

利用getTime获取时间 

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

 //利用gettime获取时间
        long time = d2.getTime();
        System.out.println(time);

tips:在使用println方法时,会自动调用Date类中的toString方法。Date类对Object类中的toString方法进行了覆盖重写,所以结果为指定格式的字符串,也就是打印的是属性值。

练习

public class timedemo2 {
    public static void main(String[] args) {
      //需求: 打印时间原点开始一年之后的时间
        Date d1 = new Date(0L);
        //获取d1时间的毫秒值
        long time = d1.getTime();
        //在这个基础上我们要加一年的毫秒值
        time+=1000L*60*60*24*365;
        //把计算之后的时间毫秒值再设置回d1当中
        d1.setTime(time);
        System.out.println(d1);
    }
}

 //需求2:定义2个任意的Date对象,比较一个哪个时间在前
        Date d1 = new Date(Math.abs(r.nextInt()));
        Date d2 = new Date(Math.abs(r.nextInt()));
        long time1 = d1.getTime();
        long time2 = d2.getTime();
        if (time1 > time2) {
            System.out.println("第一个时间在后面,第二个时间在前面");
        } else if (time1<time2) {
            System.out.println("第一个时间在前面,第二个时间在后面");

        }else{
            System.out.println("二个时间一样");
        }

    }

2. DateFormat类

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

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

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

2.1 构造方法

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

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

2.2 格式规则

常用的格式规则为:

format方法 

使用format方法的代码为:

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
 把Date对象转换成String
*/
public class Demo03DateFormatMethod {
    public static void main(String[] args) {
        Date date = new Date();
        // 创建日期格式化对象,在获取格式化对象时可以指定风格
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        String str = df.format(date);
        System.out.println(str); // 2020年09月19日
    }
}

parse方法 

使用parse方法的代码为:

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/*
 把String转换成Date对象
*/
public class Demo04DateFormatMethod {
    public static void main(String[] args) throws ParseException {
        DateFormat df = new SimpleDateFormat("yyyy年MM月dd日");
        String str = "2018年12月11日";
        Date date = df.parse(str);
        System.out.println(date); // Tue Dec 11 00:00:00 CST 2018
    }
}

package SimpleDateFormat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatdemo1 {
    /*
   public simpleDateFormat() 默认格式
   public simpleDateFormat(String pattern) 指定格式
   public final string format(Date date) 格式化(日期对象 ->字符串)
   public Date parse(string source) 解析(字符串 ->日期对象)
       */
    public static void main(String[] args) throws ParseException {
        //method01();
        // method2();
        //1.定义一个字符串表示时间
        String str = "2023-11-11 11:11:11";
        //2.利用空参构造创建simpleDateFormat对象
        // 细节:
        //创建对象的格式要跟字符串的格式完全一致
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss ");
        Date date = sdf.parse(str);
        //3.打印结果
        System.out.println(date);



    }

    private static void method2() {

        Date d2 = new Date();
        //2.利用带参构造创建simpleDateFormat对象,指定格式
        SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss EE");
        System.out.println(sdf2.format(d2));
    }

    private static void method01() {
        //1.利用空参构造创建simpleDateFormat对象,默认格式
        SimpleDateFormat sdf = new SimpleDateFormat();
        Date d1 = new Date();//当前系统时间
        System.out.println(sdf.format(d1));//打印格式化(日期对象 ->字符串)
        //2024/7/4 下午5:19
    }

}

练习1

package SimpleDateFormat;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatdemo2 {
     /*
   public simpleDateFormat() 默认格式
   public simpleDateFormat(String pattern) 指定格式
   public final string format(Date date) 格式化(日期对象 ->字符串)
   public Date parse(string source) 解析(字符串 ->日期对象)
       */
     public static void main(String[] args) throws ParseException {
         //1.定义一个字符串表示时间
         String str="2000-11-11";
         //2.利用空参构造创建simpleDateFormat对象
         // 细节:
         //创建对象的格式要跟字符串的格式完全一致
         SimpleDateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd");
         Date date = sdf1.parse(str);

         //利用带参构造创建simpleDateFormat对象,指定格式
         SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日");
         System.out.println(sdf2.format(date));
     }
}

练习2


 

package SimpleDateFormat;
/* 需求:
            秒杀活动开始时间:2023年11月11日 0:0:0(毫秒值)
            秒杀活动结束时间:2023年11月11日 0:10:0(毫秒值)

            小贾下单并付款的时间为:2023年11月11日 0:01:0
            小皮下单并付款的时间为:2023年11月11日 0:11:0
            用代码说明这两位同学有没有参加上秒杀活动?
         */

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateFormatdemo3 {
    public static void main(String[] args) throws ParseException {
        //1.定义字符串表示三个时间
        String startstr = "2023年11月11日 0:0:0";//600000毫秒=600s
        String endtstr = "2023年11月11日 0:10:0";
        String ordertstr = "2023年11月11日 0:01:0";//6s
        //2.解析上面的三个时间,得到Date对象
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
        Date startdate = sdf.parse(startstr);
        Date enddate = sdf.parse(endtstr);
        Date orderdate = sdf.parse(ordertstr);
        //3.获取3个毫秒差
        long starttime = startdate.getTime();
        long endtime = enddate.getTime();
        long ordertime = orderdate.getTime();
       if (ordertime >=starttime&& ordertime <=endtime) {
           System.out.println("参加活动成功");
       }else {
           System.out.println("参加活动失败");
       }


    }
}

3.Calendar类

3.1 概念
java.util.Calendar是日历类,在Date后出现,替换掉了许多Date的方法。该类将所有可能用到的时间信息封装为静态成员变量,方便获取。日历类就是方便获取各个时间属性的。

3.2 获取方式
Calendar为抽象类,由于语言敏感性,Calendar类在创建对象时并非直接创建,而是通过静态方法创建,返回子类对象,如下:

Calendar静态方法

public static Calendar getInstance():使用默认时区和语言环境获得一个日历

import java.util.Calendar;

public class Demo06CalendarInit {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
    }    
}

3.3 常用方法
根据Calendar类的API文档,常用方法有:

public int get(int field):返回给定日历字段的值。
public void set(int field, int value):将给定的日历字段设置为给定值。
public abstract void add(int field, int amount):根据日历的规则,为给定的日历字段添加或减去指定的时间量。
public Date getTime():返回一个表示此Calendar时间值(从历元到现在的毫秒偏移量)的Date对象。

Calendar类中提供很多成员常量,代表给定的日历字段:

//1.获取日历对象
//细节1:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
//底层原理:
//会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
//把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
// 0 :纪元
// 1 :年
// 2 :月
// 3 : 一年中的第几周
// 4:一个月中的第几周
// 5: 一个月中的第几天(日期)
// ....
//细节2:
//月份:范围0~11 如果获取出来的是.那么实际上是1月。
//星期:在老外的眼里,星期日是一周中的第一天
//      1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)

get/set方法

get方法用来获取指定字段的值,set方法用来设置指定字段的值,代码使用演示:

import java.util.Calendar;
public class Demo {
    public static void main(String[] args) {
        // 创建Calendar对象
        Calendar cal = Calendar.getInstance();
        // 获取年 
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
}

package Calendar;

import java.util.Calendar;

public class CalendarDemo3 {
    public static void main(String[] args) {
        Calendar cal=Calendar.getInstance();
        //设置年
        cal.set(Calendar.YEAR,2034);
        //获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH)+1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.print(year + "年" + month + "月" + dayOfMonth + "日");
    }
}

add方法

add方法可以对指定日历字段的值进行加减操作,如果第二个参数为正数则加上偏移量,如果为负数则减去偏移量。代码如:

package Calendar;
import java.util.Calendar;
public class CalendarDemo4 {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        // 获取年
        int year = cal.get(Calendar.YEAR);
        // 获取月
        int month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        int dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
        // 使用add方法
        cal.add(Calendar.DAY_OF_MONTH, 2); // 加2天
        cal.add(Calendar.YEAR, -3); // 减3年
        // 获取年
        year = cal.get(Calendar.YEAR);
        // 获取月
        month = cal.get(Calendar.MONTH) + 1;
        // 获取日
        dayOfMonth = cal.get(Calendar.DAY_OF_MONTH);
        System.out.println(year + "年" + month + "月" + dayOfMonth + "日");
    }
}

getTime方法:返回对应的Date对象

Calendar中的getTime方法并不是获取毫秒时刻,而是拿到对应的Date对象。

import java.util.Calendar;
import java.util.Date;

public class Demo {
    public static void main(String[] args) {
        Calendar cal = Calendar.getInstance();
        Date date = cal.getTime();
        System.out.println(date); 
    }
}

综合

package Calendar;

import java.util.Calendar;
import java.util.Date;

import static Calendar.CalendarDemo1.getWeek;

/*
      public static Calendar lgetInstance()               获取当前时间的日历对象
      public final Date getTime()                         获取日期对象
      public final setTime(Date date)                     给日历设置日期对象
      public long getTimeInMillis()                       拿到时间毫秒值
      public void setTimeInMillis(long millis)            给日历设置时间毫秒值
      public int get(int field)                           获取日期中的某个字段信息
      public void set(int field,int value)                修改日历的某个字段信息
      public void add(int field,int amount)               为某个字段增加/减少指定的值
      */
public class CalendarDemo5 {
    public static void main(String[] args) {
        //1.获取日历对象
        //细节1:Calendar是一个抽象类,不能直接new,而是通过一个静态方法获取到子类对象
        //底层原理:
        //会根据系统的不同时区来获取不同的日历对象,默认表示当前时间。
        //把会把时间中的纪元,年,月,日,时,分,秒,星期,等等的都放到一个数组当中
        // 0 :纪元
        // 1 :年
        // 2 :月
        // 3 : 一年中的第几周
        // 4:一个月中的第几周
        // 5: 一个月中的第几天(日期)
        // ....
        //细节2:
        //月份:范围0~11 如果获取出来的是.那么实际上是1月。
        //星期:在老外的眼里,星期日是一周中的第一天
        //      1(星期日) 2(星期一) 3(星期二) 4(星期三) 5(星期四) 6(星期五) 7(星期六)
        Calendar c = Calendar.getInstance();
       /*
       public final Date getTime()                         获取日期对象
        public final setTime(Date date)                     给日历设置日期对象
        */
        //2.修改一下日历代表的时间
        Date d = new Date(0L);
        c.setTime(d);
        System.out.println(c);
        //puslic int get(int field) 取日期中的某个字段信息
        //public void set(int field,int value) 修改日历的某个字段信息

        c.set(Calendar.YEAR, 2024);
        c.set(Calendar.MONTH,7);
        c.set(Calendar.DAY_OF_MONTH,5);
        //增加一个月
        c.add(Calendar.MONTH, 1);
        //java在Calendar类中,把索引对应的数字都定义成常量
        int year = c.get(Calendar.YEAR);
        int month = c.get(Calendar.MONTH);
        int date = c.get(Calendar.DAY_OF_MONTH);
        int week = c.get(Calendar.DAY_OF_WEEK);
       //public void add(int fieldint amount) 为某个字段增加/减少指定的值

        System.out.println(year+" "+month+" "+date+" "+getWeek(week));

    }
    //查表法://表:容器
    //让数据跟索引产生对应的关系
    //传入对应的数字: 1 ~7//返回对应的星期
    public static String getWeek(int index) {
        //定义一个数组,让汉字星期几 跟1~7产生对应关系
        String[] arr = {"", "星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
        //根据索引返回对应的星期
        return arr[index];

    }
}

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

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

相关文章

三界-欢迎来到Web3D+GIS学习天地!

三界-欢迎来到Web3DGIS学习天地&#xff01; 地址&#xff1a;threelab.cn ** 坚持封装自己的引擎已经有三年了&#xff0c;每天都是加班熬夜开发功能&#xff0c;做东西。 虽然这段时间内&#xff0c;我一直在业余时间坚持开发&#xff0c;但实际投入的开发时间并不长&#…

iOS 练习项目 Landmarks (五):UISwitch 切换展示数据

iOS 练习项目 Landmarks &#xff08;五&#xff09;&#xff1a;UISwitch 切换展示数据 iOS 练习项目 Landmarks &#xff08;五&#xff09;&#xff1a;UISwitch 切换展示数据引入 Lookin优化项目结构纯代码方式重写主界面设置详情页的返回按钮的文本Switch切换TableView展示…

通江银耳销售管理系统-计算机毕业设计源码15998

摘要 随着人们健康意识的增强&#xff0c;银耳这种传统的中药食材备受关注。而通江银耳是四川省通江县特产&#xff0c;中国国家地理标志产品。四川省通江县是银耳的发源地&#xff0c;中国银耳之乡&#xff0c;通江银耳因主产于此而得名&#xff0c;以其独到的质厚、肉嫩、易炖…

【linux高级IO(一)】理解五种IO模型

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:Linux从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学更多操作系统知识   &#x1f51d;&#x1f51d; Linux高级IO 1. 前言2. 重谈对…

Chrome插件分享-Stylus

简介 Stylus 是一个调整网页外观的用户样式管理器。它可以让您轻松为许多热门网站安装主题和皮肤。 这是 chrome 应用商店对Stylus插件的介绍&#xff0c;通俗一点讲&#xff0c;就是可以根据不同网站来定制网页的主题和皮肤&#xff0c;甚至可以去广告。 还有一个重点是&#…

高薪程序员必修课-java中 类加载器以及JVM类加载机制

前言 在Java中&#xff0c;类加载器&#xff08;ClassLoader&#xff09;是Java虚拟机&#xff08;JVM&#xff09;的一个重要组成部分&#xff0c;负责将.class文件加载到内存中并生成对应的Class对象。类加载器的主要任务是动态加载Java类&#xff0c;即在程序运行时根据需要…

刚办理的手机号被停用,你可能遇到这些问题了!

很多朋友都会遇到手机号被停用的情况&#xff0c;那么你知道你的手机号为什么会被停用吗&#xff1f;接下来&#xff0c;关于手机号被停用的问题&#xff0c;跟着小编一块来了解一下吧。 ​停机的两种形态&#xff1a; 1、第一个是局方停机&#xff0c;即语音、短信和流量都不…

Amazon SageMaker 机器学习之旅的助推器

一、前言 在当今的数字化时代&#xff0c;人工智能和机器学习已经成为推动社会进步的重要引擎。亚马逊云科技在 2023 re:Invent 全球大会上&#xff0c;宣布推出五项 Amazon SageMaker 新功能&#xff1a; Amazon SageMaker HyperPod 通过为大规模分布式训练提供专用的基础架构…

香橙派AIpro开发板评测:部署yolov5模型实现图像和视频中物体的识别

OrangePi AIpro 作为业界首款基于昇腾深度研发的AI开发板&#xff0c;自发布以来就引起了我的极大关注。其配备的8/20TOPS澎湃算力&#xff0c;堪称目前开发板市场中的顶尖性能&#xff0c;实在令人垂涎三尺。如此强大的板子&#xff0c;当然要亲自体验一番。今天非常荣幸地拿到…

Kubernetes基于helm安装 harbor

Kubernetes基于helm安装 harbor 之前harbor的安装都是借助docker完成一键安装部署&#xff0c;安装完成之后harbor组件均运行到一台机器上面&#xff0c;本文实践harbor在k8s环境中的部署。 准备工作 根据harbor官方要求&#xff1a; Kubernetes cluster 1.20Helm v3.2.0 …

kkFileView一款好用开源免费的文件在线预览项目

在这个数字化时代&#xff0c;我们每天都要跟各种文件打交道&#xff0c;但很多时候&#xff0c;文件预览却成了个头疼的问题&#xff0c;很多时候我们都希望能够在不下载文件的情况下&#xff0c;快速查看文件内容。 今天开源君就来分享一款文件在线预览项目 - kkFileView&am…

编译rust程序,并让它依赖低版本的GLIBC库

目录 方法一&#xff1a;在较低版本的linux系统里面编译更新centos源安装 gcc 方法二&#xff1a;静态编译 在linux环境下编译rust程序&#xff0c;编译好的程序会依赖你当前系统的GLIBC库&#xff0c;也就是说你的程序无法在使用更低版本GLIBC库的linux系统中运行。 查看当前系…

Java案例:完成用户登录

一案例要求&#xff1a; 二代码实现&#xff1a; Ⅰ package 重修;import java.util.Random; import java.util.Scanner;public class first {public static void main(String[] args) {javabean s1new javabean("张世杰","5201314");Scanner scnew Scan…

【Linux】Linux常用指令合集精讲,一篇让你彻底掌握(万字真言)

文章目录 一、文件与目录操作1.1 ls - 列出目录内容1.2 cd - 切换目录1.3 pwd - 显示当前目录1.4 mkdir - 创建目录1.5 rmdir - 删除空目录1.6 rm - 删除文件或目录1.7 cp - 复制文件或目录1.8 mv - 移动或重命名文件或目录1.9 touch - 创建空文件或更新文件时间戳 二、文件内容…

日期选取限制日期范围antdesign vue

限制选取的日期范围 效果图 <a-date-pickerv-model"dateTime"format"YYYY-MM-DD":disabled-date"disabledDate"valueFormat"YYYY-MM-DD"placeholder"请选择日期"allowClear />methods:{//回放日期选取范围限制&…

nginx 搭理禅道

1.安装nginx。 2.安装禅道。 3.nginx 配置文件 location /zentao/ { proxy_pass http://192.168.100.66/zentao/;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_set_header X-F…

论文解读StyleGAN系列——StyleGANv3

论文&#xff1a;Alias-Free Generative Adversarial Networks&#xff08;2021.06&#xff09; 作者&#xff1a;Tero Karras, Miika Aittala, Samuli Laine, Erik Hrknen, Janne Hellsten, Jaakko Lehtinen, Timo Aila 链接&#xff1a;https://arxiv.org/abs/2106.12423 代码…

高效使用 Guzzle:POST 请求与请求体参数的最佳实践

介绍 在现代爬虫技术中&#xff0c;高效发送 HTTP 请求并处理响应数据是关键步骤之一。Guzzle 是一个强大的 PHP HTTP 客户端&#xff0c;广泛应用于发送同步和异步请求。本文将介绍如何使用 Guzzle 发送 POST 请求&#xff0c;特别是如何传递请求体参数&#xff0c;并结合代理…

Windows 网络发现是什么意思?如何启用?

什么是 Windows 网络发现 Windows 网络发现是一项使计算机能够在本地网络中发现并与其他设备通信的功能。通过网络发现&#xff0c;用户可以在网络上轻松找到和访问其他计算机、打印机和共享资源。这对于家庭网络和小型办公室环境尤为重要&#xff0c;因为它简化了设备互联和资…

【RAG检索增强生成】MaxKB:构建企业级知识库问答系统(Ollama+Qwen2)

目录 引言1、MaxKB概述1.1 定义与目标1.2 特点与优势 2、MaxKB原理3、MaxKB架构4、基于MaxKBOllamaQwen2搭建本地知识库4.1 环境准备4.2 部署MaxKB4.3 部署Ollama4.4 部署运行qwen24.5 知识库配置4.5.1登录 MaxKB 系统4.5.2上传文档4.5.3设置分段规则 4.6 模型配置4.7 创建应用…