java中的时间类
Java中的旧有时间类为Java.util包的date和calendar,都是基于一个核心的long值类计算,以1970年1月1日为基础,过去了多少毫秒。
Date类
Date date = new Date();//System.currentTimeMillis();fastTime;
//也可以指定日期来声明日期,但是传入的参数年份从1900年开始计算,且月份从0开始计数,所以传参应该按照如下格式,月份使用calendar的月份。
Date date = new Date(2022-1900,Calendar.FEBRUARY,13);
sout(date);//Sun Feb 13 00:00:00 CST 2022;打印结果为2022年2月13号,CST是时区的表达方式,中国标准时间China Standard Time。
date.getYear();//拿到的是122 2022-1900
date.getMonth();拿到的是1,虽然是2月份,但是从0开始计数。
date类的缺点很明显,year和month都不太符合常规。
calendar类
Calendar calendar = Calendar.getInstance();//获取当前时间
System.out.println(calendar.get(calendar.YEAR));//年打印结果为2022年
System.out.println(calendar.get(calendar.MONTH));//但是month确实8,因为角标也是从0开始的
//另外一种创建方式
Calendar build = new Calendar.Builder().setInstant(System.currentTimeMillis()).build();
new Calendar.Builder().setTimeZone()//设定时区,默认为当前时区,一般不设置
new Calendar.Builder().setLocale()//设置地区,默认为当前地区,一般不设置
calendar类缺点:月份不合理,从0开始计数。进行add,set操作时,对当前对象进行操作,不会创建副本。
time类
1. 先了解UTC GMT UT的区别
GMT:格列尼天文台观测的时间,早期作为世界时间。
UT:根据原子时钟算出来的世界时间。
UTC:由于地球自转影响,UT时间每年会慢零点几秒,根据便宜纠正后的世界时间,现在作为世界标准时间来计算使用。
2. 时区id来设置时区:
ZoneId zoneId = ZoneId.of("UTC+8");//utc配合加减的写法,根据查时区,中国处在加8时区
ZoneId zoneId = ZoneId.of("Asia/Shanghai");//效果同上
TimeZone.getTimeZone(zoneId);//通过时区id来设置时区
# Instant类
Instant instant = Instant.now();//通过Instant类创建当前时间
Instant time = instant.truncatedTo(ChronoUnit.SECONDS);
System.out.println(time);
# LocalDateTime类
LocalDateTime localDateTime = LocalDateTime.now();//通过LocalDateTime类获取当前时间
System.out.println(localDateTime);
LocalDateTime diyTime = LocalDateTime.of(2022,9,18,0,0,0);
System.out.println(diyTime);//获取2022年9月18号凌晨0点的时间
LocalDateTime没有时区的概念,ZonedDateTime有时区的概念,可以相互转化,通过时区id来设置:
ZonedDateTime zonedDateTime = localDateTime.atZone(ZoneId.of("UTC+8"));//设置时区,返回类型为ZonedDateTime类
# ZonedDateTime类
ZonedDateTime z0 = ZonedDateTime.now(ZoneId.of("UTC"));//0时区的当前时间,打印信息包含时区为[UTC]
ZonedDateTime z8 = ZonedDateTime.now();//+8时区的当前时间,打印结果包含时区,时区为[Asia/Shanghai]
System.out.println(z0);//2022-09-18T03:37:06.751Z[UTC]
System.out.println(z8);//2022-09-18T11:37:06.751+08:00[Asia/Shanghai]
时间格式化
1. SimpleDateFormat类,线程不安全。
public static void main(String[] args) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date parse = sdf.parse("2022-09-18 11:48:00");
String format = sdf.format(new Date());
System.out.println(parse);
System.out.println(format);
}
2. DateTimeFormatter类
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
System.out.println(dtf.format(LocalDateTime.now()));
System.out.println(dtf.format(ZonedDateTime.now()));
3. LocalDateTime类的parse方法,传入的时间参数多了个T
LocalDateTime.parse("2022-09-18T11:48:00");
4. ZonedDateTime类的parse方法,传入的参数比较复杂,建议用LocalDateTime的parse方法
ZonedDateTime.parse("2007-12-03T10:15:30+01:00[Europe/Paris]");