java基础(11)(时间,日期,日历详解以及他们之间的转换)

本文详细介绍了Java中Date、SimpleDateFormat和Calendar类的使用,包括它们的构造方法、常用方法及其实例。Date类表示特定时间点,SimpleDateFormat用于日期和时间的格式化和解析,而Calendar类则提供了日期和时间的抽象操作。文章通过实例展示了如何进行日期的格式化、解析、时间戳转换以及日历字段的操作。
摘要由CSDN通过智能技术生成

Date类
简介

    Date类是java.util包下的类,继承父类java.lang.Object,已实现的的接口有Serializable,Cloneable,Comparable<Date>

如下图

    直接已知子类有Date,Time,Timestamp。类Date表示特定的瞬间,精确到毫秒。在 JDK 1.1 之前,类 Date 有两个其他的函数。它允许把日期解释为年、月、日、小时、分钟和秒值。它也允许格式化和解析日期字符串。不过,这些函数的 API 不易于实现国际化。从 JDK 1.1 开始,应该使用 Calendar 类实现日期和时间字段之间转换,使用 DateFormat 类来格式化和解析日期字符串。Date 中的相应方法已废弃。

Date()类构造方法

    Date()类中的构造方法好多都已过时,到现在只有两个构造方法还能使用,分别为:

    Date()无参构造:分配Date对象并初始化此对象,以表示分配它的时间(精确到毫秒);

    Date(long date);有参构造:分配Date并初始化此对象,以表示自从标准基准时间(成为“历元(epoch)”,即1970年1月1日00:00:00 GMT)以来的指定毫秒数

    以下是API中,Date有参,无参构造的定义

Date()类构造方法的简单实用

    /**
     * @Describe
     * @Author Double LiFly
     * @date 2021/4/21 19:04
     */
    public class DateTest {
        public static void main(String[] args) {
            //通过无参构造来创建对象
            Date date = new Date();
            System.out.println(date);
            //调用getTime()方法显示当前时间距离1970-01-01 00:00:00的时间戳
            long time = date.getTime();
            System.out.println(time);
            //通过有参构造来创建对象
            Date date1 = new Date(time);
            System.out.println(date1);
        }
    }

Date()类的常用方法

        getTime
        public long getTime()
        返回自 1970 年 1 月 1 日 00:00:00 GMT 以来此 Date 对象表示的毫秒数。
         
        setTime
        public void setTime(long time)
        设置此 Date 对象,以表示 1970 年 1 月 1 日 00:00:00 GMT 以后 time 毫秒的时间点。
        参数:time - 毫秒数。

Date()类的常用方法的简单实用

            //无参构造创建对象
            Date date = new Date();
            //调用getTime()方法显示当前时间距离1970-01-01 00:00:00的时间戳
            System.out.println(date.getTime());
            //输出1970年距今的年份
            System.out.println(date.getTime()*1.0/1000/60/60/24/365+"年");
            //long time = 1000*60*60;
            //获取系统当前时间,单位是毫秒值
            long time = System.currentTimeMillis();
            date.setTime(time);
            System.out.println(date);

SimpleDateFormat类
简介

    simpleDateFormat继承DateFormat类,实现了Serializable,Cloneable接口;而DateFormat是日期/时间格式化子类的一个抽象类,它以与语言无关的方式格式化并解析日期或时间。日期/时间格式化子类(如 SimpleDateFormat)允许进行格式化(也就是日期 -> 文本)、解析(文本-> 日期)和标准化。将日期表示为 Date 对象,或者表示为从 GMT(格林尼治标准时间)1970 年 1 月 1 日 00:00:00 这一刻开始的毫秒数。但是SimpleDateFormat是其直接子类,用它来格式化和解析日期的具体类。它允许进行格式化(日期 -> 文本)、解析(文本 -> 日期)和规范化。

日期和时间模式

    日期和时间格式由日期和时间模式 字符串指定。在日期和时间模式字符串中,未加引号的字母 'A' 到 'Z' 和 'a' 到 'z' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

