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]");

posted on 2022-09-18 11:58  张少凯  阅读(136)  评论(0编辑  收藏  举报

导航