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

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' 被解释为模式字母,用来表示日期或时间字符串元素。文本可以使用单引号 (') 引起来,以免进行解释。"''" 表示单引号。所有其他字符均不解释;只是在格式化时将它们简单复制到输出字符串,或者在解析时与输入字符串进行匹配。

日期时间元素

字母日期或时间元素表示示例
GEra 标志符TextAD
yYear1996; 96
M年中的月份MonthJuly; Jul; 07
w年中的周数Number27
W月份中的周数Number2
D年中的天数Number189
d月份中的天数Number10
F月份中的星期Number2
E星期中的天数TextTuesday; Tue
aAm/pm 标记TextPM
H一天中的小时数(0-23)Number0
k一天中的小时数(1-24)Number24
Kam/pm 中的小时数(0-11)Number0
ham/pm 中的小时数(1-12)Number12
m小时中的分钟数Number30
s分钟中的秒数Number55
S毫秒数Number978
z时区General time zonePacific 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类是一个抽象类,它为特定瞬间与一组诸如 YEARMONTHDAY_OF_MONTHHOUR日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。瞬间可用毫秒值来表示,它是距历元(即格林威治标准时间 1970 年 1 月 1 日的 00:00:00.000,格里高利历)的偏移量。与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。CalendargetInstance 方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:Calendar calendar = Calendar.getInstance();Calendar 对象能够生成为特定语言和日历风格实现日期-时间格式化所需的所有日历字段值,

常用字段摘要

static intDATE
getset 的字段数字,指示一个月中的某天。
static intDAY_OF_MONTH
getset 的字段数字,指示一个月中的某天。
static intDAY_OF_WEEK
getset 的字段数字,指示一个星期中的某天。
static intDAY_OF_WEEK_IN_MONTH
getset 的字段数字,指示当前月中的第几个星期。
static intDAY_OF_YEAR
getset 的字段数字,指示当前年中的天数。
static intHOUR
getset 的字段数字,指示上午或下午的小时。
static intHOUR_OF_DAY
getset 的字段数字,指示一天中的小时。
static intMONTH
指示月份的 getset 的字段数字。
static intSECOND
getset 的字段数字,指示一分钟中的秒。
protected longtime
日历的当前设置时间,以毫秒为单位,表示自格林威治标准时间 1970 年 1月 1 日 0:00:00 后经过的时间。
static intWEEK_OF_MONTH
getset 的字段数字,指示当前月中的星期数。
static intWEEK_OF_YEAR
getset 的字段数字,指示当前年中的星期数。
static intYEAR
指示年的 getset 的字段数字。

构造方法

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

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

zone--要使用的时区

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

常用方法

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

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+"日");

    }
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

double_lifly

点喜欢就是最好的打赏!!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值