Date

Date 类主要封装了系统的日期和时间的信息,表示系统特定的时间戳,可以精确到毫秒。Date 对象表示时间的默认顺序是星期、月、日、小时、分、秒、年。

构造方法

Date():使用该构造方法创建的对象可以获取本地的当前时间。

Date(long date):表示从 GMT 时间1970 年 1 月 1 日 0 时 0 分 0 秒开始经过参数 date 指定的毫秒数。

Date date1 = new Date();    // 1、调用无参数构造函数
System.out.println(date1.toString());    // 输出:Wed May 18 21:24:40 CST 2016

Date date2 = new Date(60000);    // 2、调用含有一个long类型参数的构造函数
System.out.println(date2);    // 输出:Thu Jan 0108:01:00 CST 1970

常用方法

方法描述
boolean after(Date when)判断此日期是否在指定日期之后
boolean before(Date when)判断此日期是否在指定日期之前
int compareTo(Date anotherDate)比较两个日期的顺序
boolean equals(Object obj)比较两个日期的相等性
long getTime()返回自 1970 年 1 月 1 日 00:00:00 GMT 以来,此 Date 对象表示的毫秒数
String toString()把此 Date 对象转换为以下形式的 String: dow mon dd hh:mm:ss zzz yyyy。
其中 dow 是一周中的某一天(Sun、Mon、Tue、Wed、Thu、Fri 及 Sat)

时间格式

yyyy:年  
MM:月  
dd:日  
hh:1~12小时制(1-12)  
HH:24小时制(0-23)  
mm:分  
ss:秒  
S:毫秒  
E:星期几  
D:一年中的第几天  
F:一月中的第几个星期(会把这个月总共过的天数除以7)  
w:一年中的第几个星期  
W:一月中的第几星期(会根据实际情况来算)  
a:上下午标识  
k:和HH差不多,表示一天24小时制(1-24)。  
K:和hh差不多,表示一天12小时制(0-11)。  
z:表示时区    

常见用法

StringDate

// String 转 Date
String str = "1957-3-23 00:00:00";  
//1、定义转换格式  
SimpleDateFormat formatter  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
//2、将str转化为date类型  输出为:Sat Mar 23 00:00:00 GMT+08:00 1957  
Date  date = formatter.parse(str);  
//---------------------------------------------------------------------------
// Date转String
//1、定义转换格式  
SimpleDateFormat formatter  = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");  
//2、将当前时间转化为String类型 
String dateString = formatter.format(new Date());

获取n分钟前的时间

Date now = new Date();
//timeRange分钟前的时间
Date beforeDate = new Date(now.getTime() - 1000*60*timeRange); 
//可以方便地修改日期格式
SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String nowTime_10 = dateFormat.format(beforeDate);
//---------------------------------------------------------------------------
// 获取昨天
// 1天的时间=24小时 x 60分钟 x 60秒 x 1000毫秒 单位是L。
Date yesterday = new Date(today.getTime() - 86400000L);//86400000L

获取年

SimpleDateFormat formatter = new SimpleDateFormat("yyyy");
formatter.format(new Date());

 获取时间差

SimpleDateFormat simpleFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm");
String fromDate = simpleFormat.format("2016-05-01 12:00");  
String toDate = simpleFormat.format("2016-05-01 12:50");  
long from = simpleFormat.parse(fromDate).getTime();  
long to = simpleFormat.parse(toDate).getTime();  
int minutes = (int) ((to - from)/(1000 * 60));  

判断某个日期是否在日期范围内

/**
 * 判断时间在时间区间内
 * @param nowTime   当前时间	
 * @param startTime	开始时间
 * @param endTime   结束时间
 * @return 
 */
public static boolean isEffectiveDate(Date dateTime, Date startTime, Date endTime) {
	if (dateTime.getTime() == startTime.getTime()
			|| dateTime.getTime() == endTime.getTime()) {
		return true;
	}
	Calendar date = Calendar.getInstance();
	date.setTime(dateTime);
	Calendar begin = Calendar.getInstance();
	begin.setTime(startTime);
	Calendar end = Calendar.getInstance();
	end.setTime(endTime);
	if (date.after(begin) && date.before(end)) {
		return true;
	} else {
		return false;
	}
}
//---------------------------------------------------------------------------
/**
 * 判断当前时间在时间区间内	
 * @param startTime	开始时间
 * @param endTime   结束时间
 * @return 
 */
