学编程,来源栈;先学习,再交钱
当前系列: Java语法 修改

复习:计算机中的时间


日期时间

因为历史原因,比较混乱,演化至Java 8:

  • 1.0:Date
  • 1.1:Calendar
  • 1.8:*DateTime(包含:LocalDateTime/ZonedDateTime、LocalDate/LocalTime……) / Duration / Period……

获取当前/设定时间

获取当前时间:

Date dNow = new Date();

//抽象类,没法new(),获得的是GregorianCalendar子类
Calendar cNow = Calendar.getInstance();    

//当前日期和当前时间
LocalDate today = LocalDate.now();
LocalDateTime now = LocalDateTime.now();

获取年月日、星期几、小时分钟数等属性:

  • Date
    System.out.println(dNow.getYear()+1900);   //从1900年开始的
    System.out.println(dNow.getMonth()+1);  //从0开始计算的
    //System.out.println(dNow.getWeek());   没有直接获取星期几的
  • Calendar
    System.out.println(cNow.get(Calendar.YEAR));    //年份正常
    System.out.println(cNow.get(Calendar.MONTH));		//从0开始计算的
    System.out.println(cNow.get(Calendar.DAY_OF_WEEK));   //从星期天开始算
    System.out.println(cNow.get(Calendar.WEEK_OF_MONTH));   //第几个星期
  • LocalDate(Time):一切正常,几乎完美
    System.out.println(today.getYear());
    
    System.out.println(today.getMonth());    //返回的是枚举值
    System.out.println(today.getMonth().getValue());    //从1开始
    System.out.println(today.getMonthValue());
    
    System.out.println(today.getDayOfWeek());    //返回枚举值
    System.out.println(today.getDayOfWeek().getValue());    //星期一开始

设定时间:

new Date(2012, 3, 5);    //deprecated

//Calendar略显尴尬,需要先拿到一个当前时间
cNow.clear();  
cNow.set(Calendar.DAY_OF_MONTH, 8);

//直接of方法,指定年月日、小数分钟数等
LocalDateTime.of(2021, 8, 28, 12, 35);

输出格式

首先需要指定Format(格式):
  • SimpleDateFormat:适用于Date
    SimpleDateFormat cn = new SimpleDateFormat("yyyy年MM月dd日  HH点mm分ss秒");
  • DateTimeFormatter:使用于*DateTime
    DateTimeFormatter cn = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");
那Calendar呢?^_^,转换成Date后再格式化输出
Date now = Calendar.getInstance().getTime();

字符串转时间

假设有一个日期字符串:
String strDate = "2021-08-13 21:43";
转成Date:
Date dNow = cn.parse(strDate);    //cn是SimpleDateFormat

Date再转成Calendar:

Calendar cNow = Calendar.getInstance();
cNow.setTime(dNow);

*LocalDateTime可以直接调用parse方法:

LocalDateTime.parse(strDate, cn);    //不指定DateTimeFormatter使用当前地区的默认值

运算

比较(compare):是之前(before),之后(after),还是同一时间

System.out.println(another.compareTo(now));	//返回:0/1/-1

//Date和Calendar
System.out.println(now.after(another));    //返回:boolen
System.out.println(now.before(another));

//*DateTime:方法名更规范
System.out.println(now.isBefore(another))

加减时间:add/plus、minus

//Calendar:
//只有一个add()方法,参数指定增/减单位(field)
//修改调用对象,返回void
now.add(Calendar.DAY_OF_MONTH, 1);
now.add(Calendar.MINUTE, -10);
System.out.println(now.getTime());

//*DateTime:有plus,有minus,方法名直接表明增减单位
//可以连缀,返回加减后时间
System.out.println(now.minusDays(10).plusHours(2));
//调用对象本身不改变
System.out.println(now);

获取时间段(between):

  • 老方法:Date.getTime()获取时间戳,然后相减,再除:
    System.out.println((now /* Date */
    		.getTime()-(new Date(110,0,1)).getTime()) / 
    		(365*24*60*60*1000L));    //注意这个L
  • Java 8以后:Period(日期)、Duration(时间)
    Duration span = Duration.between(now /* LocalDateTime */,
    		LocalDateTime.of(2019, 2, 18, 8, 0));
    //能拿到日小时分钟等,拿不到年月等
    System.out.println(span.toDays());
    System.out.println(span.toHours());
    
    
    Period span = Period.between(now /* LocalDate */, 
    		LocalDate.of(2019, 2, 18));
    //能拿到年月日,拿不到小时分钟秒等
    System.out.println(span.getYears());
    System.out.println(span.getMonths());

Instant

Java 8 新引入的类,是能精确到纳秒级(1毫秒=1000000纳秒)的时间戳。

之前的Date和Calendar只有毫秒级的精度,他们都可以通过实例方法toInstant()获得其所对应的Instant对象,从而:

  • 得到纳秒级精度
    //没有Instant,就最多只能拿到毫秒
    System.out.println(now.get(Calendar.MILLISECOND));
    System.out.println(now.toInstant().getNano());
    //*DateTime本来就可以拿到纳秒
    System.out.println(LocalDateTime.now().getNano());
  • 用于升级到*DateTime类型
    LocalDateTime time =    //Instant本身没有时区历法概念,需要指定
    		LocalDateTime.ofInstant(now.toInstant(), ZoneId.systemDefault());


作业

见:编程语言,时间漫谈


日期 时间
觉得很 ,不要忘记分享哟!

任何问题,都可以直接加 QQ群:273534701

在当前系列 Java语法 中继续学习:

我们的 特色

  • 先学习,后付费
  • 线上/线下,自由组合

更多了解

QQ群:273534701

答疑解惑,远程debug……

B站 源栈-小九 的直播间

写代码要保持微笑 (๑•̀ㅂ•́)و✧