日期时间元素

    字母    日期或时间元素    表示    示例
    G    Era 标志符    Text    AD
    y    年    Year    1996; 96
    M    年中的月份    Month    July; Jul; 07
    w    年中的周数    Number    27
    W    月份中的周数    Number    2
    D    年中的天数    Number    189
    d    月份中的天数    Number    10
    F    月份中的星期    Number    2
    E    星期中的天数    Text    Tuesday; Tue
    a    Am/pm 标记    Text    PM
    H    一天中的小时数(0-23)    Number    0
    k    一天中的小时数(1-24)    Number    24
    K    am/pm 中的小时数(0-11)    Number    0
    h    am/pm 中的小时数(1-12)    Number    12
    m    小时中的分钟数    Number    30
    s    分钟中的秒数    Number    55
    S    毫秒数    Number    978
    z    时区    General time zone    Pacific Standard Time; PST; GMT-08:00
    Z    时区    RFC 822 time zone    -0800

    日期格式是不同步的。建议为每个线程创建独立的格式实例。如果多个线程同时访问一个格式,则它必须是外部同步的。

SimpleDateFormat常用构造方法

SimpleDateFormat()
用默认的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。

 
SimpleDateFormat(String pattern)
用给定的模式和默认语言环境的日期格式符号构造 SimpleDateFormat。

SimpleDateFormat格式化和解析日期

    将日期格式化为日期、时间字符串

    从给定字符串的开始解析文本以生成日期

SimpleDateFormat格式化和解析日期的简单实用

            //日期格式化成日期/时间字符串
            Date date = new Date();
            //SimpleDateFormat simpleDateFormat = new SimpleDateFormat();//无参构造
            //SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
            String format = simpleDateFormat.format(date);
            System.out.println(format);
            System.out.println("%%%%%%%%%%%%%%%%%%%%");
     
            //定字符串的开始解析文本以生成日期
            //已知日期字符串:"2015-10-20",将该日期字符串转换为日期对象
            String str = "2015-10-20";
            SimpleDateFormat simpleDateFormat1 = new SimpleDateFormat("yyyy-MM-dd");
            Date date1 = simpleDateFormat1.parse(str);
            System.out.println(date1);

calendar类
简介

    calendar类直接继承java.lang.Object类,实现了Serializable,Cloneable,Comparable<Calendar>接口,其直接子类为GregorianCalendar;

    Calendar类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar 的 getInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:Calendar calendar = Calendar.getInstance();Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,

常用字段摘要


static int    DATE
get 和 set 的字段数字,指示一个月中的某天。
static int    DAY_OF_MONTH
get 和 set 的字段数字,指示一个月中的某天。
static int    DAY_OF_WEEK
get 和 set 的字段数字,指示一个星期中的某天。
static int    DAY_OF_WEEK_IN_MONTH
get 和 set 的字段数字,指示当前月中的第几个星期。
static int    DAY_OF_YEAR
get 和 set 的字段数字,指示当前年中的天数。
static int    HOUR
get 和 set 的字段数字,指示上午或下午的小时。
static int    HOUR_OF_DAY
get 和 set 的字段数字,指示一天中的小时。
static int    MONTH
指示月份的 get 和 set 的字段数字。
static int    SECOND
get 和 set 的字段数字,指示一分钟中的秒。
protected long    time
日历的当前设置时间,以毫秒为单位,表示自格林威治标准时间 1970 年 1月 1 日 0:00:00 后经过的时间。
static int    WEEK_OF_MONTH
get 和 set 的字段数字,指示当前月中的星期数。
static int    WEEK_OF_YEAR
get 和 set 的字段数字,指示当前年中的星期数。
static int    YEAR
指示年的 get 和 set 的字段数字。


构造方法

    构造一个带有默认时区和语言环境的Calendar

    构造一个带有指定时区和语言环境的Calendar

    zone--要使用的时区

    zLocale--用于星期数据的语言环境

常用方法


abstract void    add(int field, int amount)
根据日历的规则,为给定的日历字段添加或减去指定的时间量。
int    get(int field)
返回给定日历字段的值。
static Calendar    getInstance()
使用默认时区和语言环境获得一个日历。
Date    getTime()
返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
void    set(int field, int value)
将给定的日历字段设置为给定值。
String    toString()
返回此日历的字符串表示形式。