public static boolean isEffectiveDate(String startTime, String endTime) {
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 要转换的日期格式
    Date dateStart = sdf.parse(startTime);
    long dateStartL = dateStart.getTime();
    Date dateEnd = sdf.parse(endTime);
    long dateEndL = dateEnd.getTime();
    long nowL = new Date().getTime();
    if (dateEndL > dateStartL) {
        if (nowL >= dateStartL && nowL < dateEndL) {
            return ture;
        }
    }
}

获取两个时间段内的日期

/**
 * 获取两个日期之间的所有年
 *
 * @param startTime
 * @param endTime
 * @return:YYYY-MM
 */
public static List<String> getYearBetweenDate(String startTime, String endTime){
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy");
	// 声明保存日期集合
	List<String> list = new ArrayList<String>();
	try {
		// 转化成日期类型
		Date startDate = sdf.parse(startTime);
		Date endDate = sdf.parse(endTime);

		//用Calendar 进行日期比较判断
		Calendar calendar = Calendar.getInstance();
		while (startDate.getTime()<=endDate.getTime()){
			// 把日期添加到集合
			list.add(sdf.format(startDate));
			// 设置日期
			calendar.setTime(startDate);
			//把日期增加一天
			calendar.add(Calendar.YEAR, 1);
			// 获取增加后的日期
			startDate=calendar.getTime();
		}
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return list;
}

/**
 * 获取两个日期之间的所有月份 (年月)
 *
 * @param startTime
 * @param endTime
 * @return:YYYY-MM
 */
public static List<String> getMonthBetweenDate(String startTime, String endTime){
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
	// 声明保存日期集合
	List<String> list = new ArrayList<String>();
	try {
		// 转化成日期类型
		Date startDate = sdf.parse(startTime);
		Date endDate = sdf.parse(endTime);

		//用Calendar 进行日期比较判断
		Calendar calendar = Calendar.getInstance();
		while (startDate.getTime()<=endDate.getTime()){
			// 把日期添加到集合
			list.add(sdf.format(startDate));
			// 设置日期
			calendar.setTime(startDate);
			//把日期增加一天
			calendar.add(Calendar.MONTH, 1);
			// 获取增加后的日期
			startDate=calendar.getTime();
		}
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return list;
}

/**
 *  获取两个日期之间的所有日期 (年月日)
 *
 * @param startTime
 * @param endTime
 * @return
 */
public static List<String> getBetweenDays(String startTime, String endTime){
	SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	// 声明保存日期集合
	List<String> list = new ArrayList<String>();
	try {
		// 转化成日期类型
		Date startDate = sdf.parse(startTime);
		Date endDate = sdf.parse(endTime);
		//用Calendar 进行日期比较判断
		Calendar calendar = Calendar.getInstance();
		while (startDate.getTime()<=endDate.getTime()){
			// 把日期添加到集合
			list.add(sdf.format(startDate));
			// 设置日期
			calendar.setTime(startDate);
			//把日期增加一天
			calendar.add(Calendar.DATE, 1);
			// 获取增加后的日期
			startDate=calendar.getTime();
		}
	} catch (ParseException e) {
		e.printStackTrace();
	}
	return list;
}

时间戳

unix时间戳是从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数

格式转换

时间戳日期格式

// 时间戳 转换时间
// 1、10位数的时间戳(秒)
long time1 = 1527767665;
// 注意:如果是Unix时间戳记得乘以1000
String result1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date(time1 * 1000));
Date date1 = new Date(time1*1000);   //对应的就是时间戳对应的Date

// 2、13位数的时间戳(毫秒)
double time2 = 1515730332000d;
String result2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(time2);

//---------------------------------------------------------------------------

// 时间 转换 时间戳
String dateTime = "2022-02-22 22:22:22";
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = simpleDateFormat.parse(dateTime );
long dateL = date.getTime();
String dateStamp = String.valueOf(dateL);

 获取时间戳

// 有三种方式获取
// 第一、第二种:会精确到毫秒,第三种:只能精确到秒,毫秒用000替代
// 注意:获取到的时间戳除以1000就可获得Unix时间戳,就可传值给后台得到。
var time1 = date.getTime();
var time2 = date.valueOf();
var time3 = Date.parse(date);

Calendar

Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR、MONTH、DAY_OF_MONTH、HOUR 等日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了一些方法。

构造方法

Calendar是一个抽象类,不能直接new一个实例,创建实例的方法如下:

// 获得实例默认是当前日期
Calendar calendar = Calendar.getInstance();

 常用方法

方法描述
void add(int field, int amount)根据日历的规则,为给定的日历字段添加或减去指定的时间量。
int get(int field)返回给定日历字段的值。
void set(int year, int month, int date)设置日历字段 YEAR、MONTH 和 DAY_OF_MONTH 的值。
void set(int year, int month, int date, int hourOfDay, int minute)设置日历字段 YEAR、MONTH、DAY_OF_MONTH、HOUR_OF_DAY 和 MINUTE 的值。
void set(int year, int month, int date, int hourOfDay, int minute, int second)设置字段 YEAR、MONTH、DAY_OF_MONTH、HOUR、MINUTE 和 SECOND 的值。

常量

Calendar.AM_PM = 9;  // 0表示在中午12点之前,1表示中午12点之后(包括12点)
Calendar.ERA = 0;  // 表示纪元,0表示BC(公元前),1表示AD(公元)
Calendar.YEAR = 1; // 表示年份
Calendar.MONTH = 2;  // 表示月份,0表示1月,1表示2月,以此类推
Calendar.WEEK_OF_YEAR = 3;  // 本年中第几个星期
Calendar.WEEK_OF_MONTH = 4;  // 本月中第几个星期
Calendar.DAY_OF_MONTH = 5;  // 一月中第几天
Calendar.DAY_OF_YEAR = 6;  // 一年中第几天
Calendar.DAY_OF_WEEK = 7;  // 一周中第几天,从周日开始,周日是1
Calendar.DAY_OF_WEEK_IN_MONTH = 8;  // 当月中第几个星期
Calendar.HOUR = 10;  // 小时,十二小时制
Calendar.HOUR_OF_DAY = 11;  // 小时,二十四小时制
Calendar.MINUTE = 12;  // 分钟
Calendar.SECOND = 13;  // 秒
Calendar.MILLISECOND = 14;  // 毫秒
Calendar.ZONE_OFFSET = 15;  // 
Calendar.DST_OFFSET = 16;  // 
 
Calendar.JANUARY = 0;  // 一月
Calendar.FEBRUARY;  // 二月
Calendar.MARCH;  // 三月
Calendar.APRIL;  // 四月
Calendar.MAY;  // 五月
Calendar.JUNE;  // 六月
Calendar.JULY;  // 七月
Calendar.AUGUST;  // 八月
Calendar.SEPTEMBER;  // 九月
Calendar.OCTOBER;  // 十月
Calendar.NOVEMBER;  // 十一月
Calendar.DECEMBER = 11;  // 十二月
 
Calendar.SUNDAY = 1;  // 星期日
Calendar.MONDAY;  // 星期一
Calendar.TUESDAY;  // 星期二
Calendar.WEDNESDAY;  // 星期三
Calendar.THURSDAY;  // 星期四
Calendar.FRIDAY;  // 星期五
Calendar.SATURDAY = 7;  // 星期六

 常见用法

//获取对应日期的年份
int year = calendar.get(Calendar.YEAR);

//获取对应日期的月份
//月份从0开始
int month = calendar.get(Calendar.MONTH)+1;

//获取对应日期
int day = calendar.get(Calendar.DATE);

//判断当前时间是上午还是下午
//0为上午,1为下午
int am_pm = calendar.get(Calendar.AM_PM);

//获取对应日期的时间 (小时)
//12小时制,即下午1点显示为1而不是13
int hours = calendar.get(Calendar.HOUR);

//获取对应日期的时间  (分钟)
int minute = calendar.get(Calendar.MINUTE);

//获取对应日期是该周的第几天
int dayOfWeek = calendar.get(Calendar.DAY_OF_WEEK);

//获取对应日期是该月的第几天
int dayOfMonth = calendar.get(Calendar.DAY_OF_MONTH);

//获取对应日期是该年的第几天
int dayOfYear = calendar.get(Calendar.DAY_OF_YEAR);

//获取对应日期是该月的第几周
int weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);

