JAVA8新特性-03-日期时间API&Base64
java8通过发布新的Date-Time API(jsr 310)来进一步加强对日期与时间的处理
在旧版的java中,日期时间API存在诸多问题,其中有:
- 非线程安全 - java.util.Date是非线程安全的,所有的日期类都是可变的,这是java日期来的最大问题之一。
- 设计很差 - java的日期/时间类的定义并不一致,在java.util和java.sql的包中都有日期类,此外用于格式化和解析的类在java.text包中定义。java.util.Date同时包含日期和时间,而java.sql.Date仅包含日期仅包含日期,将其纳入java.sql包并不合理。另外这两个类都有相同的名字,这本身就是一个非常糟糕的设计。
- 时区处理麻烦 - 日期类并步提供国际化,没有时区支持,因此java引入了java.util。Calendar和java.util.TimeZone类,但他们同样存在上述所有的问题。
java8在java.time包下提供了很多新的API。以下为两个比较重要的API:
- Local(本地) - 简化了日期时间的处理,没有时区的问题。
- Zoned(时区) - 通过制定的时区处理日期时间
新的java.time包涵盖了所有处理日期,时间,日期/时间,时区,时刻(instants),过程(during)与时钟(clock)的操作。
8.1 本地化日期时间 API
LocalDate/LocalTime和LocalDateTime类可以在处理时区不是必须的情况。
public class Java8Time {
public static void main(String[] args) {
Java8Time java8Time = new Java8Time();
java8Time.testLocalDateTime();
}
public void testLocalDateTime() {
//获取当前的日期时间
LocalDateTime currentTime = LocalDateTime.now();
System.out.println("当前时间:" + currentTime);
//转换为日期对象格式
LocalDate date1 = currentTime.toLocalDate();
System.out.println("date1:" + date1);
//从当前日期时间对象中获取月/日/秒
Month month = currentTime.getMonth();
int day = currentTime.getDayOfMonth();
int seconds = currentTime.getSecond();
System.out.println("月:" + month + ",日:" + day + ",秒:" + seconds);
//修改当前时间的日期和年份
LocalDateTime date2 = currentTime.withDayOfMonth(20).withYear(2012);
System.out.println("date2 == " + date2);
//设置日期
LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12);
System.out.println("date3 == "+date3);
//设置时间
LocalTime date4 = LocalTime.of(22, 10);
System.out.println("date4 == "+date4);
//解析字符串
LocalTime date5 = LocalTime.parse("20:15:30");
System.out.println("date5 == " + date5);
}
}
8.2 使用时区的日期时间API
public class Java8Time1 {
public static void main(String[] args){
Java8Time1 java8Time1 = new Java8Time1();
java8Time1.testZoneDateTime();
}
public void testZoneDateTime(){
//获取当前带时区的日期时间
ZonedDateTime date1 = ZonedDateTime.now();
System.out.println("date1 == "+date1);
//获取当前的时区
ZoneId zone = date1.getZone();
System.out.println("zone == " + zone);
//获取系统当前的默认时区
ZoneId zoneId = ZoneId.systemDefault();
System.out.println("系统默认的时区: " + zoneId);
}
}
九,Java8 Base64
在java8中,Base64编码已经成为Java类库的标准。
java8内置了Base64编码的编码器和解码器
Base64工具类提供了一套静态方法获取下面三种Base64编解码器。
- 基本:输出被映射到一组字符A-Za-z0-9+/,编码不添加任何航标,输出的解码仅支持A-Za-z0-9+/。
- URL:输出映射到一组字符A-Za-z0-9+_,输出的是URL和文件。
- MIME:输出映射到MIME友好格式。输出每行不超过76字符,并使用’\r’并跟随’\n’作为分割。编码输出最后没有行分割。
序号 | 方法名&描述 |
---|---|
1 | static Base64.Decoder getDecoder() 返回一个 Base64.Decoder ,解码使用基本型 base64 编码方案。 |
2 | static Base64.Encoder getEncoder() 返回一个 Base64.Encoder ,编码使用基本型 base64 编码方案。 |
3 | static Base64.Decoder getMimeDecoder() 返回一个 Base64.Decoder ,解码使用 MIME 型 base64 编码方案。 |
4 | static Base64.Encoder getMimeEncoder() 返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案。 |
5 | static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) 返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。 |
6 | static Base64.Decoder getUrlDecoder() 返回一个 Base64.Decoder ,解码使用 URL 和文件名安全型 base64 编码方案。 |
7 | static Base64.Encoder getUrlEncoder() 返回一个 Base64.Encoder ,编码使用 URL 和文件名安全型 base64 编码方案。 |
**注意:**Base64类的很多方法从java.lang.Object类继承。
public class Java8Tester {
public static void main(String args[]) {
try {
// 使用基本编码
String base64encodedString = Base64.getEncoder().encodeToString("runoob?java8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (基本) :" + base64encodedString);
// 解码
byte[] base64decodedBytes = Base64.getDecoder().decode(base64encodedString);
System.out.println("原始字符串: " + new String(base64decodedBytes, "utf-8"));
base64encodedString = Base64.getUrlEncoder().encodeToString("TutorialsPoint?java8".getBytes("utf-8"));
System.out.println("Base64 编码字符串 (URL) :" + base64encodedString);
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < 10; ++i) {
stringBuilder.append(UUID.randomUUID().toString());
}
byte[] mimeBytes = stringBuilder.toString().getBytes("utf-8");
String mimeEncodedString = Base64.getMimeEncoder().encodeToString(mimeBytes);
System.out.println("Base64 编码字符串 (MIME) :" + mimeEncodedString);
} catch (UnsupportedEncodingException e) {
System.out.println("Error :" + e.getMessage());
}
}
}