今天的博客主题

       Java常用类 ——》Date相关


Date

Date 表示特定的瞬间,精确到毫秒。

在JDK1.1的时候就出现了。提供了许多针对时间日期操作的方法。

java.util包下的时间操作对象。

 

部分源码

public class Date implements java.io.Serializable, Cloneable, Comparable<Date> {
    /**
     * Allocates a <code>Date</code> object and initializes it so that
     * it represents the time at which it was allocated, measured to the
     * nearest millisecond.
     *
     * @see java.lang.System#currentTimeMillis()
     */
    public Date() {
        this(System.currentTimeMillis());
    }

    /**
     * Allocates a <code>Date</code> object and initializes it to
     * represent the specified number of milliseconds since the
     * standard base time known as "the epoch", namely January 1,
     * 1970, 00:00:00 GMT.
     *
     * @param date the milliseconds since January 1, 1970, 00:00:00 GMT.
     * @see java.lang.System#currentTimeMillis()
     */
    public Date(long date) {
        fastTime = date;
    }
}

其余的方法都忽略了,主要看下Date类里的两个构造函数。

第一个构造器是一个无参构造器,通过调用System的currentTimeMillis()方法来获取系统当前时间的时间戳,这个时间戳是从1970年到当前时间的毫秒级数据。

第二个构造器是将一个毫秒级的数据定义为Date格式的日期。

第一个构造器调用了第二个构造器

 

代码示例

public class DateDemo {
    public static void main(String[] args) {
        //使用Date类需要 import java.util.Date; 导入这个包才可以使用
        //通过new关键创建date对象
        Date date = new Date();

        //输出系统当前时间
        System.out.println(date);
        //输出1970-1-1 00:00:00到现在这个时间所过的毫秒数
        System.out.println(date.getTime());

        // 将毫秒级数据转换为Date格式日期
        Date date2 = new Date(1550847957698L);
        System.out.println(date2);

        //获取当前年份,年份是从1900年之后开始算的
        int year = date.getYear();
        System.out.print("今天是");
        System.out.print(1900 + year);
        System.out.print("年");

        //获取当前月份,月份默认从0开始
        int month = date.getMonth();
        System.out.print(1 + month);
        System.out.print("月");

        //获取当前几号
        int date1 = date.getDate();
        System.out.print(date1 + "号" );

        //获取当前星期几
        int day = date.getDay();
        System.out.println("星期" + day);

        //获取当前时间小时
        int hours = date.getHours();
        System.out.print("北京时间" + hours + "点");

        //获取当前时间分钟
        int minutes = date.getMinutes();
        System.out.print(minutes + "分");

        //获取当前时间秒
        int seconds = date.getSeconds();
        System.out.print(seconds + "秒");
    }
}
输出结果:
Fri Feb 22 23:06:13 CST 2019
1550847973189
Fri Feb 22 23:05:57 CST 2019
今天是2019年2月22号星期5
北京时间23点06分13秒

Date类型的时间格式是英文格式。可读性教差。

 

SimpleDateFormat

日期格式之间的转换。转换成大家经常熟知的那种时间格式(2020-03-10 22:22:22)

把Date类型格式的转成String字符串类型格式的。

public class DateDemo {
    public static void main(String[] args) {
        // 通过new关键创建date对象
        Date date = new Date();
        System.out.println("转换前:" + date);

        // 需要 import java.text.SimpleDateFormat; 这个包才可以使用
        // 时间格式转换类
        SimpleDateFormat sdf = new SimpleDateFormat();
        String format = sdf.format(date);
        System.out.println("转换后:" + format);
    }
}
输出结果:
转换前:Tue Mar 12 21:56:48 CST 2020
转换后:20-3-12 下午09:56

转换后的格式,怎么是这样子的了呢?

SimpleDateFormat对象提供了两个构造函数,一个有参一个无参。

刚才我们调用的是无参的构造方法。

在这个无参的构造方法上有官方注释描述:大概说是使用默认格式和日期符号

有参构造方法上注释说,可以指定的时间格式和日期符号

YYYY/yyyy 代表4位数年份 2019
yy 代表2位数的年份 2019
MM 代表月份 02
MMM 代表汉语月份 二月
dd 代表几号 22
hh  代表小时(12小时制) 01-12
HH 代表小时(24小时制) 00-23
mm 代表分钟 00-59
ss 代表秒 00-59
SS/SSS 代表毫秒 000-999

// 时间格式之间可用 /、-、*、:、空格、汉字 进行分割
例如:yyyy-MM-dd HH:mm:ss

加上日期格式,在看一下

public class DateDemo {
    public static void main(String[] args) {
        //通过new关键创建date对象
        Date date = new Date();
        System.out.println("转换前:" + date);

        //需要 import java.text.SimpleDateFormat; 这个包才可以使用
        //时间转换类
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss:SSS");
        String format = sdf.format(date);
        System.out.println("转换后:" + format);
    }
}
输出结果:
转换前:Tue Mar 12 22:01:54 CST 2020
转换后:2020-03-12 22:01:54:352