//获取对应日期是该年的第几周
int weekOfYear = calendar.get(Calendar.WEEK_OF_YEAR);

//获取当前月份的最大天数
calendar.getActualMaximum(Calendar.DAY_OF_MONTH);

CalendarString

//1.Calendar 转化 String
Calendar calendat = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd")0;
String dateStr = sdf.format(calendar.getTime());

//2.String 转化Calendar
String str="2010-5-27";
SimpleDateFormat sdf= new SimpleDateFormat("yyyy-MM-dd");
Date date =sdf.parse(str);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);

获取N天、小时之后的整点时间

/**
* 获取days天后整点的时间
*
* @param days
* @return
*/
public static Date getExpireOfDays(int days) {
	Calendar c1 = Calendar.getInstance();
	c1.set(Calendar.HOUR_OF_DAY, 0);
	c1.set(Calendar.MINUTE, 0);
	c1.set(Calendar.SECOND, 0);
	c1.set(Calendar.MILLISECOND, 0); 

	c1.add(Calendar.DATE, days); 
	return c1.getTime();
}

/**
 * 获取hours小时后整点的时间
 *
 * @param hours
 * @return
 */
public static Date getExpireOfHours(int hours) {
	Calendar c1 = Calendar.getInstance();
	c1.set(Calendar.MINUTE, 0);
	c1.set(Calendar.SECOND, 0);
	c1.set(Calendar.MILLISECOND, 0); 

	c1.add(Calendar.HOUR_OF_DAY, hours);

	return c1.getTime();
}

