8. util包常用类

util包常用类

1. 日期类

1.1 Date

代表的是一个特定的时间。 java.util.Date jdk1.8-

Date() 获得当前系统的默认时间
Date(long date) 通过指定毫秒数创建Date类对象  
 public static void main(String[] args) {

        Date date = new Date();
        System.out.println(date);//Wed Dec 09 16:00:13 CST 2020

        System.out.println(date.getYear()+1900);//120
        System.out.println(date.getMonth()+1);//0-11
        System.out.println(date.getDay());

        System.out.println(date.getTime());

        //获得当前时间毫秒数
        long millis = System.currentTimeMillis();
        System.out.println(millis);

        Date date1 = new Date(millis);
        System.out.println(date1);
    }

1.2 Calander

日历

public abstract class Calendar
extends Object
implements Serializable, Cloneable, Comparable<Calendar>
static Calendar getInstance()  
int get(int field)  
void set(int field, int value)  
abstract void add(int field, int amount)  
    
public static void main(String[] args) {
        //1.获得Calander对象
        Calendar calendar = Calendar.getInstance();//获得的肯定是子类的对象  多态
        System.out.println(calendar);
        //2.获得属性的信息
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH)+1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println(calendar.get(Calendar.DATE));
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));

        //3.修改具体属性值
//        calendar.set(Calendar.YEAR,2019);
        //+10
//        calendar.set(Calendar.DATE,calendar.get(Calendar.DATE)+5);
        //add
        calendar.add(Calendar.DAY_OF_MONTH,5);

        System.out.println("===============================");
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH)+1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println(calendar.get(Calendar.DATE));
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));


        //4.Calendar 与  DATE
        Date date = new Date();
        //date  +5
        //1.date 转 Calendar
        calendar.setTime(date);
        calendar.add(Calendar.MONTH,1);
        System.out.println("===============================");
        System.out.println(calendar.get(Calendar.YEAR));
        System.out.println(calendar.get(Calendar.MONTH)+1);
        System.out.println(calendar.get(Calendar.DAY_OF_MONTH));
        System.out.println(calendar.get(Calendar.DATE));
        System.out.println(calendar.get(Calendar.DAY_OF_WEEK));

        //2.Calendar 转 date
        Date time = calendar.getTime();
        System.out.println(time);


    }

1.3 java.time.*

所有的类都是线程安全 且 值不可变

Instant: 顺时点  
//LocalDate: 年月日
LocalTime:时分秒
//LocalDateTime: 年月日   时分秒

Instant 表示时间线上的瞬时点

public final class Instant
extends Object
implements Temporal, TemporalAdjuster, Comparable<Instant>, Serializable

static Instant now()  
static Instant now(Clock clock)  
 

Instant plus(TemporalAmount amountToAdd)   TemporalAmount 时间量   Duration  Period
Instant plus(long amountToAdd, TemporalUnit unit)     添加指定时间单位量
      TemporalUnit: 时间单位  ChronoUnit
Instant plusMillis(long millisToAdd)  
Instant plusSeconds(long secondsToAdd)  
          
Instant minus(long amountToSubtract, TemporalUnit unit)  实现类: ChronoUnit
          
          
 int get(TemporalField field)   ChronoField 与日期相关的属性
          
 long until(Temporal endExclusive, TemporalUnit unit)   计算2个日期之间间隔
          
 //推荐使用Instant替换Date
    public static void main(String[] args) {

        //1.获得Instant对象  不可变
        Instant now = Instant.now();
//        System.out.println(now);//2020-12-10T02:01:57.178Z   UTC的时间
        //+8

//        now = now.plusSeconds(8*3600);
//        now = now.plus(Duration.ofHours(8));
//        now = now.plus(8,ChronoUnit.HOURS);

//        now = Instant.now(Clock.offset(Clock.systemUTC(), Duration.ofHours(8)));

        //无法获得特定的时间属性的数据
//        System.out.println(now.get(ChronoField.YEAR));

        //计算2个日期之间的间隔

        Instant instant = Instant.now().plus(Duration.ofDays(10));
        instant = instant.plus(Duration.ofHours(5));
        System.out.println(now);
        System.out.println(instant);

        long until = Math.abs(instant.until(now, ChronoUnit.HALF_DAYS));
        System.out.println(until);

    }

LocalDateTime

public final class LocalDateTime
extends Object
implements Temporal, TemporalAdjuster, ChronoLocalDateTime<LocalDate>, Serializable
static LocalDateTime now()  
static LocalDateTime of(int year, int month, int dayOfMonth, int hour, int minute)  
static LocalDateTime of(int year, Month month, int dayOfMonth, int hour, int minute)  
    
    
LocalDateTime plus(long amountToAdd, TemporalUnit unit)  
LocalDateTime plus(TemporalAmount amountToAdd)  
LocalDateTime plusDays(long days)  
    ....
    
LocalDateTime minus(long amountToSubtract, TemporalUnit unit)  
LocalDateTime minusDays(long days) 
    .....
    
