JAVA8新特性-03-日期时间API&Base64

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’作为分割。编码输出最后没有行分割。
序号方法名&描述
1static Base64.Decoder getDecoder() 返回一个 Base64.Decoder ,解码使用基本型 base64 编码方案。
2static Base64.Encoder getEncoder() 返回一个 Base64.Encoder ,编码使用基本型 base64 编码方案。
3static Base64.Decoder getMimeDecoder() 返回一个 Base64.Decoder ,解码使用 MIME 型 base64 编码方案。
4static Base64.Encoder getMimeEncoder() 返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案。
5static Base64.Encoder getMimeEncoder(int lineLength, byte[] lineSeparator) 返回一个 Base64.Encoder ,编码使用 MIME 型 base64 编码方案,可以通过参数指定每行的长度及行的分隔符。
6static Base64.Decoder getUrlDecoder() 返回一个 Base64.Decoder ,解码使用 URL 和文件名安全型 base64 编码方案。
7static 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());
        }
    }
}

转自:https://blog.csdn.net/yitian_66/article/details/81010434

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值