java中的time
关于时间
GMT时间
格里尼治天文台观测时间
UT时间
UT(Universal Time)世界时间,原子钟时间。
UTC时间
UTC时间,世界协调时,是结合了GMT观测时间和世界时间的(UC)结合后的调整时间。
UTC的0时区在英国(本初子午线从跨英国)
中国的时区是东八区去(UTC+8),CST(中国标准时区)
ZoneId.of("UTC") //0时区
ZoneId.of("UTC+0") //0时区
ZoneId.of("UTC+8") //8时区 == CST
ZoneId.of("Asia/Shanghai"); // UTC+8
ZoneId zid= ZoneId.of("EST",ZoneId.SHORT_IDS);
TimeZone.getTimeZone(zid);
一、早期的日期API
Date
需要注意的是在java.util.Date这个类
- 无法表示日期,只能以毫秒的精度表示时间
- 年是从 1900 年开始
- 月份是从0开始的
- 时区用的是系统的默认时区,中国标准时区(CST),我们无法指定时区
//为了构造2022年,你不得不用2022-1900这样的参数构造年;同样2月份你得用“2-1”作为参数
Date date = new Date(2022-1900,11,23)
//java.util.Date的toString()方法的输出也不是很清晰
System.out.println(date.toString());
//Fri Dec 23 00:00:00 CST 2022
Calender
在Java 1.1中,Date类的很多方法被废弃了,取而代之的是java.util.Calender
Calendar cal = Calender.getInstance();
cal.add(1,Calender.MONTH); //当前日期添加一个月
在Calender类中
- 可以设置时区
- Calender的年不再是从1900年开始的
然而 - 月份和Date类一样是从0开始的,不符合认知。
- 可以对时间修改,但修改的是当前声明的对象。
java.util包中的日期格式化
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2022-02-13 17:00:00");
SimpleDateFormat是线程不安全的,多线程使用的时候要每个线程声明一个单独变量。
新的日期和时间API
Instan
新的AP用Instan类来表示机器时间,概念上更明确。
Instan内部使用Unix元年时间(传统设定为UTC时区1970年一月1日午夜时分)开始所经历的秒数进行计算,另外内部还有个存储纳秒字段。
因此Instan能够满足对时间精度更高要求的场景。
//时间 seconds+nanos
Instant instan = Instan.now();
instan.truncatedTo(HOURS);//取整
Zoneninstant.atZone(ZoneId.of("UTC"));
LocalDateTime
替代java.util中的Date,不含时区概念,没有年是从1970、月份是从0开始问题
LocalDateTime localDateTime = LocalDateTime.now();
//转化带时区的时间
ZonedDateTime zoneDateTime = localDateTime.atZone(ZoneId.of("UTC"));
System.out.println(locaDateTime.getYear()) //2022
System.out.println(localDateTime.getMonth()) //FEBRUARY
// 2022-2-13 00:00:00
LocalDateTime localDateTime1 = LocalDateTime.of(2022,2,13,0,0,0);
ZonedDateTime
带时区的时间
//创建一个0时区的时间
ZonedDateTime z0 = ZonedDateTime.now(ZoneId.of("UTC"));
//默认无参是系统时区
ZonedDateTime z8 = ZonedDateTime.now();
System.out.println(z8);
System.out.println(z0);
System.out.println(z8.toLoalDateTime());
System.out.println(z0.toLoalDateTime());
java.time包中的日期格式化
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
//日期格式化为字符串
String nowStr = dtf.format(LocalDateTime.now());
System.out.prinln(nowStr);
//字符串转化为日期
LocalDateTime localDateTime = LocalDateTime.parse("2007-12-03T10:15:30");
//进一步转化成带时区的时间
ZonedDateTime zonedDateTime =localDateTime.atZone(ZoneId.of("Europe/Paris"));
//也可以通过ZonedDateTime.parse()直接转化成带时区的时间
ZonedDateTime zonedDateTime1 = ZonedDateTime.parse("2007-12-03T10:15:30+01:00[Europe/Paris]")
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!