package com.atguigu.time;
import org.junit.Test;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
/**
* 涵盖所有时间相关的方法
* 格式化时间[时间字符串]、获取单独的年、月、日、时、分、秒、星期信息等使用SimpleDateFormat即可。
* 判断平年和闰年使用:new GregorianCalendar().isLeapYear()方法。
* Calendar类既可以通过setTime方法设置日历,也可以通过set方法将单独的年、月、日、时、分、秒设置到日历中。
* 设置完成后再次获取的时候就可以获取新的日历信息。
* 在基本时间上加减时间用Calendar的add方法或set方法都可以。
* Calender使用前需要使用clear()方法清除缓存。
*/
public class MyTimeTest {
private DateFormat sdf1=new SimpleDateFormat("yyyy-MM-dd-HH:mm:ss");
private DateFormat sdf2=new SimpleDateFormat("yyyy-MM-dd");
private DateFormat sdfyyyy=new SimpleDateFormat("yyyy");
private DateFormat sdfMM=new SimpleDateFormat("MM");
private DateFormat sdfdd=new SimpleDateFormat("dd");//当前月份的第几天
private DateFormat sdfHH=new SimpleDateFormat("HH");
private DateFormat sdfmm=new SimpleDateFormat("mm");
private DateFormat sdfss=new SimpleDateFormat("ss");
private DateFormat sdfDD=new SimpleDateFormat("DD");//一年中的第几天
private DateFormat sdfE=new SimpleDateFormat("E");//本周第几天
private DateFormat sdfEEEE=new SimpleDateFormat("EEEE");//今天是星期几
private DateFormat sdfW=new SimpleDateFormat("W");//本月第几个星期
private DateFormat sdfww=new SimpleDateFormat("ww");//本年第几个星期
private Date date=new Date();//当前时间
private Calendar calendar = Calendar.getInstance();//Calendar对象
/**
* 获取时间的方法
* 获取时间使用new SimpleDateFormat("时间格式").format(new Date())返回时间字符串
* 获取时间使用Calendar.getInstance().get(Calendar.HOUR)返回数字
* 两种方式都能获取到时间,只是一个返回字符串,一个返回数据。
*/
@Test
public void ObtainTime(){
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
//时间
System.out.println("当前时间:"+sdf1.format(date)+"(simpleDateFormat构造器中的参数可以多了解一下)");
System.out.println("当前时间戳:"+System.currentTimeMillis());
System.out.println("当前年份:"+sdfyyyy.format(date));
System.out.println("当前月份:"+sdfMM.format(date));
System.out.println("当前天数:"+sdfdd.format(date));
System.out.println("当前小时数:"+sdfHH.format(date));
System.out.println("当前分数:"+sdfmm.format(date));
System.out.println("当前秒数:"+sdfss.format(date)+"\n");
//天数
System.out.println("当前时间是一年中第几天:"+sdfDD.format(date));
System.out.println("当前时间是一周中第几天(周一为第一天):"+sdfE.format(date));
System.out.println("给定年份的总天数:"+(new GregorianCalendar().isLeapYear(2020)?366:365));
System.out.println("给定月份的总天数:"+calendar.getActualMaximum(Calendar.DATE));
//星期数
System.out.println("当前时间是本月第几个星期:"+sdfW.format(date));
System.out.println("当前时间是今年第几个星期:"+sdfww.format(date));
System.out.println("当前时间是星期几:"+sdfEEEE.format(date));
}
/**
* 时间转换方法
*/
@Test
public void convertTime() throws ParseException {
/**
* 特定格式字符串转时间、时间戳
*/
Date stringToTime = sdf1.parse("2021-12-12-13:12:12");//时间字符串转时间
long stringToTimestamp = sdf1.parse("2021-12-12-13:12:12").getTime();//时间字符串转时间戳
System.out.println("字符串转时间:"+stringToTime+"\n字符串转时间戳:"+stringToTimestamp+"\n=================================");
/**
* 时间、时间戳转指定格式字符串
*/
String timeToString = sdf1.format(date);
String timestampToString = sdf1.format(date.getTime());
System.out.println("时间转字符串:"+timeToString+"\n时间戳转字符串:"+timestampToString+"\n=================================");
/**
* 时间和时间戳互转
*/
Long timestamp = date.getTime(); //当前时间戳
System.out.println("13位时间戳转10位时间戳:"+timestamp/1000L);
System.out.println("13位时间戳转时间:"+new Date(timestamp));
System.out.println("时间转13位时间戳:"+date.getTime());
System.out.println("sql date转util date:"+new java.sql.Date(date.getTime()));
System.out.println("util date转sql date:"+(Date)new java.sql.Date(1634875864438L));
//java.sql.Date()类是java.util.Date()类的子类。前者只能表示年月日 后者可以表示年月日时分秒
}
/**
* 时间运算
* 求本月第一天
* @param strDate 时间字符串,格式必须为“yyyy-MM-dd”
* @return 返回本月第一天的字符串表示,格式为“yyyy-MM-dd”
*/
public String first_day(String strDate){
int yyyy=0;
int MM=0;
try{
Date date = sdf2.parse(strDate);//格式化时间
//获取年份和月份
yyyy = Integer.parseInt(sdfyyyy.format(date));
MM = Integer.parseInt(sdfMM.format(date));
}catch(ParseException e){
e.printStackTrace();
return "输入的时间字符串格式有误"; //格式转换错误直接在catch中结束
}
//将日历设置为当前月份第一天
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.set(Calendar.YEAR,yyyy);
calendar.set(Calendar.MONTH,MM-1);
int firstDayNum = calendar.getActualMinimum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,firstDayNum);
//格式化输出
String firstDay = sdf2.format(calendar.getTime());
return firstDay;
}
/**
* 时间运算
* 求本月最后一天
* @param strDate 时间字符串,格式必须为“yyyy-MM-dd”
* @return 返回本月最后一天的字符串表示,格式为“yyyy-MM-dd”
*/
public String last_day(String strDate){
int yyyy=0;
int MM=0;
try{
Date date = sdf2.parse(strDate);//格式化时间
//获取年份和月份
yyyy = Integer.parseInt(sdfyyyy.format(date));
MM = Integer.parseInt(sdfMM.format(date));
}catch(ParseException e){
e.printStackTrace();
return "输入的时间字符串格式有误"; //格式转换错误直接在catch中结束
}
//将日历设置为当前月份最后一天
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.set(Calendar.YEAR,yyyy);
calendar.set(Calendar.MONTH,MM-1);
int lastDayNum = calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
calendar.set(Calendar.DAY_OF_MONTH,lastDayNum);
//格式化输出
String lastDay = sdf2.format(calendar.getTime());
return lastDay;
}
@Test
public void testFirstAndLastDay(){
System.out.println(first_day("2021-10-25"));
System.out.println(last_day("2021-10-25"));
}
/**
* 传入的时间字符串格式为:"yyyy-MM-dd-HH:mm:ss"或“yyyy-MM-dd”
* @param timeUnit 比较的单位,可选值有“YEAR”,"MONTH","DAY","HOUR","MINUTE","SECOND"
* @param startTime 起始时间字符串(用作减数)
* @param endTime 结束时时间字符串(用作被减数)
*/
public String timeStampdiff(String timeUnit, String startTime, String endTime) {
Integer result=null;
Date startDate=null;
Date endDate=null;
/**
* 将输入时间转换为标准格式的时间字符串"yyyy-MM-dd-HH:mm:ss"
*/
try{
if(startTime.trim().length()==10){
startDate = sdf1.parse(new StringBuilder().append(startTime).append("-00:00:00").toString());
}else{
startDate=sdf1.parse(startTime);
}
if(endTime.trim().length()==10){
endDate = sdf1.parse(new StringBuilder().append(endTime).append("-00:00:00").toString());
}else{
endDate=sdf1.parse(endTime);
}
}catch(ParseException e){
e.printStackTrace();
return "输入日期格式有误,请重新输入!!";
}
long timestampDiff=endDate.getTime() - startDate.getTime();
/**
* 获取endDate和startDate各个时间单位上的差值
*/
Integer yyyy=Integer.parseInt(sdfyyyy.format(endDate))-Integer.parseInt(sdfyyyy.format(startDate));
Integer MM=Integer.parseInt(sdfMM.format(endDate))-Integer.parseInt(sdfMM.format(startDate));
Integer dd=Integer.parseInt(sdfdd.format(endDate))-Integer.parseInt(sdfdd.format(startDate));
Integer HH=Integer.parseInt(sdfHH.format(endDate))-Integer.parseInt(sdfHH.format(startDate));
Integer mm=Integer.parseInt(sdfmm.format(endDate))-Integer.parseInt(sdfmm.format(startDate));
Integer ss=Integer.parseInt(sdfss.format(endDate))-Integer.parseInt(sdfss.format(startDate));
switch (timeUnit){
case "YEAR":result=yyyy;break;
case "MONTH": result=yyyy*12+MM;break;
case "DAY":{//每个月的天数不一样啊 相差一秒钟,可能同一天也可能不是同一天
if(yyyy==0 && MM==0 && dd==0){
result=0;
}else{
result=(int)Math.ceil(timestampDiff/(1000.0*60*60*24));
}
break;
}
case "HOUR":{
if(yyyy==0 && MM==0 && dd==0 && HH==0){
result=0;
}else{
result=(int)Math.ceil(timestampDiff/(1000.0*60*60));
}
break;
}
case "MINUTE":{
if(yyyy==0 && MM==0 && dd==0 && HH==0 && mm==0){
result=0;
}else{
result=(int)Math.ceil(timestampDiff/(1000.0*60));
}
break;
}
case "SECOND":{
if(yyyy==0 && MM==0 && dd==0 && HH==0 && mm==0 && ss==0){
result=0;
}else{
result=(int)Math.ceil(timestampDiff/(1000.0));
}
break;
}
default:return "时间单位不匹配,请重新输入!!";
}
return result.toString();
}
@Test
public void testTimestampdiff() {
String startDate="2010-12-13-14:00:00";
String endDate="2020-11-11";
System.out.println(timeStampdiff("YEAR", startDate, endDate));
System.out.println(timeStampdiff("MONTH", startDate, endDate));
System.out.println(timeStampdiff("DAY", startDate, endDate));
System.out.println(timeStampdiff("HOUR", startDate, endDate));
System.out.println(timeStampdiff("MINUTE", startDate, endDate));
System.out.println(timeStampdiff("SECOND", startDate, endDate));
}
/**
* 在给定的时间字符串基础上进行日期的加减
* 传入的时间字符串格式为:"yyyy-MM-dd-HH:mm:ss"或“yyyy-MM-dd”
* @param strDate 给定的时间字符串
* @param timeUnit 时间单位,选值有“YEAR”,"MONTH","DAY","HOUR","MINUTE","SECOND"
* @param num 偏移量大小,正负均可
* @return 返回格式 "yyyy-MM-dd-HH:mm:ss"
*/
public String date_add(String strDate,String timeUnit,Integer num) {
Date inputDate=null;
try {
if(strDate.length()==10){
inputDate=sdf1.parse(new StringBuilder().append(strDate).append("-00:00:00").toString());
}else{
inputDate=sdf1.parse(strDate);
}
} catch (ParseException e) {
e.printStackTrace();
return "您输入的格式有误!!";
}
/**
* 设置输入日期为当前日历时间
*/
calendar.clear();
calendar.setTime(inputDate);//将输入时间设置为当前日历
/**
* 用add方法和set方法均可
*/
switch (timeUnit){//根据输出重新设置日历
case "YEAR":{ calendar.add(Calendar.YEAR,num);break;}
case "MONTH":{ calendar.add(Calendar.MONTH,num);break;}//月份角标从0开始
case "DAY":{ calendar.add(Calendar.DAY_OF_MONTH,num);break;}//不能是DAY_OF_YEAR
case "HOUR":{calendar.add(Calendar.HOUR_OF_DAY,num);break;}
case "MINUTE":{calendar.add(Calendar.MINUTE,num);break;}
case "SECOND":{calendar.add(Calendar.SECOND,num);break;}
default:System.out.println("时间单位不匹配,请重新输入!!");
}
return sdf1.format(calendar.getTime());
}
@Test
public void testDateAdd(){
System.out.println("年:"+date_add(sdf1.format(date),"YEAR",-1));
System.out.println("月:"+date_add(sdf1.format(date),"MONTH",-10));
System.out.println("日:"+date_add(sdf1.format(date),"DAY",7));
System.out.println("日:"+date_add(sdf1.format(date),"DAY",-26));
System.out.println("时:"+date_add(sdf1.format(date),"HOUR",13));
System.out.println("时:"+date_add(sdf1.format(date),"HOUR",-17));
System.out.println("分:"+date_add(sdf1.format(date),"MINUTE",20));
System.out.println("分:"+date_add(sdf1.format(date),"MINUTE",-50));
System.out.println("秒:"+date_add(sdf1.format(date),"SECOND",50));
System.out.println("秒:"+date_add(sdf1.format(date),"SECOND",-50));
}
}
package com.atguigu.time;
import org.junit.Test;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
public class MyCalendarTest {
private DateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
private Calendar calendar = Calendar.getInstance();
/**
* 获取年月日时分秒毫秒天数星期数等
*/
@Test
public void obtainTime(){
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.setTime(new Date());//将当前时间设置成日历
//年月日时分秒
System.out.println("年:"+calendar.get(Calendar.YEAR));
System.out.println("月:"+calendar.get(Calendar.MONTH));//结果加1才是当前月份
System.out.println("日:"+calendar.get(Calendar.DAY_OF_MONTH));
System.out.println("日:"+calendar.get(Calendar.DATE));
System.out.println("时:"+calendar.get(Calendar.HOUR_OF_DAY));
System.out.println("分:"+calendar.get(Calendar.MINUTE));
System.out.println("秒:"+calendar.get(Calendar.SECOND));
System.out.println("毫秒:"+calendar.get(Calendar.MILLISECOND));
//天数与星期
System.out.println("给定年份的总天数:"+(new GregorianCalendar().isLeapYear(2020)?366:365));
System.out.println("一年中第几天:"+calendar.get(Calendar.DAY_OF_YEAR));
System.out.println("一年中第几个星期:"+calendar.get(Calendar.WEEK_OF_YEAR));
System.out.println("一月中第几星期:"+calendar.get(Calendar.WEEK_OF_MONTH));
System.out.println("一月中第几星期:"+calendar.get(Calendar.DAY_OF_WEEK_IN_MONTH));//[1,7]\[8,14]...天对应第1、2个星期
System.out.println("一星期中第几天:"+calendar.get(Calendar.DAY_OF_WEEK));//DAY_OF_WEEK中星期天的索引为1
}
@Test
public void calculateTime(){
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.setTime(new Date());//将当前时间设置成日历
calendar.set(Calendar.DATE,calendar.getActualMinimum(Calendar.DATE));
System.out.println("本月第一天:"+ sdf.format(calendar.getTime()));
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.setTime(new Date());//将当前时间设置成日历
calendar.set(Calendar.DATE,calendar.getActualMaximum(Calendar.DATE));
System.out.println("本月最后一天:"+ sdf.format(calendar.getTime()));
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.setTime(new Date());//将当前时间设置成日历
calendar.add(Calendar.DAY_OF_MONTH,1);
System.out.println("当前日期加一天:"+sdf.format(calendar.getTime()));
calendar.clear();//calendar实例初始化后使用前应该先清除缓存
calendar.set(2021,2,1);//将日期设为3月1号
calendar.add(Calendar.DAY_OF_MONTH,-1);//3月1号前推一天
System.out.println("1为平年,0为润年:"+(calendar.get(Calendar.DAY_OF_MONTH)==28?1:0));
}
/**
* GregorianCalendar是Calendar的子类,一般多用于传入数字设置日期。
*/
@Test
public void testGregorianCalendar(){
GregorianCalendar gc1 = new GregorianCalendar(2020,11,11);//直接设置日期
System.out.println(" 当前时间:"+gc1.getTime());//打印时间
gc1.add(Calendar.DAY_OF_MONTH,2);//前移两天
System.out.println(" 当前时间:"+gc1.getTime());
GregorianCalendar gc2 = new GregorianCalendar();//实例化后再传入日期
gc2.set(2000,10,10);
System.out.println(" 当前时间:"+gc2.getTime());
System.out.println("是否是闰年:1是,0否"+(gc2.isLeapYear(2000)?1:0));
}
}