处理时间的类 —— System类Date类 SimpleDateFormat类 与 Calendar类

Posted codderyouzg

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了处理时间的类 —— System类Date类 SimpleDateFormat类 与 Calendar类相关的知识,希望对你有一定的参考价值。

在我们以往的编程中,就有过通过运行前和运行后时间差来判断时间复杂度的例子,再扯得远一点,我们在C语言中制造随机数的操作,也要用到有关时间的函数。而且,在我们未来的编程中,也会时不时要用到能够读取当前时间的方法,所以,本篇博文所讲解的类,其实还是挺常用的,所以本人专门写一篇博文来为同学们展示下这个类的常用方法的用法

System类:

概述
System 类包含一些有用的类字段和方法。它不能被实例化

说真的,System类与时间相关的主要原因就是它的一个方法,那么,现在,本人来展示下这个类的常用API吧:

  • public static void gc()
    调用垃圾回收器
  • public static void exit(int status)
    退出java虚拟机 0 为正常退出 非0为 异常退出
  • public static long currentTimeMillis()
    获取当前时间的毫秒值

至于控制台的 录入和输出 本人就不在这里描述了,想必大家都清楚。
那么,本人在这里就不啰嗦了。

下面本人就来介绍真正用于处理时间的两个类——Date类 、SimpleDateFormat类 与 Calendar类:

Date类:

概述:
类 Date 表示特定的瞬间,精确到毫秒

首先,本人来展示下构造方法

  • public Date()
  • public Date(long date)
    把一个long类型的毫秒值转换成一个日期对象

这个类我们主要运用它的两个方法 —— getTime() 与 setTime(long time):

  • public long getTime():
    获取一个日期对象对象毫秒值
  • public void setTime(long time):
    给一个日期对象设置上指定的毫秒值 例:date.setTime(1000 * 60 * 60) ;

接下来就是 SimpleDateFormat类

SimpleDateFormat类:

概述:
可以把一个日期对象格式化成一个文本(字符串) ,
也可以把一个日期字符串解析成一个日期对象

构造方法:

  • public SimpleDateFormat():
    使用默认的模式来创建一个SimpleDateFormat对象
  • public SimpleDateFormat(String pattern):
    使用指定的模式(规则比如yyyy:MM:dd HH:mm:ss)来创建一个SimpleDateFormat对象

规则的定义:

  • y ======== 年
  • M ======== 月
  • d ======== 天
  • H ======== 时
  • m ======== 分
  • s ======== 秒

成员方法:

  • public String format(Date date):
    把一个日期对象格式化成一个字符串
  • public Date parse(String dateStr):
    把一个日期字符串解析成一个日期对象 注意要以指定格式解析

接下来就是本篇博文中最为重要的 Calendar类

Calendar类:

成员方法:

  • static Calendar getInstance()
    使用默认时区和语言环境获得一个日历。
  • static Calendar getInstance(Locale aLocale)
    使用默认时区和指定语言环境获得一个日历。
  • static Calendar getInstance(TimeZone zone)
    使用指定时区和默认语言环境获得一个日历。
  • static Calendar getInstance(TimeZone zone, Locale aLocale)
    使用指定时区和语言环境获得一个日历。
  • public void add(int field,int amount)
    根据日历的规则,为给定的日历字段添加或减去指定的时间量
  • public final void set(int year,int month,int date)
    设置日历时间 年月日
  • boolean after(Object when)
    判断此 Calendar 表示的时间是否在指定 Object 表示的时间之后,返回判断结果。
  • boolean before(Object when)
    判断此 Calendar 表示的时间是否在指定 Object 表示的时间之前,返回判断结果。
  • void clear()
    将此 Calendar 的所日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义。
  • void clear(int field)
    将此 Calendar 的给定日历字段值和时间值(从历元至现在的毫秒偏移量)设置成未定义。
  • Object clone()
    创建并返回此对象的一个副本。
  • int compareTo(Calendar anotherCalendar)
    比较两个 Calendar 对象表示的时间值(从历元至现在的毫秒偏移量)。
  • protected void complete()
    填充日历字段中所有未设置的字段。
  • protected abstract void computeFields()
    将当前毫秒时间值 time 转换为 fields[] 中的日历字段值。
  • protected abstract void computeTime()
    将 fields[] 中的当前日历字段值转换为毫秒时间值 time。
  • boolean equals(Object obj)
    将此 Calendar 与指定 Object 比较。
  • int get(int field)
    返回给定日历字段的值。
  • int getActualMaximum(int field)
    给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值。
  • int getActualMinimum(int field)
    给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值。
  • static Locale[] getAvailableLocales()
    返回所有语言环境的数组,此类的 getInstance 方法可以为其返回本地化的实例。
  • String getDisplayName(int field, int style, Locale locale)
    返回给定 style 和 locale 下的日历 field 值的字符串表示形式。
  • Map<String,Integer> getDisplayNames(int field, int style, Locale locale)
    返回给定 style 和 locale 下包含日历 field 所有名称的 Map 及其相应字段值。
  • int getFirstDayOfWeek()
    获取一星期的第一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY。
  • abstract int getGreatestMinimum(int field)
    返回此 Calendar 实例给定日历字段的最高的最小值。
  • abstract int getLeastMaximum(int field)
    返回此 Calendar 实例给定日历字段的最低的最大值。
  • abstract int getMaximum(int field)
    返回此 Calendar 实例给定日历字段的最大值。
  • int getMinimalDaysInFirstWeek()
    获取一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则此方法将返回 1。
  • abstract int getMinimum(int field)
    返回此 Calendar 实例给定日历字段的最小值。
  • Date getTime()
    返回一个表示此 Calendar 时间值(从历元至现在的毫秒偏移量)的 Date 对象。
  • long getTimeInMillis()
    返回此 Calendar 的时间值,以毫秒为单位。
  • TimeZone getTimeZone()
    获得时区。
  • int hashCode()
    返回该此日历的哈希码。
  • protected int internalGet(int field)
    返回给定日历字段的值。
  • boolean isLenient()
    判断日期/时间的解释是否为宽松的。
  • boolean isSet(int field)
    确定给定日历字段是否已经设置了一个值,其中包括因为调用 get 方法触发内部字段计算而导致已经设置该值的情况。
  • abstract void roll(int field, boolean up)
    在给定的时间字段上添加或减去(上/下)单个时间单元,不更改更大的字段。
  • void roll(int field, int amount)
    向指定日历字段添加指定(有符号的)时间量,不更改更大的字段。
  • void set(int field, int value)
    将给定的日历字段设置为给定值。
  • void set(int year, int month, int date, int hourOfDay, int minute)
    设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
  • void set(int year, int month, int date, int hourOfDay, int minute, int second)
    设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。
  • void setFirstDayOfWeek(int value)
    设置一星期的第一天是哪一天;例如,在美国,这一天是 SUNDAY,而在法国,这一天是 MONDAY。
  • void setLenient(boolean lenient)
    指定日期/时间解释是否是宽松的。
  • void setMinimalDaysInFirstWeek(int value)
    设置一年中第一个星期所需的最少天数,例如,如果定义第一个星期包含一年第一个月的第一天,则使用值 1 调用此方法。
  • void setTime(Date date)
    使用给定的 Date 设置此 Calendar 的时间。
  • void setTimeInMillis(long millis)
    用给定的 long 值设置此 Calendar 的当前时间值。
  • void setTimeZone(TimeZone value)
    使用给定的时区值来设置时区。
  • String toString()
    返回此日历的字符串表示形式。

