package date; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: TSCCG * @Date: 2021/07/06 15:56 */ public class DateDemo01 { public static void main(String[] args) { //获取系统当前时间(精确到毫秒的系统当前时间) //直接调用无参构造方法即可 Date nowTime = new Date(); //java.util.Date类已经重写了toString方法,可以直接输出一个日期字符串 System.out.println("未格式化前:"); System.out.println(nowTime);//Tue Jul 06 16:32:26 CST 2021 /** * 直接打印出的格式不符合我们的习惯,可以将日期类型Date格式化,按照指定的格式进行转换:Date --> 具有一定格式的日期字符串String * SimpleDateFormat是java.txt包下的,专门负责日期格式化 * 使用时将指定格式的字符串传入SimpleDateFormat的构造方法中 * 指定格式: * 年:yyyy * 月:MM * 日:dd * 时:HH * 分:mm * 秒:ss * 毫秒:SSS(毫秒3位,最高999,1000毫秒等于1秒) * 注意:在日期格式中,除y M d H m s S这些字符外其他可自定义 */ SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss SSS");//格式1 SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS");//格式2 //将当前时间转换成指定格式的字符串 String nowTimeStr1 = sdf1.format(nowTime); String nowTimeStr2 = sdf2.format(nowTime); System.out.println("格式化后:"); System.out.println(nowTimeStr1); System.out.println(nowTimeStr2); } }
结果:
未格式化前: Tue Jul 06 16:52:30 CST 2021 格式化后: 2021/07/06 16:52:30 913 2021-07-06 16:52:30 913
上面的例子是将Date类型转换成一个具有一定格式的日期字符串String,那么如何将一个具有一定格式的日期字符串转换成Date类型呢?
假设现在有一个日期字符串:String firstTimer = "1999-04-06 20:20:20";
package date; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: TSCCG * @Date: 2021/07/06 15:56 * 将一个日期字符串转换成Date日期类型 */ public class DateDemo01 { public static void main(String[] args) { //日期字符串 String firstTimer = "1999-04-06 20:20:20"; //格式必须跟日期字符串格式一致 SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); //新建一个日期对象 Date date = null; try { //进行转换 date= sdf3.parse(firstTimer); } catch (ParseException e) { e.printStackTrace(); } System.out.println(date); } }
结果:
Tue Apr 06 20:20:20 CST 1999
System.out.print("自1997年1月1日 00:00:00 000到当前系统时间度过的总毫秒数:"); System.out.println(System.currentTimeMillis());
自1997年1月1日 00:00:00 000到当前系统时间度过的总毫秒数:1625564175343
这个方法有什么用呢?
度过的总毫秒数时时刻刻都在增加,我们可以利用这点来测量程序的执行时间。
我们可以在一段代码执行前和执行后分别获取一次度过的总毫秒数,相减,即可获得执行时间。
package date; /** * @Author: TSCCG * @Date: 2021/07/06 17:22 */ public class DateDemo02 { public static void main(String[] args) throws InterruptedException { //通过匿名内部类的方式创建一个线程 Thread t1 = new Thread(new Runnable() { @Override public void run() { for (int i = 0; i < 10; i++) { System.out.println(Thread.currentThread().getName() + "--->" + i); } } }); //设置线程名称 t1.setName("t1"); //在线程执行前测一次 Long begin = System.currentTimeMillis(); //开启线程 t1.start(); //让线程t1先执行完毕 t1.join(); //在线程执行后再测一次 Long end = System.currentTimeMillis(); //统计花费时间 System.out.println("t1线程运行耗费了" + (end - begin) + "毫秒"); } }
结果:
t1--->0 t1--->1 t1--->2 t1--->3 t1--->4 t1--->5 t1--->6 t1--->7 t1--->8 t1--->9 t1线程运行耗费了1毫秒
Date(long date)
分配一个 Date对象并初始化它代表指定的毫秒数,因为标准的基准时间被称为“时代”,即1970年1月1日格林尼治时间就是。
package date; import java.text.SimpleDateFormat; import java.util.Date; /** * @Author: TSCCG * @Date: 2021/07/06 17:59 */ public class DateDemo03 { public static void main(String[] args) { //参数是一个毫秒,意为从1970-1-1 00:00:00 000格林尼治时间过了1毫秒的日期 Date date1 = new Date(1); SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss SSS"); String timeStr1 = sdf1.format(date1); System.out.println(timeStr1); } }
北京是东八区,差8小时。
1970-01-01 08:00:00 001
//格林威治时间到当前时间减去1天时间(1000毫秒*60*60*24) Date date2 = new Date(System.currentTimeMillis() - 1000 * 60 * 60 * 24); String timestr2 = sdf1.format(date2); System.out.println(timestr2);
结果:
2021-07-05 18:12:18 401
将数字转换成指定格式的字符串
package number; import java.text.DecimalFormat; /** * @Author: TSCCG * @Date: 2021/07/06 18:30 * 关于数字的格式化 */ public class NumberDemo01 { public static void main(String[] args) { //java.text.DecimalFormat专门负责数字格式化 //DecimalFormat df = new DecimalFormat("数字格式"); /* 数字格式: # 代表任何数字 , 代表千分位 . 代表小数点 0 代表不够时补0 */ //###,###.## 表示加入千分位,保留两个小数 DecimalFormat df1 = new DecimalFormat("###,###.##"); String s1 = df1.format(1234.567); System.out.println(s1); //保留4位小数,不够补0 DecimalFormat df2 = new DecimalFormat("###,###.0000"); String s2 = df2.format(1234.567); System.out.println(s2); } }
结果:
1,234.57 1,234.5670
BigDecimal属于大数据,精度极高。不属于基本数据类型,属于java对象(引用数据类型)
这是SUN提供的一个类。专门用在财务软件里。
注意:财务软件中,double是不够的。
如果面试官问:你处理过财务数据吗?用的是哪一种类型?
绝对不要说double,要说java.math.BigDecimal
package number; import java.math.BigDecimal; /** * @Author: TSCCG * @Date: 2021/07/06 18:45 */ public class NumberDemo02 { public static void main(String[] args) { //精度极高的100 BigDecimal v1 = new BigDecimal(100); //精度极高的200 BigDecimal v2 = new BigDecimal(200); //v1 + v2;不能使用这种形式,v1和v2都是引用,不能直接加减 /* 调用方法计算: add 加法 subtract 减法 multiply 乘法 divide 除法 remainder 求余 */ BigDecimal v3 = v1.add(v2);//精度极高的300 System.out.println(v3); } }
结果:
300
package ramdom; import java.util.Random; /** * @Author: TSCCG * @Date: 2021/07/06 19:03 * 随机数 */ public class RandomDemo01 { public static void main(String[] args) { //创建随机数对象 Random random1 = new Random(); //返回一个int类型取值范围内的随机数 int num1 = random1.nextInt(); System.out.println(num1); //返回一个范围为[0,100]范围内的随机数,不能取到101 //nextInt意为下一个int类型的数据是101,表示只能取到100 int num2 = random1.nextInt(101); System.out.println(num2); } }
编写程序,生成5个随机数,如果重复的话,重新生成。
最终将生成的5个随机数放到数组里。要求数组中这5个随机数不能重复。
package ramdom; import java.util.Random; /** * @Author: TSCCG * @Date: 2021/07/06 20:02 * 编写程序,生成5个随机数,如果重复的话,重新生成。 * 最终将生成的5个随机数放到数组里。要求数组中这5个随机数不能重复。 */ public class RandomDemo02 { public static void main(String[] args) { Random random = new Random(); int[] arr = new int[5]; //为防止随机数与数组初始值相同,初始化数组,将数组中每个元素的初始值都变为-1 for (int i = 0; i < arr.length; i++) { arr[i] = -1; } //定义下标为0 int index = 0; while (index < 5) { //生成一个随机数,范围是[0~5] int num = random.nextInt(5); //判断,如果数组中没有这个随机数,将该随机数放入数组中,下标加1 while (!contains(arr,num)) { arr[index++] = num; } } //打印数组 for (int i : arr) { System.out.println(i); } } /** * 判断数组中是否包含某个元素 * @param key 待查询的元素 * @param arr 待遍历的数组 * @return 如果包含返回true,如果不包含返回false */ public static boolean contains(int[] arr, int key) { boolean isEmpty = false; for (int i = 0; i < arr.length; i++) { if (key == arr[i]) { isEmpty = true; } } return isEmpty; } }
结果:
4 2 0 3 1
结果只有两种情况时,建议使用boolean类型。
例:
package enumTest; /** * @Author: TSCCG * @Date: 2021/07/06 23:18 */ public class EunmDemo02 { public static void main(String[] args) { System.out.println(division(10,2) ? "运算成功" : "运算失败"); System.out.println(division(10,0) ? "运算成功" : "运算失败"); } public static boolean division(int a,int b) { try { int c = a / b; return true; } catch (Exception e) { return false; } } }
结果:
运算成功 运算失败
结果超过两种情况,且还可以一枚一枚列举出来的,建议使用枚举类型。
枚举是一种引用数据类型
语法:
enum 枚举类型名 { //全部大写 枚举值1,枚举值2,枚举值3... }
例如:颜色、四季
例子:
package enumTest; /** * @Author: TSCCG * @Date: 2021/07/06 22:34 * */ public class EnumDemo01 { public static void main(String[] args) { String result = check(Season.SUMMER); System.out.println(result); } public static String check(Season season) { switch (season) { case SPRING: return "春天"; case SUMMER: return "夏天"; case AUTUMN: return "秋天"; case WINTER: return "冬天"; default: return "无法分辨季节"; } } } /** * 四季 */ enum Season { /** * SPRING 春 * SUMMER 夏 * AUTUMN 秋 * WINTER 冬 */ SPRING,SUMMER,AUTUMN,WINTER }
结果:
夏天