1.日期类
1.1Date
1.2Calendar
特定的日历的时间。 抽象类
public class CalenderDemo {
public static void main(String[] args) {
//1.创建Calender对象
Calendar calendar = Calendar.getInstance(); //拿到系统当前此刻的日历时间
System.out.println(calendar);
//2.获得具体时间单位的数据 get(int filed属性) 属性可用Calender类里的属性
System.out.println(calendar.get(Calendar.YEAR)); //2022
System.out.println(calendar.get(Calendar.MONTH)+1); //2 月份需要加1,才是当前月份
System.out.println(calendar.get(Calendar.DAY_OF_MONTH)); //27
System.out.println(calendar.get(Calendar.DATE)); //27
System.out.println(calendar.get(Calendar.DAY_OF_WEEK)); //1 这一周的第五天,国外周日是第一天
//3.与date的相互转换
//Calender转date 用的getTime(),返Date
Date time = calendar.getTime();
System.out.println(time); //Sun Feb 27 12:27:50 CST 2022
//date转Calender 首先得有Date对象 然后还要有Calender实例 再用Calender的setTime(Date date)方法
Date date = new Date();
Calendar calendar1 = Calendar.getInstance();
calendar1.setTime(date);
//4.修改时间 set方法 或者add方法
//使用set
calendar.set(2020,Calendar.MONTH,1,12,30,30);
//月份不要写死,想改成2月,就得写成1月。最好用其常量维护(1-12月份是0-11的标识)
//之后查看日期,将变为修改后的日期
//add方法 add(int field,int amout) 现在要求从当前时间往后加10天
calendar.add(Calendar.DATE,10);
//若用set去做,set(int field,int value)
calendar.set(Calendar.DAY_OF_MONTH,calendar.get(Calendar.DAY_OF_MONTH)+10);
}
}
1.3LocalDate/LocalDateTime
public class Emp {
private Integer id;
private LocalDate hireDate; //员工出生时间
private LocalDate birthday; //员工生日
private LocalDateTime create_time; //员工创建时间
private LocalDateTime update_time; //员工信息修改时间
}
public class LocalDateDemo {
public static void main(String[] args) {
//LocalDate 用final修饰(没有子类),构造私有(不能new) 肯定用静态方法拿
//1.获得LocalDate实例 用LocalDate的静态方法,很多方法都返的实例 now() 或者 of
LocalDate now = LocalDate.now();
System.out.println(now); //2022-02-27 获得当前时间
//of(年,月,日) 一个全是int,一个月是Month类(枚举类),推荐用常量去写,不要写死
LocalDate localDate = LocalDate.of(2022, Month.MAY, 1);
System.out.println(localDate); //2022-05-01
//2.拿年,月,日
System.out.println(now.getYear()); //2022
System.out.println(now.getMonth()); //FEBRUARY 拿枚举的
System.out.println(now.getMonthValue()); //2 拿整型的
System.out.println(now.getDayOfMonth()); //27
//3.修改时间 plus加 minus减
now.plusDays(20); //这样做,不会加20天,值不可变。要想改变,要重新赋值
System.out.println(now); //2022-02-27
now = now.plusDays(20); //和String一样
System.out.println(now); //2022-03-19
//看plus带两参数的 plus(amountToAdd , TemporalUnit一个接口,用于限定)
now = now.plus(20, ChronoUnit.DAYS);
System.out.println(now); //2022-04-08
//plus带一个参的 plus(TemporalAmount一个接口,时间间隔)
now = now.plus(Period.ofDays(20));
System.out.println(now); //2022-04-28
//4.求两个日期的时间间隔 until方法
//until(ChronoLocalDate)
Period period = localDate.until(now);
System.out.println(period); //P-3D (Y年 M月 D日)
//until(Temporal ,TemporalUnit )
long days = now.until(localDate, ChronoUnit.DAYS);
System.out.println(days); //3
}
}
1.4 Instant
public class InstantDemo {
public static void main(String[] args) {
Instant now = Instant.now(); //拿的UTC(格林尼日时间)的时间,与中国时间差8小时
System.out.println(now); //2022-02-27T06:28:56.359890900Z
//求中国时间
now = now.plus(Duration.ofHours(8)); //操作年月日用period 时分秒用Duration
System.out.println(now); //2022-02-27T14:30:25.811234200Z
//加时间
now = now.plusSeconds(Duration.ofHours(8).getSeconds()) ; //括号里是8小时转秒数
}
}
2.格式化类Format
2.1格式化日期类DateFormat
(1)SimpleDateFormat
(2)DateTimeFormatter
@Data
public class DateTimeFormatterDemo {
private static final String PATTERN = "yyyy-MM-dd HH:mm:ss"; //创建时间格式
private static final DateTimeFormatter FORMATTER = DateTimeFormatter.ofPattern(PATTERN);
public static void main(String[] args) {
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDateTime); //2022-02-27T14:42:58.061979600
//不希望有T,和毫秒数,只要年月日和时分秒
//localDateTime 转String
String format = FORMATTER.format(localDateTime);
System.out.println(format); //2022-02-27 14:51:10
System.out.println("----------------------------------------");
//String转LocalDateTime
String create_time = "2022-02-27 14:51:10";
Emp emp = new Emp();
//emp.setCreate_time(create_time); 这里不能直接转
//字符串转哪一个Local对象,就调用这个类里的parse方法
LocalDateTime localDateTime1 = LocalDateTime.parse(create_time,FORMATTER); //必须用parse()带两个参数的
emp.setCreate_time(localDateTime1);
System.out.println(localDateTime1); //2022-02-27T14:51:10
System.out.println("============================================");
//String转LocalDate 也是parse,一个参两个参都行
String birthday = "2021-01-01";
emp.setBirthday(LocalDate.parse(birthday));
System.out.println(emp);
}
}
2.2格式化数字NumberFormat
一般针对小数和整数格式化,结果为字符串类型
何时用:1.保留小数点后几位 2.将小数转换成百分制 3.格式化钱数
public class DecimalDemo {
public static void main(String[] args) {
//保留两位小数
NumberFormat numberFormat = new DecimalFormat(".00"); //.##也可以
NumberFormat numberFormat1 = new DecimalFormat("00000.00"); //代表小数点前有5个数字
NumberFormat numberFormat2 = new DecimalFormat("#####.00");
double num = 100.56789;
String result = numberFormat.format(num); //结果为字符串类型
System.out.println(result); //100.57
String result1 = numberFormat1.format(num);
System.out.println(result1); //00100.57 不够用0填充
String result2 = numberFormat2.format(num);
System.out.println(result2); //100.57
}
}
public class DecimalDemo2 {
public static void main(String[] args) {
//百分数 在格式化对象时加个百分号即可
double num = 0.56789;
NumberFormat numberFormat = new DecimalFormat(".##%"); //格式化对象
String result = numberFormat.format(num);
System.out.println(result); //56.79% (四舍五入了)
//格式化金钱 每三个一个逗号 若钱太大,还会从小数点分成两部分
double money = 18546546465.32165416565;
NumberFormat numberFormat1 = new DecimalFormat("#,###.#### "); //格式化对象
String result1 = numberFormat1.format(money);
System.out.println(result1); //18,546,546,465.3217
}
}
3.随机数类 Random
ThreadLocalRadom 随机数 是Random的子类
public class RandomDemo {
public static void main(String[] args) {
for(int i=0;i<5;i++){
Random random = new Random(); //seed:当前纳秒数(时间会一直变) 无参
for(int j= 0;j<5;j++){
int num = random.nextInt(100); //产生0-100之间的随机整数,包头不包尾
System.out.print(num+",");
}
System.out.println();
}
System.out.println("-----------------");
//伪随机:种子一致时,数值可预测
for(int i=0;i<5;i++){
Random random1 = new Random(100); //seed:100 有参
for(int j= 0;j<5;j++){
int num = random1.nextInt(100); //产生0-100之间的随机整数,包头不包尾
System.out.print(num+",");
}
System.out.println();
}
ThreadLocalRandom random = ThreadLocalRandom.current();
int i = random.nextInt(1000, 10000); //拿1000-10000的随机数,包头不包尾
}
}
4.编码解码类
编码: 加密 看的懂得数据转化成看不懂的数据 (路径,参数,基本信息)
解码: 解密 看不懂的数据转换成看得懂的数据
4.1base64(1.8之后)
前台数据传输用的比较多
public class base64Demo {
private static final String ENCODING = "utf-8"; //加密规则
public static void main(String[] args) {
//用户注册 对密码执行加密处理
userRegister();
//用户登录,对注册时加密的密码解码处理
//userLogin();
}
private static boolean userLogin() {
Scanner input = new Scanner(System.in);
System.out.println("登录用户姓名:");
String name = input.next();
System.out.println("登录用户密码:");
String pass = input.next();
//登录时,系统会拿注册时的用户名和密码进行比对,假设已拿到
String regName = "admin";
String regPass = "MTIzNDU2";
//获得解码器
base64.Decoder decoder = base64.getDecoder();
byte[] decode = decoder.decode(regPass);
//字节数组转字符串
String decodepass = new String(decode,Charset.forName(ENCODING));
if(!Objects.equals(regName,name) || !Objects.equals(decodepass,pass)){
return false;
}
return true;
}
private static void userRegister() {
Scanner input = new Scanner(System.in);
System.out.println("请录入用户姓名:"); //admin
String name = input.next();
System.out.println("请录入用户密码:"); //123456
String pass = input.next();
//密文操作:对原密码加密处理
//获得编码器
base64.Encoder encoder = base64.getEncoder();
//开始编码 encodeToString(byte ) 需要字符串转字节数组
pass = encoder.encodeToString(pass.getBytes(Charset.forName(ENCODING )));
// name—pass
String info = String.join("-",name,pass);
System.out.println("用户注册成功,数据已经成功保存 ");
System.out.println(info); //admin-MTIzNDU2
}
}
4.2信息摘要算法 MessageDigest
抽象类,无子类,用静态方法实现
加密之后是16进制的字符串,该加密不可逆,无法破解。
public class MD5Util {
private MD5Util(){ //构造私有化
}
private static final String[] ARRAY = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
public static String md5EncodeStr(String sourceStr){
Objects.requireNonNull(sourceStr);
StringBuilder builder = new StringBuilder();
try {
//1.创建信息摘要的对象
MessageDigest messageDigest = MessageDigest.getInstance("MD5"); //括号里是加密规则,大小写不区分。检测括号里是否为加密规则,还是随意一个字符串,加一个try...catch...
//2.更新加密 将源数据提交到加密规则中
messageDigest.update(sourceStr.getBytes(Charset.forName("utf-8")));
//3.加密操作
byte[] bytes = messageDigest.digest();
//4.字节转字符串
//System.out.println("加密之后的数据:" + new String(bytes, Charset.forName("utf-8")));
//将每个字节转换成16进制数据,再拼接成字符串
//16进制从0-F 一个字节占8个二进制位 一个16进制数字占4个二进制位
//字节转16进制,一个字节要换成两个16进制内容
//高低位
for(byte aByte:bytes){
builder.append(byteToHexStr(aByte));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return builder.toString();
}
private static String byteToHexStr(byte aByte) {
int num = aByte; //先转为整型
if(num<0){ //aByte是小数,则补码
num+=256;
}
//高位和低位的运算
int lowIndex = num%16;
int highIndex = num/16;
return ARRAY[highIndex]+ARRAY[lowIndex];
}
public static void main(String[] args) {
System.out.println(md5EncodeStr("1234"));
}
}
public class MD5Util {
private MD5Util(){ //构造私有化
}
private static final String[] ARRAY = {"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
public static String md5EncodeStr(String sourceStr){
Objects.requireNonNull(sourceStr);
try {
//1.创建信息摘要的对象
MessageDigest messageDigest = MessageDigest.getInstance("MD5"); //括号里是加密规则,大小写不区分。检测括号里是否为加密规则,还是随意一个字符串,加一个try...catch...
//2.更新加密 将源数据提交到加密规则中
messageDigest.update(sourceStr.getBytes(Charset.forName("utf-8")));
//3.加密操作
byte[] bytes = messageDigest.digest();
//4.字节转字符串
//System.out.println("加密之后的数据:" + new String(bytes, Charset.forName("utf-8")));
//将每个字节转换成16进制数据,再拼接成字符串
//16进制从0-F 一个字节占8个二进制位 一个16进制数字占4个二进制位
//字节转16进制,一个字节要换成两个16进制内容
//高低位
BigInteger bigInteger = new BigInteger(1,bytes); //调用number的一个子类 1代表将字节数组转成一个正整数
return bigInteger.toString(16);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
System.out.println(md5EncodeStr("1234"));
}
}