那么,这个类,本人打算主要通过代码来进行讲解:
在本篇博文中,本人打算讲解日历类的三种用法:

我们现在来展示第一种显示时间的 步骤:

package com.mec.study;

import java.util.Calendar;

public class AboutCalendar {

    public static void main(String[] args) {
        //给today申请空间,并将其成员赋值为当前时间
        Calendar today = Calendar.getInstance();
        //这个数组就是本人在《数据结构与算法》专栏中多次讲到的,可以替代多重if-elseif语句的算法
        String week[] = {"日",  "一", "二", "三", "四", "五", "六"};
        
        int year = today.get(Calendar.YEAR);
        int month = today.get(Calendar.MONTH);
        int date = today.get(Calendar.DATE);
        int hour = today.get(Calendar.HOUR_OF_DAY) ;
        int minute = today.get(Calendar.MINUTE);
        int second = today.get(Calendar.SECOND);
        int day = today.get(Calendar.DAY_OF_WEEK);
        
        //这里要提醒的两点是:1.月份是按照从0开始记录的,所以我们在输出时要“加一”
        //                  2.周内天数从1开始,并且默认周日是第一天
        System.out.println("现在本机时间为:" + year + "年" + (month+1) + "月" + date + "日 的" + hour + "时" + minute + "分" + second + "秒" + " 周" + week[day-1]);
    }

}

技术图片

可以看到,我们通过代码显示的时间 和 Eclipse自动显示的时间一模一样,可见,我们的代码是正确的。

那么,现在我们来展示第二种显示时间 的步骤:

package com.mec.study;

import java.text.SimpleDateFormat;

import java.util.Calendar;

public class AboutCalendar {

    public static void main(String[] args) {
        Calendar today = Calendar.getInstance();
        
        //这里的 SimpleDateFormat类 可以用来取代Calendar类,但是操作略有不同
        //若我们年前写的是两个y,则输出的将是19(因为现在是2019年),月前M必须大写,以便和分钟的m区别开
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd - HH:mm:ss");
        String s =sdf.format(today.getTime());
        
        System.out.println(s);
    }

}

技术图片可以看到,我们通过代码显示的时间 和 Eclipse自动显示的时间一模一样,可见,我们的代码是正确的。

现在,本人来展示第三种用途:
例如,我们现在想知道某一年某一个月最多有多少天:

package com.mec.study;

import java.text.SimpleDateFormat;

import java.util.Calendar;

public class AboutCalendar {

    public static void main(String[] args) {
        Calendar today = Calendar.getInstance();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd - HH:mm:ss");

        today.set(2020, 2, 0);
        int maxDate = today.get(Calendar.DATE);
        System.out.println(maxDate);    
    }

}

技术图片我拿2020年2月进行测试,录入年份为2020,月份为3月(之前说过,月份从0开始记录),日期记为0。
等等,之前不是说日期是从1开始记的吗?
对,没错,就是从1开始记录,而我们现在访问它3月的第0天,就相当于访问它2月的最后一天!!!
我们正是可以通过这个方法来得到某年某月的最高天数(这点在我们之后代码中与泛类的联合应用中的作用会显著体现)

就像本人前几篇博文说的一样,Java给我们提供给的类的方法是非常多的,本人就不一 一进行讲解了,还是那句话:师傅领进门,修行在个人。加油吧,同学们!

以上是关于处理时间的类 —— System类Date类 SimpleDateFormat类 与 Calendar类的主要内容,如果未能解决你的问题,请参考以下文章

JavaDate类

JavaDate类

JavaDate类

slz-关于Date类

常用类 System Date Math Pattern

date在java中用啥类型