获取两个时间段内的所有日期

// 格式 yyyy-MM-dd
public static List<String> getBetweenDate(String begin,String end){
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
    List<String> betweenList = new ArrayList<String>();
    try{
        Calendar startDay = Calendar.getInstance();
        startDay.setTime(format.parse(begin));
        startDay.add(Calendar.DATE, -1);
        
        while(true){
            startDay.add(Calendar.DATE, 1);
            Date newDate = startDay.getTime();
            String newend=format.format(newDate);
            betweenList.add(newend);
            if(end.equals(newend)){
                break;
            }
        }
    }catch (Exception e) {
        e.printStackTrace();
    }
    return betweenList;
} 

时间加5分钟

Calendar nowTime = Calendar.getInstance();
nowTime.add(Calendar.MINUTE, 5);
System.out.println(sdf.format(nowTime.getTime()));

两个时间相差的天数

方法1:通过Calendar类的日期比较。

只是通过日期来进行比较两个日期的相差天数的比较,没有精确到相差到一天的时间。如果是只是纯粹通过日期(年月日)来比较比较的话就是方式一。

 * date2比date1多的天数
 * @param date1    
 * @param date2
 * @return    
 */
public static int differentDays(Date date1,Date date2) {
	Calendar cal1 = Calendar.getInstance();
	cal1.setTime(date1);
	
	Calendar cal2 = Calendar.getInstance();
	cal2.setTime(date2);
    int day1= cal1.get(Calendar.DAY_OF_YEAR);
	int day2 = cal2.get(Calendar.DAY_OF_YEAR);
	
	int year1 = cal1.get(Calendar.YEAR);
	int year2 = cal2.get(Calendar.YEAR);
	if(year1 != year2) { //同一年
		int timeDistance = 0 ;
		for(int i = year1 ; i < year2 ; i ++) {
			if(i%4==0 && i%100!=0 || i%400==0) { //闰年   
				timeDistance += 366;
			} else {//不是闰年
				timeDistance += 365;
			}
		}
		return timeDistance + (day2-day1) ;
	} else { //不同年
		System.out.println("判断day2 - day1 : " + (day2-day1));
		return day2-day1;
	}
}

