Java8:新的时间库java.time

写在前面

Java8刚发布没多久,只是带着“追新”的心里。去试了试最新版的时间库.(java.time).在java.time发布之后,估计java.util.Date,java.text.SimpleDateFormat还是会用上一段时间的.不过新时间库看起来真的是下了一番功夫.

大概如下:

  • LocalDate:位于java.time,主要代表的是:yyyy-MM-dd的日期类型.
  • LocalDateTime:位于java.time,主要代表的是:yyyy-MM-dd HH:mm:ss.SSS的日期类型.
  • LocalTime:同上,只是代表的是HH:mm:ss.SSS的日期类型.
  • 新api大多数类都有plus(加),minus(减),of,parse,get等这些方法,用起来很方便.

java标志
image-2187

介绍

如果你要找api文档,可以访问:【Java8英文在线api

先看一下在java8以前是怎么格式化时间的:

1
2
3
//import java.util.Date;
//import java.text.SimpleDateFormat;
new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS ").format(new Date(System.currentTimeMillis()));

[在继续阅读之前,请确认你已经安装了Java8.]

获取当前时间

然后我们看下如何在[Java8]中运行呢:

1
2
3
4
5
//import java.time.LocalDateTime;
LocalDateTime.now();
//在LocalDateTime类中,有分别获取年、月、日、时、分、秒的方法.类似java.util.Calendar的用法.
//格式化也就更自由一些,具体可以参考LocalDateTime类.
//输出:2014-07-29T11:10:15.225

一行就搞定了(oracle在后台帮我们做了很多事情),只是在格式上有出入而已.[我始终有点不明白为啥中间要多个(T)].

获取年月日

1
2
3
//import java.time.LocalDate
LocalDate.now();
//在LocalDate类中,有分别获取年、月、日的方法.类似java.util.Calendar的用法.

获取时分秒

1
2
3
//import java.time.LocalTime;
LocalTime.now();
//在LocalTime类中,有分别获取时、分、秒的方法.类似java.util.Calendar的用法.

将字符串转换成LocalDateTime类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;
//转换日期
        String input = "2014-05-01 11:10:20";

        try {
            DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
                    "yyyy-MM-dd HH:mm:ss");
            LocalDate date = LocalDate.parse(input, formatter);
            System.out.printf("%s%n\n", date);
        } catch (DateTimeParseException exc) {
            System.out.printf("%s is not parseable!%n", input);
            throw exc;
        }

时间偏移:计算你的生日还有多久

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
//import java.time.LocalDate;
//import java.time.Month;
//import java.time.Period;
//import java.time.temporal.ChronoUnit;

        LocalDate today = LocalDate.now();
        LocalDate birthday = LocalDate.of(1910, Month.JANUARY, 1);
        LocalDate nextbday = birthday.withYear(today.getYear());

        if (nextbday.isBefore(today) || nextbday.isEqual(today)) {
            nextbday = nextbday.plusYears(1);
        }
        //计算还有多少天是下一次生日.
        Period p = Period.between(today, nextbday);//计算时间偏移,返回Period
        long p2 = ChronoUnit.DAYS.between(today, nextbday);//计算相差多少天
        System.out.println("There are " + p.getMonths() + " months, and " +
            p.getDays() + " days until your next birthday.( " + p2 +
            " total )");
        System.out.println("------------------------------------------");
        //计算多少岁.
        Period ps2 = Period.between(birthday, today);
        long ps3 = ChronoUnit.DAYS.between(birthday, today);
        System.out.println("you are  " + ps2.getYears() + " years," +
            ps2.getMonths() + " months, and " + ps2.getDays() + " days old.( " +
            ps3 + " total )");

//Period用于计算两个时间之间,相距几年几月几天。
//ChronoUnit是一个枚举,定义了各种标准时间单位.
//另外在DayOfWeek、Month中定义了很多现成的枚举,方便直接调用.

java.time一部分类的简介

newtimesapi
image-2188

红色圈中的说明该类可能经常用到.

PS上图中最后三行英文的翻译:

  • *:秒捕获纳秒精度.
  • **:这个类不存储这些信息,但在这些单元方法提供时间.
  • ***:当一个Period添加到一个ZoneDateTime,会发生差异.

升级到java8

假如,我要从之前的版本升级到java8,对于日期操作,新版与旧版的对比如下:

Java时间类对比
image-2189

后面的

在这上面写的很不足,因为每个人的需求不一样.

所以有更多需求还是去看java8的api文档吧.

另外推荐两篇文章:Java8的Lamb表达式

Java 8新特性:全新的Stream API

Linux:千万不要批量修改文件权限

问题

事情是这样的,有一天我发现/usr/目录下面的文件访问不了,然后一生气,我就直接执行了.

1
2
//linux命令
chmod 755 /usr/bin -R

之后的事情就复杂了,各种没办法从普通用户切换(su,sudo)到root用户,即使root密码是对的,也提示输入错误,没有别的任何错误.

linux命令
image-2161

上面就是报错的截图,完全看不出来任何错误啊!

解决办法

  1. 千万不要手贱去批量执行修改文件权限的命令及修改文件属主的命令[当然了,在/home/用户目录里面还是没多大问题]
  2. 如果执行了,假设你是虚拟机安装的,恭喜你还有解决办法。那就是在装一个同样的操作系统,看下文件权限改回去
  3. 其他不知道了……[我也救不了你们啊]

关于/usr/bin/su和/usr/bin/sudo的权限是:

1
2
//两个文件一样.
rwsr-xr-x

s是一个特殊的权限,下面的文字引用自网络,供参考:

Linux文件权限基本概述:

1.基本权限:可读(r) 可写(w) 可编辑(x)

2.特殊权限:SUID SGID SBIT

3.隐藏权限:通过[lsattr]查看,[chattr]设置;由于文件的隐藏权限种类较多(13种),在此不作具体说明;可以通过[man chattr]来查看各个隐藏权限的具体意义(非常详细);

需要强调的是,文件的隐藏权限只有在Ext2及其后续版本的文件系统才生效(摘自鸟哥Linux教程基础篇)

更多关于特殊权限可以参考:文件特殊权限: SUID, SGID, SBIT

我的普通用户还不能用ping哪……