java常用类
日期
LocalDateTime
时间格式化
LocalDateTime time = techLogicTablePo.getCreateTime();
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String createTime = dateTimeFormatter.format(time);
比较大小
String time1 = "2019-06-26 19:00:00";
DateTimeFormatter dtf2 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
LocalDateTime localDateTime = LocalDateTime.parse(time1, dtf2);
//你的时间在当前时间之前是true
System.out.println(localDateTime.isBefore(LocalDateTime.now()));
localDateTime < LocalDateTime.now();
//在当前时间之后是false
System.out.println(localDateTime.isAfter(LocalDateTime.now()));
localDateTime > LocalDateTime.now();
相差天数
LocalDateTime now = LocalDateTime.now();
Duration duration = Duration.between(now,now);
System.out.println(duration);
long days = duration.toDays(); //相差的天数
long hours = duration.toHours();//相差的小时数
long minutes = duration.toMinutes();//相差的分钟数
long millis = duration.toMillis();//相差毫秒数
long nanos = duration.toNanos();//相差的纳秒数
System.out.println(millis);
获取当前时间
LocalDate localDate = LocalDate.now();
LocalTime localTime = LocalTime.now();
LocalDateTime localDateTime = LocalDateTime.now();
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
根据指定时间创建对象
LocalDate localDate = LocalDate.of(2018, 1, 13);
LocalTime localTime = LocalTime.of(9, 43, 20);
LocalDateTime localDateTime = LocalDateTime.of(2018, 1, 13, 9, 43, 20);
System.out.println(localDate);
System.out.println(localTime);
System.out.println(localDateTime);
日期的加减
- 对于LocalDate,只有精度大于或等于日的加减,如年、月、日;
- 对于LocalTime,只有精度小于或等于时的加减,如时、分、秒、纳秒;
- 对于LocalDateTime,则可以进行任意精度的时间相加减;
LocalDateTime localDateTime = LocalDateTime.now();
//以下方法的参数都是long型,返回值都是LocalDateTime
LocalDateTime plusYearsResult = localDateTime.plusYears(2L);
LocalDateTime plusMonthsResult = localDateTime.plusMonths(3L);
LocalDateTime plusDaysResult = localDateTime.plusDays(7L);
LocalDateTime plusHoursResult = localDateTime.plusHours(2L);
LocalDateTime plusMinutesResult = localDateTime.plusMinutes(10L);
LocalDateTime plusSecondsResult = localDateTime.plusSeconds(10L);
System.out.println("当前时间是 : " + localDateTime + "\n"
+ "当前时间加2年后为 : " + plusYearsResult + "\n"
+ "当前时间加3个月后为 : " + plusMonthsResult + "\n"
+ "当前时间加7日后为 : " + plusDaysResult + "\n"
+ "当前时间加2小时后为 : " + plusHoursResult + "\n"
+ "当前时间加10分钟后为 : " + plusMinutesResult + "\n"
+ "当前时间加10秒后为 : " + plusSecondsResult + "\n"
);
//也可以以另一种方式来相加减日期,即plus(long amountToAdd, TemporalUnit unit)
// 参数1 : 相加的数量, 参数2 : 相加的单位
LocalDateTime nextMonth = localDateTime.plus(1, ChronoUnit.MONTHS);
LocalDateTime nextYear = localDateTime.plus(1, ChronoUnit.YEARS);
LocalDateTime nextWeek = localDateTime.plus(1, ChronoUnit.WEEKS);
System.out.println("now : " + localDateTime + "\n"
+ "nextYear : " + nextYear + "\n"
+ "nextMonth : " + nextMonth + "\n"
+ "nextWeek :" + nextWeek + "\n"
);
//日期的减法用法一样,在此不再举例
结果返回注解 @DatetimeFormat和@JsonFormat
时间是一个比较常用的类型。显示的时候通常是以String显示的。如果前端参数,前端人员也希望用String作为参数
常用注解
@DatetimeFormat
是将String转换成Date,一般前台给后台传值时用
@JsonFormat(pattern="yyyy-MM-dd")
将Date转换成String 一般后台传值给前台时
@JsonFormat
会让时间以0区时间显示。如果直接使用会少了8小时(我所在的是北京时区)修改为
@JsonFormat(pattern="yyyy-MM-dd",timezone="GMT+8")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime startTime;
计算
在很多编程语言中,浮点数类型float和double运算会丢失精度。
在大多数情况下,计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,在银行、帐户、计费等领域,BigDecimal提供了精确的数值计算。
Java在商业计算中要用 java.math.BigDecimal
BigDecimal
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法。方法中的参数也必须是BigDecimal的对象。构造器是类的特殊方法,专门用来创建对象,特别是带有参数的对象。
构建BigDecimal
BigDecimal BigDecimal(double d); //不允许使用,精度不能保证
BigDecimal BigDecimal(String s); //常用,推荐使用
static BigDecimal valueOf(double d); //常用,推荐使用
方法
方法 | 描叙 |
---|---|
add(BigDecimal) | BigDecimal对象中的值相加,然后返回这个对象 |
subtract(BigDecimal) | BigDecimal对象中的值相减,然后返回这个对象 |
multiply(BigDecimal) | BigDecimal对象中的值相乘,然后返回这个对象 |
divide(BigDecimal) | BigDecimal对象中的值相除,然后返回这个对象 |
toString() | 将BigDecimal对象的数值转换成字符串 |
doubleValue() | 将BigDecimal对象中的值以双精度数返回 |
floatValue() | 将BigDecimal对象中的值以单精度数返回 |
longValue() | 将BigDecimal对象中的值以长整数返回 |
intValue() | 将BigDecimal对象中的值以整数返回。 |
格式化和四舍五入
// 格式化:保留2为小数
DecimalFormat df = new DecimalFormat("#.##");
// 四舍五入,默认五舍六入
df.setRoundingMode(RoundingMode.HALF_UP);
格式化
DecimalFormat 解析:
符号 | 位置 | 描叙 |
---|---|---|
0 | 数字 | 阿拉伯数字,如果不存在则显示0 |
# | 数字 | 阿拉伯数字,如果不存在不显示0 |
. | 数字 | 小数分隔符或货币小数分隔符 |
, | 数字 | 分组分隔符 |
E | 数字 | 分隔科学计数法中的尾数和指数。在前缀或后缀中无需加引号。 |
- | 数字 | 负号 |
; | 子模式边界 | 分隔正数和负数子模式 |
% | 前缀或后缀 | 乘以 100 并显示为百分数 |
\u2030 | 前缀或后缀 | 乘以 1000 并显示为千分数 |
¤(\u00A4) | 前缀或后缀 | 货币记号,由货币符号替换。如果两个同时出现,则用国际货币符号替换。如果出现在某个模式中,则使用货币小数分隔符,而不使用小数分隔符。 |
' | 前缀或后缀 | 用于在前缀或或后缀中为特殊字符加引号,例如 "'#'#"将 123 格式化为 "#123"。要创建单引号本身,请连续使用两个单引号:"# o''clock"。 |
舍入模式介绍
-
RoundingMode.CEILNG
:向正无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于RoundingMode.UP
;如果结果为负,则舍入行为类似于RoundingMode.DOWN
如下:5.5 => 6 1.1 => 2 -1.0 => -1 -2.5 => -2
-
RoundingMode.DOWN
:向零方向舍入的舍入模式。从不对舍弃部分前面的数字加 1(即截尾)。注意,此舍入模式始终不会增加计算值的绝对值
如下:5.5 => 5 1.1 => 1 -1.0 => -1 -1.6 => -1
-
RoundingMode.FLOOR
:向负无限大方向舍入的舍入模式。如果结果为正,则舍入行为类似于 RoundingMode.DOWN;如果结果为负,则舍入行为类似于 RoundingMode.UP
注意:此舍入模式始终不会增加计算值
如下:5.5 => 5 2.3 => 2 1.0 => 1 -1.1 => -2 -2.5 => -3
-
RoundingMode.HALF_DOWN :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。如果被舍弃部分 > 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN;
五舍六入
如下:
2.5 => 2
1.6 => 2
-1.1 => -1
-1.6 => -2
-2.5 => -2
- RoundingMode.HALF_EVEN :向 最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。此舍入模式也称为“银行家舍 入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略
如下:
5.5 => 6
2.5 => 2
1.1 => 1
-1.0 => -1
-1.6 => -2
-2.5 => -2
- RoundingMode.HALF_UP :向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入。如果被舍弃部分 >= 0.5,则舍入行为同 RoundingMode.UP;否则舍入行为同 RoundingMode.DOWN
注意:此舍入模式就是通常学校里讲的四舍五入
如下:
2.5 => 3
1.1 => 1
-1.1 => -1
-1.6 => -2
- RoundingMode.UNNECESSARY :用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。如果对生成精确结果的操作指定此舍入模式,则抛出 ArithmeticException
如下:
1.5 => 抛出 ArithmeticException
1.1 => 抛出 ArithmeticException
1.0 => 1
-1.1 =>抛出 ArithmeticException
-1.6 => 抛出 ArithmeticException
- RoundingMode.UP :远离零方向舍入的舍入模式。始终对非零舍弃部分前面的数字加 1。注意,此舍入模式始终不会减少计算值的绝对值
如下:
5.5 => 6
1.1 => 2
-1.1 => -2
-1.6 => -2
问题
BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常的,异常如下:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result. at java.math.BigDecimal.divide(Unknown Source)
解决方法:给divide设置精确的小数点