Java日期时间

--------------------------------------------- JDK1.8之前 ---------------------------------------------
java.lang.System类中的时间方法
static long currentTimeMillis(): 返回1970-01-01 00:00:00 至当前时间的毫秒数(时间戳)。

java.util.Date类
表示某一个时刻,精确到毫秒。
构造器:
Date(): 无参构造器创建对象可以获取本地当前时间
Date(long date):有参构造器创建对象,将某一时刻的时间戳转成时间

常用方法:
	getTime(): 返回1970-01-01 00:00:00 GMT至当前对象记录时刻的毫秒数
	toString():时间对象转成字符串,格式:周 月 天 hh:mm:ss 时间标准 年(Sun Aug 07 11:20:14 CST 2022)

java.sql.Date类
对应着数据库中的日期类型变量,此类继承了 java.util.Date类
重写了toString()方法,时间对象转成字符串,格式:yyyy-MM-dd
构造器:
Date(long date):有参构造器创建对象,将某一时刻的时间戳转成时间
常用方法:
getTime(): 返回1970-01-01 00:00:00 GMT至当前对象记录时刻的毫秒数
toString():时间对象转成字符串,格式:yyyy-MM-dd
如何将java.util.Date对象转成java.sql.Date对象
java.util.Date date = new java.util.Date();
java.sql.Date sqlDate = new java.sql.Date(date.getTime());

java.text.SimpleDateFormat类
此类是一个与语言环境无关的方式来格式化和解析日期的类。
作用:格式化(日期->文本) 和 解析(文本->日期)
构造器:
SimpleDateFormat(): 默认的模式和语言环境创建对象
public SimpleDateFormat(String 格式字符串): 创建格式化对象,该对象调用format方法格式化,调用parse方法解析文本生成日期

格式化:public String format(Date date)方法来格式化日期生成字符串
	SimpleDateFormat sdf = new SimpleDateFormat(格式字符串);
	String date = sdf.format(Date date);

解析:public Date parse(String date)方法解析字符串生成日期
	SimpleDateFormat sdf = new SimpleDateFormat(格式字符串);
	Date date = sdf.parse(String date);
	
格式字符串:
	"yyyy-MM-dd hh:mm:ss"
	"yyyyMMdd hh:mm:ss"
	"yyyy年MM月dd hh:mm:ss"
	其他格式

java.util.Calendar类
此类是一个抽象类,日历相关。获取日历实例的方法:Calendar.getInstance()、子类GregorianCalendar实例化
实例化
Calendar calendar = Calendar.getInstance();
Calendar calendar = new GregorianCalendar();
常用方法:
int get(枚举值) 根据传入的参数返回所需的数字(如年的第几天、周的第几天)
void set(枚举值, 值) 根据传入的参数修改指定的属性
void add(枚举值, 值) 根据传入的参数修改指定的属性(如月增加1、天数增加3)
Date getTime() 返回当前日历选中的日期
void setTime(Date date) 将传入的日期作为日历的当前日期

--------------------------------------------- JDK1.8及之后 ---------------------------------------------
java.time 值对象的基础包(常用)
java.time.format 格式化和解析日期时间(常用)
java.time.temporal底层框架和扩展特性
java.time.chrono 对不同日历系统的访问
java.time.zone 时区支持

常用类
java.time.LocalDate类(日期类,不可变类型)
java.time.LocalTime类(时间类,不可变类型)
java.time.LocalDateTime类(日期时间类,不可变类型)
以上三个类实例化对象及常用方法的名称大都相同
Instant类
从 1970-01-01 00:00:00 至 某一个时刻的时间戳
实例化:
Instant instant = Instant.now(); //产生当前的时间戳对象(默认UTC时区)
Instant instant = Instant.ofEpochMilli(long epochMilli);//产生某一个时刻点的时间戳对象,参数为毫秒数