LocalDateTime withMonth(int month)  修改
LocalDateTime withYear(int year)  
    ....
    
Month getMonth()  
int getYear()  
    
boolean isAfter(ChronoLocalDateTime<?> other)  
boolean isBefore(ChronoLocalDateTime<?> other)  
    
long until(Temporal endExclusive, TemporalUnit unit)  
public static void main(String[] args) {

        LocalDateTime now = LocalDateTime.now();
        System.out.println(now);//2020-12-10T10:37:05.828

        LocalDateTime time1 = LocalDateTime.of(2020, 12, 10, 12, 30, 30);
//        LocalDateTime time2 = LocalDateTime.of(2020, Month.DECEMBER, 10, 12, 30, 30);
//
//        System.out.println(time1);
//        System.out.println(time2);

        now = now.plusDays(10);
        now = now.minusYears(1);

       /* System.out.println(now.get(ChronoField.YEAR));
        System.out.println(now.getYear());

        DayOfWeek dayOfWeek = now.getDayOfWeek();
        System.out.println(dayOfWeek);

        System.out.println(now.getMonth());
        System.out.println(now.getMonthValue());*/

        System.out.println(now);
        System.out.println("time1:"+time1);

        System.out.println(time1.until(now,ChronoUnit.DAYS));
        
    }

2. 格式化类

java.text.Format—> DateFormat NumberFormat

2.1 DateFormat

SimpleDateFormat 格式化日期

SimpleDateFormat(String pattern) 
实现Date与String之间的转换:
  parse()
  format()   
public class DateUtil {

