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),我们无法指定时区
java.util.Date(Java1.0)
//为了构造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

java.util.Calender
Calendar cal = Calender.getInstance(); cal.add(1,Calender.MONTH); //当前日期添加一个月

在Calender类中

  • 可以设置时区
  • Calender的年不再是从1900年开始的
    然而
  • 月份和Date类一样是从0开始的,不符合认知。
  • 可以对时间修改,但修改的是当前声明的对象。

java.util包中的日期格式化

java.text.SimpleDateFormat
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 协议 ,转载请注明出处!