常用方法:
	OffsetDateTime atOffset(ZoneOffset offset): 结合即时的偏移创建 OffsetDateTime 对象
	long toEpochMilli(): 获取Instant对象的毫秒数
Instant与LocatDateTime相互转换
	1.LocatDateTime -> Instant
		Instant ins = LocatDateTime.now().toInstant(ZoneOffset.UTC);//中国时间-UTC时间=8小时
	2.Instant -> LocatDateTime
		LocatDateTime localDT = LocatDateTime.ofInstant(Instant.now(),ZoneId.systemDefault())

1.创建日期时间
LocalDateTime localDT = LocalDateTime.now(ZoneId.of(“Asia/Shanghai”));
解析:
获取某个时区的当前时间对象,时区只会影响获取当前时间。
ZoneId.of(“Asia/Shanghai”)表示 UTC+8 时区,中国大陆时区
“Asia/Hong_Kong”-香港时区
“Asia/Tokyo”-日本时区

LocalDateTime localDT = LocalDateTime.of(年,月,日,时,分,秒);
解析:
获取指定时刻的日期时间对象,设置哪个时刻就是哪个时刻,与时区无关。
例如 LocalDateTime.of(2022,8,8,12,19,20);
LocalDateTime localDT = LocalDateTime.ofEpochSecond(second, 0, ZoneOffset.ofHours(偏移小时));
解析:
将时间戳(秒数)转成LocalDateTime对象。
second:秒数, 此秒数=1970-01-01 00:00:00 至 某一时刻的 总秒数,由此推出那个时刻。
偏移小时:由秒数推出了时刻,该数值则是在那个时刻上增加的小时数(可以为负数)。
2.LocalDateTime对象获取/设置属性
int getYear(): 获取LocalDateTime对象年份
int getMonthValue(): 获取LocalDateTime对象月份
int getDayOfMonth(): 获取LocalDateTime对象天
int getHour(): 获取LocalDateTime对象小时
int getMinute(): 获取LocalDateTime对象分钟
int getSecond(): 获取LocalDateTime对象秒

LocalDateTime withYear(int year):      设置年,原对象不变,返回新对象
LocalDateTime withMonth(int month):    设置月,原对象不变,返回新对象
LocalDateTime withDayOfMonth(int day): 设置日,原对象不变,返回新对象
LocalDateTime withHour(int hour):      设置时,原对象不变,返回新对象
LocalDateTime withMinute(int minute):  设置分,原对象不变,返回新对象
LocalDateTime withSecond(int second):  设置秒,原对象不变,返回新对象

3.LocalDateTime与时间戳转换
时间戳:1970-01-01 00:00:00 至 某一时刻的 秒数(或毫秒数)
ZoneOffset类-时区偏移量
ZoneOffset.ofHours(偏移小时); //在某一个时刻基础上偏移小时数
ZoneId类-时区(如"Asia/Shanghai")
ZoneId.of(“Asia/Shanghai”); //指定时区,一般用作创建日期时间 "Asia/Shanghai"表示 东8区-UTC+8
ZonedDateTime类
OffsetDateTime类-计算类
OffsetTime类
[1-1]LocalDateTime -> 时间戳(秒级别)
LocalDateTime localDT = LocalDateTime.now(ZoneId.of(“Asia/Shanghai”)); //当前中国时区日期时间对象
long second = localDT.toEpochSecond(ZoneOffset.ofHours(0)); //1970-01-01 00:00:00至日期时间对象总秒数-偏移小时3600
[1-2]LocalDateTime -> 时间戳(毫秒级别)
LocalDateTime localDT = LocalDateTime.now(ZoneId.of(“Asia/Shanghai”)); //当前中国时区日期时间对象
long milli = localDT.toInstant(ZoneOffset.ofHours(0)).toEpochMilli(); //毫秒数。1970-01-01 00:00:00至日期时间对象总毫秒数-偏移小时
3600
[2-1]时间戳(秒级别) -> LocalDateTime
LocalDateTime localDT = LocalDateTime.ofEpochSecond(second, 0, ZoneOffset.ofHours(偏移小时));//由秒数推出时刻后,再加上偏移小时数
[2-2]时间戳(毫秒级别) -> LocalDateTime
second = milli/1000; //毫秒先换算成秒
LocalDateTime localDT = LocalDateTime.ofEpochSecond(second, 0, ZoneOffset.ofHours(偏移小时));//由秒数推出时刻后,再加上偏移小时数

