Java学习day015(日期,格式化)
文章目录 数字格式化Junit
日期相关操作
Date类
格式化时间日期的对象
SimpleDateFormat
在jdk8之后,系统不再推荐使用这些类
如上的的日期和时间处理类都是非线程安全类,在早期没有高并发的情况可以正常使用。
高并发的情况下,使用这些类,都会出现非线程安全问题!!!!
JDK8之前获取当前系统时间
JDK8之前的日期操作了解即可
Date date = new Date();System.out.println(date); // Mon Jul 26 21:02:16 CST 2021
Date date = new Date();// 获取当前时间的时间戳, 1970-01-01 00:00:00 距离当前的毫秒数
System.out.println(date.getTime()); // 1627304881732// java还可以通过System类获取时间戳,可以获取当前时间戳
System.out.println(System.currentTimeMillis()); // 1627304881732// 日期对象 ---> 字符串 格式化时间
// SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String format = sdf.format(date);
// System.out.println(format); // 2021-07-26 21:10:30
System.out.println(format); // 2021年07月26日 21时08分01秒// 字符串 ---> 日期对象
String strTime = "2018年10月8日 12:12:12";
DateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
Date date2 = sdf2.parse(strTime); // 这个地方会报编译的错误 【throws ParseException】
System.out.println(date2); // Mon Oct 08 12:12:12 CST 2018
因为Date的设计具有"千年虫"以及"时区"的问题,所以Date中的大部分方法已经不建议使用了,它们都被java.util.类所取代
科普:千年虫BUG
一开始是使用六位数字来储存时间,其表现形式就类似“95.11.02”,意思就是1995年11月2号
如果到了2000年,那前两位数字应该就是“00”,而计算机终归不是人类,“00”对它们来说不一定就是2000年,也有可能是公元1900年或公元1000年,这样就会得到不正确的计算结果,进而引发一系列的问题
可以看到上面的方法都划了横线,就代表这个方法不推荐使用
Date date = new Date();// 千年虫BUG事件System.out.println(date.getYear()); // 121 (ps:121 + 1900 = 2021)System.out.println(date.getMonth() + 1); // 7System.out.println(date.getDate()); // 26
JDK8之后
package com.openlab.day15.date;import java.time.Instant;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;public class JDK8DateTIme {public static void main(String[] args) {// 本地日期LocalDate localDate = LocalDate.now();System.out.println(localDate); // 2021-07-26System.out.println(localDate.getDayOfMonth()); // 26System.out.println(localDate.getDayOfYear()); // 207// 本地时间LocalTime localTime = LocalTime.now();System.out.println(localTime); // 21:19:58.785762400// 日期+时间的对象LocalDateTime dateTime = LocalDateTime.now();System.out.println(dateTime); // 2021-07-26T21:19:58.785762400// 专门用来格式化日期时间的对象String str = dateTime.format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));System.out.println(str); // 2021-07-26 21:19:58// 将日期字符串解析为日期对象LocalDateTime ldt = LocalDateTime.parse("2000年03月08日 14:52:18", DateTimeFormatter.ofPattern("yyyy年MM月dd日 HH:mm:ss"));System.out.println(ldt); // 2000-03-08T14:52:18// 伦敦标准时间,就是经度为0的,0时区时间Instant instant = Instant.now();System.out.println(instant); // 2021-07-26T13:19:58.798728800Z}
}
package com.openlab.day15.date;
import java.util.Calendar;
public class TestCalendar {public static void main(String[] args) {Calendar calendar = Calendar.getInstance(); int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DATE);int hour = calendar.get(Calendar.HOUR);int minute = calendar.get(Calendar.MINUTE);int s = calendar.get(Calendar.SECOND);System.out.println(year +"-"+ month +"-"+ day + " "+ hour +":"+ minute +":"+s);// 2021-7-26 9:23:8}
}
package com.openlab.day15.date;import java.math.BigDecimal;public class TestBigDecimal {public static void main(String[] args) {// 计算机中的浮点数,并不像整数那样存储,是通过一种算法得到// 这样的如果我们使用浮点数计算时,可能得到是一个相似值System.out.println(0.1 + 0.2); // 0.30000000000000004// 高精度行业:航天、经济、银行、金融// 根据不同行业需求,选择对应的构造函数进行计算BigDecimal bigDecimal1 = new BigDecimal("0.1");BigDecimal bigDecimal2 = new BigDecimal("0.2");BigDecimal add = bigDecimal1.add(bigDecimal2);System.out.println(add); // 0.3System.out.println(bigDecimal1.subtract(bigDecimal2)); // -0.1System.out.println(bigDecimal1.divide(bigDecimal2)); // 0.2System.out.println(bigDecimal1.multiply(bigDecimal2)); // 0.02}
}
数字格式化
package com.openlab.day15.date;import org.junit.Test;import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;/*** Junit java提供的单元测试的框架*/
public class TestNumberFormat {@Testpublic void test01() { // 获取货币实例NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();System.out.println(currencyInstance.format(12345)); // ¥12,345.00}@Testpublic void test02() { // 获取货币实例System.out.println(NumberFormat.getCurrencyInstance(Locale.US).format(12345)); // $12,345.00System.out.println(NumberFormat.getCurrencyInstance(Locale.UK).format(12345)); // £12,345.00}// 千分位分隔符@Testpublic void test03() { // 获取号码实例System.out.println(NumberFormat.getNumberInstance().format(1235.63941)); // 1,235.639}@Testpublic void test04() { // 获取百分比实例System.out.println(NumberFormat.getPercentInstance().format(56.2378)); // 5,624%}@Testpublic void test05() {double num = 23465.1264566;// # 主要是在.之后,表示要保留的小数位DecimalFormat df = new DecimalFormat("0.0000");String format = df.format(num);System.out.println(format); // 23465.1265DecimalFormat df2 = new DecimalFormat("0E0");System.out.println(df2.format(num)); // 2E4}@Testpublic void test06() {double pi = 3.1415927; // 十进制格式化System.out.println(new DecimalFormat("0").format(pi)); // 3System.out.println(new DecimalFormat("0.00").format(pi)); // 3.14//取两位整数和三位小数,整数不足部分以0填补。System.out.println(new DecimalFormat("00.000").format(pi));// 03.142//取所有整数部分System.out.println(new DecimalFormat("#").format(pi)); // 3//以百分比方式计数,并取两位小数System.out.println(new DecimalFormat("#.##%").format(pi)); // 314.16%long c = 299792458;System.out.println(new DecimalFormat("#.#####E0").format(c));// 2.99792E8System.out.println(new DecimalFormat("00.####E0").format(c));// 29.9792E7System.out.println(new DecimalFormat(",###").format(c));// 299,792,458System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c));}}
Junit
Junit是单元测试框架工具,在项目开发中是经常用到的,利用进行单元测试非常简单方便,所以熟悉Junit是很有必要的。
Junit优点:
安装使用方便可以同时执行多个测试方法测试结果直观明了