方法2:直接通过计算两个日期的毫秒数,他们的差除以一天的毫秒数,即可得到我们想要的两个日期相差的天数。

/**
 * 通过时间秒毫秒数判断两个时间的间隔
 * @param date1
 * @param date2
 * @return
 */
public static int differentDaysByMillisecond(Date date1,Date date2){
	int days = (int) ((date2.getTime() - date1.getTime()) / (1000*3600*24));
	return days;
}

比较日期时间大小

 // 比较 年 月 日
SimpleDateFormat sdf  =new SimpleDateFormat("yyyy-MM-dd"); //创建日期转换对象:年 月 日
String date = "2018-11-11"; //假设 设定日期是  2018-11-11		
Date today = new Date();    //今天 实际日期是  2018-11-12    Debug:Wed Nov 12 12:08:12 CST 2018
try {         
	Date dateD = sdf.parse(date); //将字符串转换为 date 类型  Debug:Sun Nov 11 00:00:00 CST 2018
	boolean flag = dateD.getTime() >= today.getTime();
	System.err.println("flag = "+flag);  // flag = false
} catch (ParseException e1) {
	// TODO Auto-generated catch block
	e1.printStackTrace();
} 

LocalDate、LocalTime、LocalDateTime

LocalDate、LocalTime、LocalDateTime是java8对日期、时间提供的新接口。 这些类是不可变的,一旦实例化,值就固定了,有点类似于String类,所以这些类都是线程安全的。

LocalDate是针对于年月日的

创建方法

//获取当前日期 年月日(2022-05-31)
LocalDate localDate = LocalDate.now();
//输入年月日设置时间
LocalDate localDate = LocalDate.of(year,month,day);

格式化

String localTime = LocalDate.now().format(DateTimeFormatter.ofPattern("HH:mm:ss"));

 获取年月日星期

//获取年份
int year = localDate.getYear();
int year = localDate.get(ChronoField.YEAR);

//获取月
//注意getMonth方法返回的是Month类
//可通过getValue方法获得一个long类型的值,然后可以强转为int类型进行使用
Month month = localDate.getMonth();	// MAY 对象
int month1 = localDate.get(ChronoField.MONTH_OF_YEAR);	// 5

//获取日
int day = localDate.getDayOfMonth();	// 31
int day1 = localDate.get(ChronoField.DAY_OF_MONTH);

//获取星期几
//注意getDayOfWeek方法返回的是DayOfWeek类
//可通过getValue方法获得一个long类型的值,然后可以强转为int类型进行使用
DayOfWeek dayOfWeek = localDate.getDayOfWeek();	// TUESDAY
int dayOfWeek1 = localDate.get(ChronoField.DAY_OF_WEEK);	// 2

修改时间

LocalDate localDate = LocalDate.now();
//增加一年
localDate = localDate.plusYears(1);
localDate = localDate.plus(1, ChronoUnit.YEARS);
//减少一个月
localDate = localDate.minusMonths(1);
localDate = localDate.minus(1, ChronoUnit.MONTHS);
//减少一日
localDate = localDate.minusDays(1);
localDate = localDate.minus(1, ChronoUnit.DAYS);
//通过使用with方法进行修改
//修改年为2020
localDate = localDate.withYear(2020);
//修改为2020
localDate = localDate.with(ChronoField.YEAR, 2020);

 转换

//----------------------------------------------------------

//1、String类型转换成LocalDate类型
LocalDate localDate = LocalDate.parse("2019-12-07");

