• 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设置精确的小数点

  • 相关阅读:
    酒美网宣布获8000万风险投资 年底销售额达1.5亿元
    [置顶]做足这5点,老板立马会对你另眼相看
    企鹅快跑——腾讯敏捷历程揭秘
    Gmail Mobile 不可忽视的七个细节
    网上爆出ATM取款机存漏洞 黑客可获最高权限
    中国的土壤真的不适合软件生长!
    淘宝商城开放的B2C平台战略
    不是GC打酱油,是人打酱油
    腾讯离职元老的内部邮件:马化腾的趣事
    JAVA课程设计个人博客链接
  • 原文地址:https://www.cnblogs.com/huafoog/p/16910324.html
Copyright © 2020-2023  润新知