今天的博客主题
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:后期补充一个完整的时间操作工具类