    private static final String PATTERN = "yyyy-MM-dd HH:mm:ss";
    //字符串转Date
    public static Date strConvertToDate(String dateStr) {
        Objects.requireNonNull(dateStr);
        DateFormat dateFormat = new SimpleDateFormat(PATTERN);

        Date date = null;
        try {
            date = dateFormat.parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    //Date 转  字符串
    public static String dateConvertToStr(Date date) {
        Objects.requireNonNull(date);
        DateFormat dateFormat = new SimpleDateFormat(PATTERN);
        return dateFormat.format(date);
    }

}
public class DateUtil {

    private static final String PATTERN = "yyyy-MM-dd HH:mm:ss";

    //SimpleDateFormat 线程不安全的类
//    private static DateFormat dateFormat = new SimpleDateFormat(PATTERN);

    //有没有更加好的方式: 解决内存过大的问题  还有提高效率的问题?  ThreadLocal: 以空间换时间
    //每个线程各自有一个SimpleDateFormat对象 相互不干扰 代表着SimpleDateFormat的创建 删除  修改 都交给ThreadLocal进行维护
    //2个线程  创建2个SimpleDateFormat对象    以空间换时间

    private static final ThreadLocal<SimpleDateFormat> THREAD_LOCAL = new ThreadLocal() {
        @Override
        protected SimpleDateFormat initialValue() {
            System.out.println("-------------------");
            return new SimpleDateFormat(PATTERN);
        }
    };
    //默认执行initialValue

    //3种方式:
    //1. 充当局部变量 浪费内存空间  调用一次方法 就要new一次对象
    //2. 充当成员变量  synchronized  效率很低  等同于单线程
    //3. 使用ThreadLocal(为每个线程创建相对应的一个对象)

    //字符串转Date
    public static  Date strConvertToDate(String dateStr) {
        //作为成员变量存在  可以使用synchronized解决  效率很低
        Objects.requireNonNull(dateStr);
        //作为局部变量 20块内存 浪费内存空间
        Date date = null;
        try {
//            SimpleDateFormat format = THREAD_LOCAL.get();
//            format.hashCode();
//
//            System.out.println(Thread.currentThread().getName()+":"+);//null

            date = THREAD_LOCAL.get().parse(dateStr);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }

    //Date 转  字符串
    public static synchronized String dateConvertToStr(Date date) {
        Objects.requireNonNull(date);
        return THREAD_LOCAL.get().format(date);
    }
}
DateTimeFormatter  只能格式化java.time.Instant/LocalDate/LocalDateTime   线程安全
 private static final String PATTERN = "yyyy年MM月dd HH:mm:ss";

    public static void main(String[] args) {
//        String str = "2020-01-01 12:00:00";

        //str 转  LocalDateTime

//        System.out.println(LocalDateTime.now());
//        LocalDateTime localDateTime = LocalDateTime.parse("2020-12-03T10:15:30");
//        System.out.println(localDateTime);

//        LocalDateTime parse = LocalDateTime.parse(str, DateTimeFormatter.ofPattern(PATTERN));
//        System.out.println(parse);

        //Str 无法直接转换Instant
//        System.out.println(Instant.parse(str));//2007-12-03T10:15:30.00Z
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(PATTERN);
//        Instant instant = (Instant) formatter.parse(str);
//        System.out.println(instant);//{},ISO resolved to 2020-01-01T12:00
        //java.lang.ClassCastException: java.time.format.Parsed cannot be cast to java.time.Instant

        //LocalDateTime
//        LocalDateTime now = LocalDateTime.now();
//        String format = now.format(formatter);
//        System.out.println(format);

        formatter = formatter.withZone(ZoneId.systemDefault());

        Instant now = Instant.now();
        System.out.println(now);
        String format = formatter.format(now);
        System.out.println(format);
        
    }

2.2 NumberFormat

DecimalFormat

DecimalFormat(String pattern) 
 public static void main(String[] args) {
        double num = 1.5348575656;
        //使用了NumberFormat格式化10进制的数据  最后结果都是字符串

        //1.保留指定小数点后面的位数
//        long round = Math.round(num);
//        System.out.println(round);
        String pattern = "###.####";
        NumberFormat numberFormat = new DecimalFormat(pattern);
//
//        String format = numberFormat.format(num);
//        System.out.println(format);

        //2.将小数转换成百分制的数字
        num = 0.001635535;
        pattern = "####.#####%";
        numberFormat = new DecimalFormat(pattern);
        System.out.println(numberFormat.format(num));

        //3. 银行存额: 25534383274354
        double money = 25534384354.535436;
        pattern = ",###.####";
        numberFormat = new DecimalFormat(pattern);
        String format = numberFormat.format(money);
        System.out.println(format);
    }

3. 随机数类

Math.random()-----> Random---->伪随机

Random() 
Random(long seed)     
int nextInt(int bound)  
 for (int i = 0; i < 3; i++) {
     Random random = new Random();
     for (int i1 = 0; i1 < 5; i1++) {
         int num = random.nextInt(9000) + 1000;
         System.out.print(num + ", ");
     }
     System.out.println();
 }

System.out.println("-----------------------------------");

for (int i = 0; i < 3; i++) {
    Random random = new Random(100);
    for (int i1 = 0; i1 < 5; i1++) {
        int num = random.nextInt(9000) + 1000;
        System.out.print(num + ", ");
    }
    System.out.println();
 }

ThreadLocalRandom 随机数类

static ThreadLocalRandom current()  
int nextInt(int origin, int bound)  
//java.util.Random的java.util.Random是线程安全的。 但是,跨线程的同时使用java.util.Random实例可能会遇到争用,从而导致性能下降
 ThreadLocalRandom current = ThreadLocalRandom.current();
 System.out.println(current.nextInt(10, 20));

4. 编码解码类

加密 解密操作---->用户的信息 路径(传参)

4.1 Base64

算法是可逆的。可以加密 也可以解密

 private static final String ENCODING = "UTF-8";

    public static String userRegister(String sourcePass) {
        Objects.requireNonNull(sourcePass);
        //Base64 编码  获得编码器
        Base64.Encoder encoder = Base64.getEncoder();
        //加密处理
        String encodePass = encoder.encodeToString(sourcePass.getBytes(Charset.forName(ENCODING)));
        return encodePass;
    }

    public static boolean userLogin(String sourcePass) {

        Objects.requireNonNull(sourcePass);
        String encodePass = "MTIzNA==";
        Base64.Decoder decoder = Base64.getDecoder();
        byte[] decode = decoder.decode(encodePass);
        //将字节数组转换成字符串
        String decodePass = new String(decode, Charset.forName(ENCODING));
        System.out.println("decodePass:" + decodePass);
        if (!Objects.equals(sourcePass, decodePass)) {
            return false;
        }
        return true;
    }

    public static void main(String[] args) {
//        String s = userRegister("1234好获得", "UTF-8");
//        System.out.println(s);//MTIzNA==
        System.out.println(userLogin("1234"));

    }

4.5 MessageDigest

信息摘要算法: MD5 SHA-256 SHA-1

1234---->81dc9bdb52d04dc20036dbd8313ed055---->16进制的数据
    
public class MD5Util {

    private MD5Util() {
    }

    private static final String ENCODING = "UTF-8";
    //盐值 salt  普通字符串 增加破译的难度
    private static final String SALT = "^$#&shangma_^$#&";

    public static String encodeStr(String sourceStr) {
        Objects.requireNonNull(sourceStr);

        //MD5
        //1byte  8bit
        //1个字节占2个16进制的数据
        //1个16进制4个二进制位

        //1.创建信息摘要对象
        MessageDigest messageDigest = null;
        try {
            messageDigest = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        sourceStr = sourceStr + SALT;

        //2.将加密的字符串提交到messageDigest
        messageDigest.update(sourceStr.getBytes(Charset.forName(ENCODING)));

        //3.执行加密
        byte[] bytes = messageDigest.digest();
        //将字节数组转换成16进制字符串数据
        //不管是多少进制的数据  都是数值型

//        BigInteger bigInteger = new BigInteger(1,bytes);
//        System.out.println(bigInteger);
//        String s = bigInteger.toString(16);
//        System.out.println(s.toUpperCase());

        return new BigInteger(1, bytes).toString(16).toUpperCase();
    }
}   
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值