Calendar类set方法中的坑
最近写了一个支付宝微信对账报表,发现系统金额比支付宝微信的少好多,左查右查发现是追缴金额没统计到,再一查发现月结束日期为2019-09-31,9月咋会有31,为啥呢就追缴金额不行呢,因为其他类型用TIMESTAMP即使9.31不对也能统计到,而追缴用的时间戳存为int值,UNIX_TIMESTAMP('2019-09-31 23:59:59')转换为0.000000导致结束时间不对where条件查询就有问题。
在仔细一查发现工具类中有一个获取月份最大值,问题就出现在这里咯。代码很简单
public static int LastDay(int month) {
Calendar calendar = Calendar.getInstance(); //获取当前时间
calendar.set(Calendar.MONTH, month-1); //设置月份
int maxday =calendar.getActualMaximum(Calendar.DAY_OF_MONTH); //获取最大值
return maxday;
}
然后我发现无论传什么进去最大值都是31。
在System.out.println(calendar.getTime());打印出当前时间看看。发现如果传进去的月份有31号,那么就打印当月31号,如果没有31号就为下个月的1号。输入二月时输出为3号。
输入二月份debug一下,
Calendar.getInstance()值为2019-10-31如下图

calendar.set(Calendar.MONTH, 2-1)设置为二月如下图,发现DAY_OF_MONTH=31,依然为31号

System.out.println(calendar.getTime())一下,输出为2019-03-03,2019-02-31转为2019-03-03

calendar.getActualMaximum(Calendar.DAY_OF_MONTH)输出值为31,由此可见,不能只设置月份,要整个clear掉,重新设置年月,这样才会根据月份取最大值,不然会取到DAY_OF_MONTH的值。
解决方案一:
/**
* 获取某年某月的日期最大值
* @param year 年份
* @param month 月份
* @return 最大值
*/
public static int LastDay(int year , int month) {
Calendar calendar = Calendar.getInstance();
calendar.clear(); //清除所有日期数据
if (year != 0 ) {
calendar.set(Calendar.YEAR, year);
}
calendar.set(Calendar.MONTH, month-1);
int maxday =calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
return maxday;
}
解决方案二:
/**
* 根据年月获取当月最后一天
* @param yearmonth yyyy-MM
* @return yyyy-MM-dd
* @throws ParseException
*/
public static String getLastDayOfMonth(String yearmonth) {
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM");
Date dd = format.parse(yearmonth);
Calendar cal = Calendar.getInstance();
cal.setTime(dd);
int cc=cal.getActualMaximum(Calendar.DAY_OF_MONTH);
String result = yearmonth+"-"+cc;
return result;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
Calendar类set方法中的坑的更多相关文章
- c++ 类覆盖方法中的协变返回类型
c++ 类覆盖方法中的协变返回类型 在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型.这样的类型称为协变返回类型(Covarian ...
- php反射获取类和方法中的注释
通过php中的反射机制,获取该类的文档注释,再通过获取其所有的方法,获取方法的注释 所用到的主要类及其方法 ReflectionClass ReflectionClass::getDocComment ...
- java.uti.Random类nextInt方法中随机数种子为47的奇怪问题
一,问题描述 需要生成一个[0,1]的随机数.即随机生成 0 或者 1.使用java.util.Random类的 nextInt(int)方法,当构造Random类的对象并提供随机数种子时,发现了一个 ...
- final在类和方法中的使用
package final0; //final修饰的类不能继承//final修饰的方法不能继承public class TestFinal3 { public static void main(Str ...
- python中对类的方法中参数self的理解
我们通过下面的代码来对参数self进行理解 #coding:utf-8 2 class washer(): 3 def wash(self): 4 print("洗衣服") 5 p ...
- PHP加载另一个文件类的方法
加载另一个文件类的方法 当前文件下有a.php 和b.php,想要在class b中引入class a <?php class a { public $name = ' ...
- java:通过Calendar类正确计算两日期之间的间隔
在开发Android应用时偶然需要用到一个提示用户已用天数的功能,从实现上来看无非就是持久化存入用户第一次使用应用的时间firstTime(通过SharedPreferences .xml.sqlit ...
- 构造方法概念,自定义构造(init)方法的用途, 类工厂方法(就是直接用类名 类调用)
一. 构造方法 构造方法:在OC中init开头的方法, 我们称之为构造方法 构造方法的用途: 用于初始化一个对象, 让某个对象一创建出来就拥有某些属性和值 // 比如我们定义一个Person的类,然后 ...
- Calendar类中add/set/roll方法的区别
欢迎和大家交流技术相关问题: 邮箱: jiangxinnju@163.com 博客园地址: http://www.cnblogs.com/jiangxinnju GitHub地址: https://g ...
随机推荐
- 51nod 1594 Gcd and Phi(莫比乌斯反演)
题目链接 传送门 思路 如果这题是这样的: \[ F(n)=\sum\limits_{i=1}^{n}\sum\limits_{j=1}^{n}\phi(gcd(i,j)) \] 那么我们可能会想到下 ...
- msyql常用命令
1.创建.删除数据库 create database dbname; drop database dbname; 2.选择某一个数据库 use dbname; 3.显示所有表 show tables; ...
- django admin 编辑页面(change page) 自定义字段, 展示数据
最近遇到一个需求, 需要在django 的 admin 编辑页内展示由用户上传的进行反馈的图片, 还要支持点击查看原图, 所以需要在编辑页内自定义 img 标签及 a 标签进行图片的展示及点击跳转 i ...
- NOIP 2003 栈
洛谷 P1044 栈 洛谷传送门 JDOJ 1291: [NOIP2003]栈 T3 JDOJ传送门 题目描述 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两 ...
- ES6解构赋值常见用法
解构赋值出现的契机: let obj = { a: 1, b: 2 } // 取值 let a = obj.a let b = obj.b 问题核心: 每次取值既要确定对象属性名,还得重新定义一个变量 ...
- ECMAScript6-2
1.模板字串.箭头函数 1.1.模板字串 传统js,输出模板 var str='<b>姓名:</b>'+ '<span>lxr</span>'; con ...
- IOCP陷阱
1. AcceptEx 10061 客户端循环连接,没有发送数据,一定次数后,连接失败,WSAGetLastError的结果是10061.并且后续无法再次连接. 这是因为其中的一个参数,详细用法参考I ...
- Centos目录及其常用处理命令
1.Centos之常见目录作用介绍[1] 我们先切换到系统根目录 / 看看根目录下有哪些目录 [root@localhost ~]# cd / [root@localhost /]# ls bin ...
- Hibernate的Hql语句使用in关键字
原文地址:https://blog.csdn.net/u013410747/article/details/50954867
- | C语言I作业04
| C语言I作业004 标签: 18软件 李煦亮 问题 答案 这个作业属于那个课程 C语言程序设计II 这个作业要求在哪里 https://www.cnblogs.com/pengchen511/p/ ...