今天来整理一下java中的日期类
1 时间原点的概念
八种基本数据类型包括字符串最终都可以以数字的方式表现出来(数据就是二进制,而二进制是可以转换成10进制的)
日期类型类似,2022年1,1,也可以用一个数字来代替
在日期中最特殊的数字其实也是0,0这个日期代表的就是java中时间的原点——》1970,1,1 8,0,0 1969全球发布了第一个unix系统,综合考虑就认为1970
凡是在这个0点的基础上,过一毫秒,意味着+1
2 创建日期对象
//当前时间
Date date=new Date();
System.out.println(date);//Wed Aug 28 14:39:16 CST 2019
//从原点过了100秒的时间
//1970 01 01 08:00:00 100
//1970 01 01 08:01:40 100
//1000毫秒=1秒 100000=100s
Date date2=new Date(100000);、//也就是从原点时间过了100000毫秒
System.out.println(date2);//Thu Jan 01 08:01:40 CST 1970
3 getTime的使用
getTime()返回一个long整型
这个数代表从197011800开始每过一毫秒就增加1
直接打印对象会出现这样的日期格式:Wed Aug 28 14:39:16 CST 2019
可是阅读性差,需要转换成数字,方便阅读,至于格式化后面会讲
Date now=new Date();
System.out.println(now);
//当前时间距离原点时间一共过了多少毫秒
System.out.println(now.getTime());
//1566974943085
//如果要得到原点
Date zero=new Date(0);
System.out.println(zero.getTime());
4 运行一段程序需要多少时间
//计算一段程序运行了好久时间
public class Damo4 {
public static void main(String[] args) {
Damo4 damo4=new Damo4();
damo4.forTest();
}
//观察一个程序执行多少时间
public long startTime() {
return new Date().getTime();
}
//10万次的for循环
public void forTest() {
long startTime=startTime();
int sum=0;
for(int i=1;i<100000;i++) {
sum+=i;
//new DateTest("name:"+i);
}
System.out.println(sum);
long endTime=endTime();
long result=endTime-startTime;
System.out.println(result);
}
public long endTime() {
return new Date().getTime();
}
}
5 System.currentTimeMills()
当前日期的毫秒数
理论上说getTime,currentTimeMills两个值应该是一样的,但是由于机器性能不相同,彼此相差几十毫秒,因为每一行代码实际上都需要时间来运行
public void show() {
int sum=0;
for(int i=1;i<100000;i++) {
sum+=i;
//new DateTest("name:"+i);
}
System.out.println(sum);
System.out.println(System.currentTimeMillis());
}
运行结果为:
704982704
1566994316913
6 日期格式化
6.1 日期格式化成字符串
//y year 年
//m month 月
//d day 日
//h hour 小时
//m minute 分钟
//s seconds 秒
//s milliseconds 毫秒
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SS");
Date now=new Date();
String nowStr=sdf.format(now);
System.out.println(nowStr);//2019-08-28 15:25:01 546
6.2 字符串格式化成日期
SimpleDateFormat sdf=new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
String str="2019/8/28 11:12:01";
try {
Date date=sdf.parse(str);//DateForamt.parset(str)
System.out.println(date);//Unparseable date: "2019/8/28 11:12:01"
//Wed Aug 28 11:12:01 CST 2019
} catch (ParseException e) {
e.printStackTrace();
}
注意:字符串转日期类的时候需要注意格式必须匹配到一起,否则可能会报异常
7 日历
通过日历类管理日期
日历最佳实践案例:翻日历
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;//util 工具
//需求:打印当前时间,下个月的今天,上个月的今天,去年的今天,上个月的第三天
public class TestDate01 {
//设定打印的时间格式
//simpledateformat
private static SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
public static void main(String[] args) {
//搞一个日历耍耍
Calendar c=Calendar.getInstance();
//获取今天
Date now=c.getTime();
print(now);//2019-08-28 16:26:54
//下个月的今天——每个月有固定的天数28 29 30 31
//我要把今天加入日历
c.setTime(now);
//翻日历
c.add(Calendar.MONTH,1);//下个月的今天 1 就是一个月后多一天
//calendar.add(Calendar.MONTH, -3);//减号,就是前几个月。加号,就是往后几个月
//calendar.add(Calendar.DATE, -3);//减号,就是当前日期的前几天,加号,就是当前时间的后几天
//calendar.add(Calendar.YEAR, -3);//减号,就是当前年份的前几年,加号,就是当前年份的后几年
Date nextMonthNow=c.getTime();
print(nextMonthNow);
//获取去年的今天
c.setTime(now);
c.add(Calendar.YEAR,-1);
print(c.getTime());
//上个月的第三天
c.setTime(now);
c.add(Calendar.MONTH,-1);
//不改变大字段,改变小字段--不改年月改曰
c.set(Calendar.DATE,3);
print(c.getTime());
}
//打印格式
private static void print(Date date) {
System.out.println(sdf.format(date));
}
}