//2、localDate转换成String 
LocalDate localDate = LocalDate.now();
//按照yyyyMMdd样式进行更改
String format = localDate.format(DateTimeFormatter.BASIC_ISO_DATE);
//按照yyyy-MM-dd样式进行更改
String format = localDate.format(DateTimeFormatter.ISO_DATE);
//自定义样式进行更改
DateTimeFormatter pattern = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
String format = localDate.format(pattern);
//----------------------------------------------------------
// LocalDate 转 Date
LocalDate localDate = LocalDate.now();
System.out.println("local:"+localDate.getYear());
ZoneId zoneId = ZoneId.systemDefault();
Date date = Date.from(localDate.atStartOfDay().atZone(zoneId).toInstant());
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println("date:"+calendar.get(Calendar.YEAR));

// Date 转 LocalDate
Date date = new Date();
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
LocalDate localDate = LocalDate.of(calendar.get(Calendar.YEAR),calendar.get(Calendar.MONTH),calendar.get(DAY_OF_MONTH));

LocalTime是针对于时分秒

创建方法

LocalTime timeNow = LocalTime.now();       // 14:35:51.207
LocalTime time = LocalTime.of(23, 59, 59); // 23:59:59

获取时分秒

// 15:29:18
LocalTime localTime = LocalTime.now();
//获取当前时间的小时数
localTime.getHour();
//获取当前时间的分钟数
localTime.getMinute();
//获取当前时间的秒数
localTime.getSecond();

 修改时间

// 15:29:18
LocalTime localTime = LocalTime.now();

//将参数中的"小时"替换localTime中的"小时"
localTime.withHour(1);
//将参数中的"分钟"替换localTime中的"分钟"
localTime.withMinute(1);
//将参数中的"秒"替换localTime中的"秒"
localTime.withSecond(1);

//将当前时间减一小时
localTime.minusHours(1);
//将当前时间减一分钟
localTime.minusMinutes(1);
//将当前时间减一秒
localTime.minusSeconds(10);
//将当前时间加一小时
localTime.plusHours(1);
//将当前时间加一分钟
localTime.plusMinutes(1);
//将当前时间加一秒
localTime.plusSeconds(10);
//将当前时间减一小时
localTime.minusHours(1);
//将当前时间减一分钟
localTime.minusMinutes(1);
//将当前时间减一秒
localTime.minusSeconds(10);
//将当前时间加一小时
localTime.plusHours(1);
//将当前时间加一分钟
localTime.plusMinutes(1);
//将当前时间加一秒
localTime.plusSeconds(10);

 比较时间

// 15:29:18
LocalTime localTime = LocalTime.now();

//比较该时间与other时间的大小,返回正数,那么当前对象时间较晚(数字较大):17
localTime.compareTo(LocalTime.of(15,29, 1)));
//比较该时间是否比参数时间早(true为早):false
localTime.isBefore(LocalTime.of(15,29, 1)));
//比较该时间是否比参数时间晚(true为晚):true
localTime.isAfter(LocalTime.of(15,29, 1)));
//比较两个时间是否相等(true为早):true
localTime.equals(LocalTime.now()));

转换 

//1、String类型转换为LocalTime类型
LocalTime localTime = LocalTime.parse("17:26:00");

//2、LocalTime类型转换为String类型
//按照xx:xx:xx.xx样式进行转换
LocalTime localTime = LocalTime.now();
String format3 = localTime.format(DateTimeFormatter.ISO_TIME); 
//按照自定义样式进行转换
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("hh:mm:ss");
String format4 = localTime.format(formatter); 

LocalDateTime是针对于年月日时分秒

创建方法

LocalDateTime dateTimeNow = LocalDateTime.now();  
LocalDateTime dateTime = LocalDateTime.of(2020, 1, 29, 23, 59, 59); // 2020-01-29T23:59:59

//获取本地当前的日期时间(不含时区)
LocalDateTime now = LocalDateTime.now(); // 2019-10-17T15:44:03.640
//从指定的时钟获取当前日期时间:这里用了UTC(世界标准时间)
LocalDateTime nowClock = LocalDateTime.now(Clock.systemUTC()); // 2019-10-17T07:57:42.404
//从指定时区中的系统时钟获取当前日期时间
LocalDateTime nowZoneId = LocalDateTime.now(ZoneId.systemDefault()); // 2019-10-17T16:09:04.127

修改时间