Calendar方法练习

    /**
     * @Describe
     * @Author Double LiFly
     * @date 2021/4/20 14:58
     */
    public class Test0204 {
        public static void main(String[] args) throws ParseException {
            /**
             * 通过键盘录入日期字符串,格式(2021-04-21)
             *         如输入:2021-04-21,输出"2020年-04月-21日 是 星期二,是2021年的第 111 天"
             */
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入日期字符串(格式为:年-月-日): ");
            String str = scanner.nextLine();
           /* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            Date date = sdf.parse(str);*/
            Date date = parseDate(str);
     
            /*SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy年-MM月-dd日");
            String newDate = sdf1.format(date);
            System.out.println(newDate);*/
            //按格式输出日起对象
            String s = formatDate(date);
            //创建日历对象,将日期对象转换为日历对象
            Calendar calendar = Calendar.getInstance();
            calendar.setTime(date);
     
     
            int dayWeek = calendar.get(Calendar.DAY_OF_WEEK)+1;
            //获取的星期
            String weekDay = getWeek(dayWeek);
            //获取的是该年的第多少天
            int dayYear = calendar.get(Calendar.DAY_OF_YEAR);
            //获取该年份
            int year = calendar.get(Calendar.YEAR);
            System.out.println(s+" 是 "+weekDay+",是"+year+"年的第 "+dayYear+" 天");
        }
        /**
         * 解析字符串为日期对象
         * @param string
         * @return
         */
        public static Date parseDate(String string){
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
            Date date = null;
            try {
                date = simpleDateFormat.parse(string);
            } catch (ParseException e) {
                e.printStackTrace();
            }
            return date;
        }
     
        /**
         * 格式化字符串
         * @param date
         * @return
         */
        public static String formatDate(Date date){
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年-MM月-dd日");
            String newDate = simpleDateFormat.format(date);
            return newDate;
        }
     
     
        /**
         * 获取星期几
         * @param num
         * @return
         */
        public static String getWeek(int num){
            String weekDay = null;
            switch (num){
                //如输入:2015-10-20,输出"2015年-10月-20日 是 星期二,是2015年的第 293 天"
                case 1:
                    weekDay = "星期一";
                    break;
                case 2:
                    weekDay = "星期二";
                    break;
                case 3:
                    weekDay = "星期三";
                    break;
                case 4:
                    weekDay = "星期四";
                    break;
                case 5:
                    weekDay = "星期五";
                    break;
                case 6:
                    weekDay = "星期六";
                    break;
                case 7:
                    weekDay = "星期日";
                    break;
                    default:
                        System.out.println("获取日期有误!");
            }
            return weekDay;
        }
    }

时间,日期与日历之间的转换
当前时间转换为指定格式字符串

    /**
     * @Describe
     * @Author Double LiFly
     * @date 2021/4/21 8:25
     */
    public class 当前时间转换为指定格式 {
        public static void main(String[] args) {
            Date date = new Date();
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            String newDate = sdf.format(date);
            System.out.println(newDate);
        }
    }

日期与指定格式字符串的相互转换

    /**
     * @Describe
     * @Author Double LiFly
     * @date 2021/4/21 8:27
     */
    public class 日期与指定格式字符串的相互转换 {
        public static void main(String[] args) {
            //创建字符串日期
            String str = "2021-04-21";
            //创建日起对象并指定格式
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy年-MM月-dd日");
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
            try {
                //按指定格式解析字符串为日期
                Date newStr = sdf.parse(str);
                //日期转换为指定格式字符串
                String newDate = simpleDateFormat.format(newStr);
                System.out.println(newDate);
            } catch (ParseException e) {
                e.printStackTrace();
            }
        }
    }

当前时间转换为日历

    /**
     * @Describe
     * @Author Double LiFly
     * @date 2021/4/21 8:33
     */
    public class 当前时间转换为日历 {
        public static void main(String[] args) {
            //获取当前日期
            Date date = new Date();
            //创建日历对象,Calendar是一个抽象类,不能实例化对象,可以用Calendar中的方法来获取日历对象
            Calendar calendar = Calendar.getInstance();
            //将日期转换为日历
            calendar.setTime(date);
            //获取年
            int year = calendar.get(Calendar.YEAR);
            //获取月
            int month = calendar.get(Calendar.MONTH)+1;
            //获取日
            int day = calendar.get(Calendar.DATE);
            System.out.println(year+"年-"+month+"月-"+day+"日");
     
        }
    }

日历转换为日期

    /**
     * @Describe
     * @Author Double LiFly
     * @date 2021/4/21 8:33
     */
    public class 当前时间转换为日历 {
        public static void main(String[] args) {
            //获取当前日期
            Date date = new Date();
            //创建日历对象,Calendar是一个抽象类,不能实例化对象,可以用Calendar中的方法来获取日历对象
            Calendar calendar = Calendar.getInstance();
            //将日期转换为日历
            calendar.setTime(date);
            //获取年
            int year = calendar.get(Calendar.YEAR);
            //获取月
            int month = calendar.get(Calendar.MONTH)+1;
            //获取日
            int day = calendar.get(Calendar.DATE);
            System.out.println(year+"年-"+month+"月-"+day+"日");
     
        }
    }


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值