这样看起来就好看多了。

 

LocalDate & LocalTime & LocalDateTime

这些都是在JDK1.8之后新推出的时间操作对象。

 

LocalDate 获取 年-月-日

public static void main(String[] args) {
    LocalDate localDate = LocalDate.now();
    System.out.println(localDate);
    System.out.printf(localDate.getYear() + "年");
    System.out.printf(localDate.getMonth() + "月");
    System.out.printf(localDate.getDayOfMonth() + "日");
    System.out.printf(" 星期" + localDate.getDayOfWeek());
    System.out.println();
    System.out.printf( localDate.get(ChronoField.YEAR) + "年");
    System.out.printf( localDate.get(ChronoField.MONTH_OF_YEAR) + "月");
    System.out.printf( localDate.get(ChronoField.DAY_OF_MONTH) + "日");
    System.out.printf( " 星期" + localDate.get(ChronoField.DAY_OF_WEEK));
}
// 输出
2020-03-12
2020年MARCH月12日 星期THURSDAY
2020年3月12日 星期4

LocalTime 获取 时-分-秒-毫秒

public static void main(String[] args) {
    LocalTime localTime = LocalTime.now();
    System.out.println(localTime);
    System.out.printf(localTime.getHour() + "时");
    System.out.printf(localTime.getMinute() + "分");
    System.out.printf(localTime.getSecond() + "秒");
    System.out.println();
    System.out.printf(localTime.get(ChronoField.HOUR_OF_DAY) + "时");
    System.out.printf(localTime.get(ChronoField.MINUTE_OF_HOUR) + "分");
    System.out.printf(localTime.get(ChronoField.SECOND_OF_MINUTE) + "秒");
}
// 输出
22:40:30.881
22时40分30秒
22时40分30秒

LocalDateTime 获取 年-月-日-时-分-秒

就是 LocalDate + LocalTime

public static void main(String[] args) {
    LocalDateTime localDateTimeo = LocalDateTime.now();
    System.out.println(localDateTimeo);
}
// 输出
2020-03-12T22:42:52.073

获取单独的时间字段方法都是一样的。Date对象同样可以实现,但方法都以弃用。

LocalDateTime是不可变的,它线程是安全的。

以后日期时间首选使用 LocalDateTime


Calendar & GregorianCalendar

Calendar类是一个抽象类,它提供了一些方法,用于在特定的时间瞬间与一组日历字段(如年、月、月、日、小时等)之间进行转换,以及用于处理日历字段(如获取下一周的日期)。时间上的一瞬间可以用毫秒值表示,该值是从1970年1月1日00:00:00.000 GMT 开始。

该类还为实现包范围外的具体日历系统提供了其他字段和方法。

这些字段和方法被定义为 protected。

与其他语言环境敏感类一样,Calendar 提供了一个类方法 getInstance,以获得此类型的一个通用的对象。Calendar的getInstance()方法返回一个 Calendar 对象,其日历字段已由当前日期和时间初始化:Calendar rightNow = Calendar.getInstance();

Calendar 对象的方法会生成所有日历字段值,为特定语言和日历风格,实现不同的日期-时间格式化

 

GregorianCalendar 类继承了 Calendar。提供了世界上大多数国家使用的标准日历系统。

 

Calendar calendar = new GregorianCalendar();
calendar.setTime(new Date());
// 具体日期字段
System.out.println("ERA: " + calendar.get(Calendar.ERA));
System.out.println("YEAR: " + calendar.get(Calendar.YEAR));
System.out.println("MONTH: " + calendar.get(Calendar.MONTH));
System.out.println("WEEK_OF_YEAR: " + calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("WEEK_OF_MONTH: " + calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("DATE: " + calendar.get(Calendar.DATE));
System.out.println("DAY_OF_MONTH: " + calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("DAY_OF_WEEK: " + calendar.get(Calendar.DAY_OF_WEEK));
System.out.println("DAY_OF_WEEK_IN_MONTH: " + calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));
System.out.println("AM_PM: " + calendar.get(Calendar.AM_PM));
System.out.println("MILLISECOND: " + calendar.get(Calendar.MILLISECOND));
System.out.println("ZONE_OFFSET: "+ (calendar.get(Calendar.ZONE_OFFSET)/(60*60*1000)));
System.out.println("DST_OFFSET: "+ (calendar.get(Calendar.DST_OFFSET)/(60*60*1000)));

一般主要做一些日期的加减计算。

比如:获取3天后的日期。获取某个时间是星期几。获取指定日期前一天的日期。获取指定日期后一天的日期等等这些都可以操作


TODO:后期补充一个完整的时间操作工具类