LocalDateTime localDateTime = LocalDateTime.now(); 
// 在该日期时间基础上增加或减少一定时间,参数1:时间量,可以是负数,参数2:时间单位
LocalDateTime plus = localDateTime.plus(1L, ChronoUnit.HOURS); // 2019-10-17T17:54:50.941
// 在该时间基础上增加一定时间
LocalDateTime plus1 = localDateTime.plus(Period.ofDays(1)); // 2019-10-18T16:54:50.941

// LocalDateTime    plusDays(long days):增加指定天数
// LocalDateTime	plusHours(long hours):增加指定小时数
// LocalDateTime	plusMinutes(long minutes):增加指定分钟数
// LocalDateTime	plusMonths(long months):增加指定月份数
// LocalDateTime	plusNanos(long nanos):增加指定毫秒数
// LocalDateTime	plusSeconds(long seconds):增加指定秒数
// LocalDateTime	plusWeeks(long weeks):增加指定周数
// LocalDateTime	plusYears(long years):增加指定年数

 两个时间时间差

LocalDateTime now = LocalDateTime.of(2021,12,21,0,0,0);
LocalDateTime end = LocalDateTime.of(2022,03,21,23,59,59);

//1.相差的天数
long until = now.until(end, ChronoUnit.DAYS);

//2.相差的天数
Duration duration = Duration.between(now,end);
long days = duration.toDays(); 

  转换 

//----------------------------------------------------------
//1、String类型转换为LocalDateTime类型
//按照12小时计算
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
//按照24小时计算
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDate localDate = LocalDate.parse("2019-12-07 07:43:53",formatter);

//2、LocalDateTime类型转换为String类型
LocalDateTime localDateTime = LocalDateTime.now();
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy-MM-dd hh:mm:ss");
String format5 = localDateTime.format(formatter2);
//----------------------------------------------------------
// LocalDateTime 转 Date
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println("local:"+localDateTime.getYear());
ZoneId zoneId = ZoneId.systemDefault();
Date date = Date.from(localDateTime.atZone(zoneId).toInstant());
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
System.out.println("date:"+calendar.get(Calendar.YEAR));

// Date 转 LocalDateTime 
Date date = new Date();
LocalDateTime localDateTime = LocalDateTime.ofInstant(date.toInstant(),ZoneId.systemDefault());

java8 对时间操作的类还有很多,在java.time包下去看看
Instant:时间戳
Duration:持续时间,时间差
LocalDate:只包含日期,比如:2016-10-20
LocalTime:只包含时间,比如:23:12:10
LocalDateTime:包含日期和时间,比如:2016-10-20 23:14:21
Period:时间段
ZoneOffset:时区偏移量,比如:+8:00
ZonedDateTime:带时区的时间
Clock:时钟,比如获取目前美国纽约的时间

LocalDateTime、LocalDate、Date的相互转换

LocalDateTime 转 LocalDate

LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = localDateTime.toLocalDate();

LocalDate 转 LocalDateTime

LocalDate localDate = LocalDate.now();
LocalDateTime localDateTime1 = localDate.atStartOfDay();
LocalDateTime localDateTime2 = localDate.atTime(8,20,33);
LocalDateTime localDateTime3 = localDate.atTime(LocalTime.now());

LocalDateTime、LocalDate 转 Date

LocalDateTime localDateTime = LocalDateTime.now();
LocalDate localDate = LocalDate.now();
//获取系统默认时区
ZoneId zoneId = ZoneId.systemDefault();
//时区的日期和时间
ZonedDateTime zonedDateTime = localDateTime.atZone(zoneId);
ZonedDateTime zonedDateTime1 = localDate.atStartOfDay().atZone(zoneId);
//获取时刻
Date date = Date.from(zonedDateTime.toInstant());
Date date = Date.from(zonedDateTime1.toInstant());

Date 转 LocalDateTime、LocalDate

Date date = new Date();
ZoneId zoneId = ZoneId.systemDefault();
LocalDateTime localDateTime = date.toInstant().atZone(zoneId).toLocalDateTime();
LocalDate localDate = date.toInstant().atZone(zoneId).toLocalDate();

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