4.LocalDateTime对象格式化与解析
DateTimeFormatter DTF = DateTimeFormatter.ofPattern(“格式字符串”);//产生格式对象
格式字符串:
“yyyy-MM-dd hh:mm:ss” //hh:12小时制
“yyyy-MM-dd HH:mm:ss” //HH:24小时制
“yyyy-MM-dd HH:mm:ss.SSS” //SSS:毫秒
“yyyy年MM月dd日 hh时mm分ss秒”
“yyyy-MM-dd”
格式化:LocalDateTime对象 -> 字符串
String dateStr = DTF.format(LocalDateTime对象);//格式化后输出的字符串样式为格式字符串样式

解析:字符串 -> LocalDateTime对象
	LocalDateTime localDT = DTF.parse(日期字符串);//日期字符串要符合格式字符串样式才能解析成功

5.LocalDateTime对象计算
OffsetDateTime类-计算类
OffsetDateTime plusYears(long years): 日期加年数,原对象不变,返回新对象
OffsetDateTime plusMonths(long months): 日期加月数,原对象不变,返回新对象
OffsetDateTime plusDays(long days): 日期加天数,原对象不变,返回新对象
OffsetDateTime plusHours(long hours): 日期加小时,原对象不变,返回新对象
OffsetDateTime plusMinutes(long minute): 日期加分钟,原对象不变,返回新对象
OffsetDateTime plusSeconds(long seconds): 日期加秒数,原对象不变,返回新对象
OffsetDateTime plusWeeks(long weeks): 日期加周数,原对象不变,返回新对象
以上方法中到参数可以是正数(加)也可以是负数(减)

思路:现将LocalDateTime对象转成OffsetDateTime类对象,日期计算完成后再转回LocalDateTime对象。
LocalDateTime localDT = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); //当前中国时区日期时间对象

OffsetDateTime offsetDT = OffsetDateTime.of(localDT, ZoneOffset.ofHours(0)); //LocalDateTime转OffsetDateTime,可以设偏移量

//日期计算
offsetDT = offsetDT.plusYears(2).plusMonths(2).plusDays(2); // 增加2年、2月、2天

//获取计算后的日期属性
int year = offsetDT.getYear();
int month = offsetDT.getMonthValue();
int day = offsetDT.getDayOfMonth();
int hour = offsetDT.getHour();
int minute = offsetDT.getMinute();
int second = offsetDT.getSecond();
int milli = localDT.getNano();//原LocalDateime对象的纳秒数(yyyy-MM-dd HH:mm:ss.xxxxxxxxx)
localDT = LocalDateTime.of(year,month,day,hour,minute,second,milli);//OffsetDateTime对象转回LocalDateTime对象

6.LocalDateTime对象日期差
计算两个日期相差的天数、月份数、年份数
LocalDateTime dt1 = LocalDateTime.of(2021,5,6,12,01,30);//2021-05-06 12:01:30
LocalDateTime dt2 = LocalDateTime.of(2022,3,15,12,21,30);//2022-03-15 12:21:30
long dt1Second = dt1.toEpochSecond(ZoneOffset.ofHours(0)); //dt1时间戳(秒)
long dt2Second = dt2.toEpochSecond(ZoneOffset.ofHours(0)); //dt2时间戳(秒)
double diffDay = (dt2Second - dt1Second)/86400.0; //相差的秒数除以86400 转成天数
double diffMonth = diffDay/30.0; //相差的月份数
double diffYear = diffDay/365.0; //相差的年份数

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值