System.currentTimeMillis()
获取1970年1月1日 00时00分00秒 000毫秒(定义为时间原点) 到当前的毫秒数.返回 long类型的数值,可以先后定义两个值,获取程序运行前和运行后的毫秒时间数,简单相减就可以计算程序段的运行时间
Date类,java.util.Date
两个构造方法,Date调用的还是System.currentTimeMillis()方法
public Date()返回当前时间
public Date(long date)返回从1970年1月1日 8时00分00秒 000毫秒加上传入的毫秒数 所能得到的时间
getTime()方法,返回Date对象偏离时间原点的毫秒数.
//无参构造方法,创建当前时间的Date对象
Date d1 = new Date();
System.out.println(d1);
//传入long类型的毫秒数,创建偏离时间原点的Date对象
Date d2 = new Date(3600000L);
System.out.println("偏离距时间原点1小时后的时间" + d2);
//传入long类型的0L,创建时间原点的日期对象
Date d3 = new Date(0L);
System.out.println("时间原点" + d3);
out:
Tue Nov 13 15:19:06 CST 2018
偏离距时间原点1小时后的时间Thu Jan 01 09:00:00 CST 1970
时间原点Thu Jan 01 08:00:00 CST 1970
分析,为什么打印出的时间原点是8点而不是0点,因为中国电脑时区设置为东8区
[点击并拖拽以移动]
SimpleDateFormat类,java.text.SimpleDateFormat
构造方法
public SimpleDateFormat() {
//无参构造方法
this("", Locale.getDefault(Locale.Category.FORMAT));
applyPatternImpl(LocaleProviderAdapter.getResourceBundleBased().getLocaleResources(locale)
.getDateTimePattern(SHORT, SHORT, calendar));
}
public SimpleDateFormat(String pattern)
{
//有参构造方法,传入要格式化成的形式比如"yyyy-MM-dd hh-mm-ss SSS"
this(pattern, Locale.getDefault(Locale.Category.FORMAT));
}
有参构造方法如果后面要用到parse(String str)函数解析日期字符串,那传入的参数必须和日期字符串格式相同,否则报错
如果不用解析日期字符串,只对Date对象操作,构造方法中的格式只要正确即可
日期格式可以自定义
yyyy代表年
MM代表月
dd代表日
hh代表小时12小时制,HH代表24小时制
mm代表分钟
ss代表秒
SSS代表三位毫秒,也可以是多位
format(Date date)方法可以将传入的日期对象转换为指定的形式,返回字符串类型,如下
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");
Date d4 = new Date();
System.out.println(d4);//Tue Nov 13 13:36:51 CST 2018
String datenow4 = sd.format(d4);
System.out.println(datenow4);//2018-11-13 13:36:51 299
parse(String str)可以将字符串类型的日期转换成Date类型,返回Date类型,但Date类型的格式是外国国家那种样式的
public class DateTest02 {
public static void main(String[] args) {
//定义字符串类型日期
String s1 = "2019-12-9 3:15:24";
// 解析字符串类型日期时,格式必须与字符串类型格式一样,否则报错
SimpleDateFormat sd1 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
// parse函数解析字符串格式的日期,要处理异常,抛出或者捕获,返回的日期是外国国家的形式
Date s1date = new Date();// 要先初始化,否则try语句没赋值后面就不能调用,会报错
try {
s1date = sd1.parse(s1);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(s1date);
// 可以通过format格式化成自己要的样式
String s1dateStr = sd1.format(s1date);
System.out.println(s1dateStr);
}
}
out:
Mon Dec 09 03:15:24 CST 2019
2019-12-09 03:15:24
Calendar类 java.util.Calendar,抽象类,提供操作日期的方法
getInstance()
静态方法 该方法返回Calendar类的子类对象,Calendar是抽象类不能创建对象,Canledar有很多子类,因为不同国家和地区有不同的日历算法,jdk中Calendar类的getInstance方法源码如下:
/**
* Gets a calendar using the default time zone and locale. The
* <code>Calendar</code> returned is based on the current time
* in the default time zone with the default locale.
*
* @return a Calendar.
*/
public static Calendar getInstance()
{
Calendar cal = createCalendar(TimeZone.getDefaultRef(), Locale.getDefault(Locale.Category.FORMAT));
cal.sharedZone = true;
return cal;
}
get()
成员方法,接收Calendar类的YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE、SECOND等日历字段
getTime()
向Date类转换
public class CalendarTest01 {
public static void main(String[] args) {
//获取Calendar的子类对象
Calendar c1 = Calendar.getInstance();
//转换成日期类
Date date = c1.getTime();
System.out.println(date);
//创建格式化日期对象,传入格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//格式化日期,返回字符串类型
String datenow = sdf.format(date);
System.out.println(datenow);
//返回今天是当前月的第几天
int i = c1.get(Calendar.DAY_OF_MONTH);
System.out.println(i);
//返回今天是这周的第几天,按照西方国家来算,周日是第一天
int j = c1.get(Calendar.DAY_OF_WEEK);
System.out.println(j);
}
}
out:
Tue Nov 13 14:25:36 CST 2018
2018-11-13 02:25:36
13
3
setTime(Date date)设置Calendar实例为给定日期
add()
set()
Calendar类包含了处理日期的很多方法,有时间再补上
例子:
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
//编写代码获取2008年8月8日是星期几?
public class DateTest03 {
public static void main(String[] args) {
//创建字符串日期
String strDate = "2008年8月8日";
//创建Data对象
Date date = new Date();
//创建格式化对象
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");
//得到Calendar子类对象
Calendar c1 = Calendar.getInstance();
try {
//将字符串日期格式化成Date类型
date = sdf.parse(strDate);
} catch (ParseException e) {
e.printStackTrace();
}
//给Calendar子类对象设置时间
c1.setTime(date);
//返回设置的时间是周几
int i = c1.get(Calendar.DAY_OF_WEEK);
System.out.println(i);//6,星期五,按照第一天是周日来算的
}
}
out:
6
//算一下你来到这个世界多少天
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateTest04 {
public static void main(String[] args) {
// 获取当前时间,以毫秒来计算
Date now = new Date();
//设置生日字符串
String birth = "1992-01-20";
Date birthdat = new Date();
//创建格式化对象,传入字符串格式要和上面的生日字符串格式一致
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
try {
//解析生日字符串返回Date类型
birthdat = sd.parse(birth);
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//获取当前日期偏离1970-1-1的毫秒数
long nowmillionSeconds = now.getTime();
//获取生日日期偏离1970-1-1的毫秒数
long birthmillionSeconds = birthdat.getTime();
long time = nowmillionSeconds - birthmillionSeconds;
//除以每天的毫秒数得到两者相距天数
System.out.println(time / 24 / 60 / 60 / 1000);
}
}