- 浏览: 467498 次
- 性别:
- 来自: 上海转北京
文章分类
最新评论
-
fendou123321:
又仔细看了下,如果设置周日为每周的第一天,应该是正确的,如果把 ...
已知起始日期,求两日期之间共有多少自然周 -
fendou123321:
开始日期2016-12-19结束日期2017-02-05只用博 ...
已知起始日期,求两日期之间共有多少自然周 -
江奇缘:
郁闷了半天,看了文章才知道连错库了!!想揍自己一顿
今天很郁闷java.sql.SQLException: ORA-00904:标识符无效 -
zbs506:
太感谢了,
今天很郁闷java.sql.SQLException: ORA-00904:标识符无效 -
那可不就是我嘛:
幸亏我看了十分钟就来搜了,感谢楼主。
今天很郁闷java.sql.SQLException: ORA-00904:标识符无效
今天对于日期这个问题花的时间比较多,在这里总结一下,由于考虑到自然周问题,还有时间跨度的问题,两个年份之间的临界条件上的考虑,还要考虑到一个年份共有多个周,比较复杂了。这里写了一个完整的Demo版本,贴出来分享一下。
package com.inventec.singular.service.blog; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; public class DateDiff { public static String formatDate(Date date) { String formDate = ""; SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); formDate = format.format(date); return formDate; } public static Date formatDate(String date) throws ParseException { Date time = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); time = format.parse(date); return time; } /** * 计算指定年度共有多少个周。 * * @param year * 格式 yyyy ,必须大于1900年度 小于9999年 * @return */ public static int getWeekNumByYear(final int year) { if (year < 1900 || year > 9999) { throw new NullPointerException("年度必须大于等于1900年小于等于9999年"); } int result = 52;// 每年至少有52个周 ,最多有53个周。 String date = getYearWeekFirstDay(year, 53); if (date.substring(0, 4).equals(year + "")) { // 判断年度是否相符,如果相符说明有53个周。 // System.out.println(date); result = 53; } return result; } /** * 计算某年某周的开始日期 * * * @param yearNum * 格式 yyyy ,必须大于1900年度 小于9999年 * * @param weekNum * 1到52或者53 * @return 日期,格式为yyyy-MM-dd */ public static String getYearWeekFirstDay(int yearNum, int weekNum) { Calendar cal = Calendar.getInstance(); cal.setFirstDayOfWeek(Calendar.SUNDAY); // 设置每周的第一天为星期日 cal.set(Calendar.DAY_OF_WEEK, Calendar.SUNDAY);// 每周从周日开始 // 上面两句代码配合,才能实现,每年度的第一个周,是包含第一个星期日的那个周。 cal.setMinimalDaysInFirstWeek(7); // 设置每周最少为7天 cal.set(Calendar.YEAR, yearNum); cal.set(Calendar.WEEK_OF_YEAR, weekNum); // 分别取得当前日期的年、月、日 return formatDate(cal.getTime()); } public static int weeksBetweenDays(String start, String end) { int counts = 1; Calendar c = Calendar.getInstance(); Calendar c1 = Calendar.getInstance(); try { Date startDate = formatDate(start); Date endDate = formatDate(end); c.setTime(startDate); c1.setTime(endDate); int weekofYear = c.get(Calendar.WEEK_OF_YEAR); int weekofYear1 = c1.get(Calendar.WEEK_OF_YEAR); System.out.println("start:" + weekofYear + " end week:" + weekofYear1); if (c.get(Calendar.YEAR) == c1.get(Calendar.YEAR)) { counts = weekofYear1 - weekofYear + 1; } else { int difyear = c1.get(Calendar.YEAR) - c.get(Calendar.YEAR); // System.out.println("year diff =" + difyear + " starty=" + c.get(Calendar.YEAR)); if (difyear == 1) {// 年份相差一年 int startyearWeeks = getWeekNumByYear(c.get(Calendar.YEAR)); String date = getYearWeekFirstDay(c.get(Calendar.YEAR), startyearWeeks); System.out.println(date); int ds = java.sql.Date.valueOf(date).compareTo( java.sql.Date.valueOf(start)); System.out.println(ds); if (ds <= 0) { // 这一年最后一周的开始一天小于用户选择的开始日期,比如,2009年最后一周的开始日期是2009-12-27号,所以开始日期大于或等于2009-12-27号的特殊处理。 counts = weekofYear1 - weekofYear + 1; } else { counts = getWeekNumByYear(c.get(Calendar.YEAR)) - weekofYear + weekofYear1 + 1; } } else if (difyear > 1) {// 年份相差大于一年时,要考虑到 for (int i = 0; i <= difyear; i++) { int startAllWeeks = getWeekNumByYear(c .get(Calendar.YEAR) + i); // 开始日期的年份+i,如2007-12-22到2011-01-09,这里是遍历出07年,08年,09年分别有多少个周 if (i == 0) {//开始日期这一年的周差,如果07-12-22是第51周,07年共有52个周,那么,这里得到1. counts = startAllWeeks - weekofYear; } else if (i < difyear) {//除开始日期与结束日期所在一年的年份的周差。也就是08年共有多少周 counts += startAllWeeks; } else if (i == difyear) { //加上09年所在的周 counts += weekofYear1; } } counts += 1; } } // } } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } return counts; } public static void main(String[] args) { int days = weeksBetweenDays("2009-12-28", "2010-11-03"); // String date="2010-01-06"; // String date1="2010-01-04"; // int // ds=java.sql.Date.valueOf(date).compareTo(java.sql.Date.valueOf(date1)); // System.out.println(ds); System.out.println("the weeks of this period is :" + days); } }
评论
4 楼
fendou123321
2017-02-13
又仔细看了下,如果设置周日为每周的第一天,应该是正确的,如果把每周的第一天改为其他值,就需要调整代码了
3 楼
fendou123321
2017-02-13
开始日期2016-12-19
结束日期2017-02-05
只用博主代码运行出来 相差周次是8
其实应该是7
中间有一个周是跨年的2016-12-26 2017-01-01
结束日期2017-02-05
只用博主代码运行出来 相差周次是8
其实应该是7
中间有一个周是跨年的2016-12-26 2017-01-01
2 楼
远去的渡口
2010-01-28
@老抛,
没想到大牛人物还看了我这种算法,激动一下
当初也考虑过这么计算,但是感觉时间跨度为几年的话就要循环很多次,我这里算是避开了几整年的自然周之和,因为一年有多少周可以一步到位,只是我这样考虑的因素就复杂了点
没想到大牛人物还看了我这种算法,激动一下
当初也考虑过这么计算,但是感觉时间跨度为几年的话就要循环很多次,我这里算是避开了几整年的自然周之和,因为一年有多少周可以一步到位,只是我这样考虑的因素就复杂了点
1 楼
抛出异常的爱
2010-01-28
先找到star日的指定周日
再一周一周加过去
当时间大于结束时间时\
就得出了周数.
效率没你的高
但看起来会更清楚一些
再一周一周加过去
当时间大于结束时间时\
就得出了周数.
效率没你的高
但看起来会更清楚一些
发表评论
-
org.springframework.beans.factory.NoSuchBeanDefinitionException: No matching解决方案
2013-11-13 17:27 19706今天写一个接口,所有的都写完了后来测试。整个项目是用spri ... -
java.lang.UnsupportedClassVersionError及tomcat启动servlet-api.jar not loaded
2013-07-30 18:01 1203今天API对接这块遇到 ... -
Myeclipse快捷方式设置
2013-07-08 15:18 799Content (内容助手)的快捷键“Ctrl+Space” ... -
正则表达式判断中文或全角字符
2012-09-18 13:14 6441Flex中一文本框,其值的length取出的是字符个数,并不是 ... -
Eclipse中xml配置文件报错原因总结
2012-05-15 11:40 134361)使用Eclipse开发工具,从SVN或者GIt上down下 ... -
正则表达式判断字符串是数字,可以是负数,含有小数点
2012-04-09 14:49 8681正则表达式判断字符串是数字,可以为正数,可以为负数,不能含有字 ... -
java.net.SocketException: Broken pipe 错误原因
2012-03-07 12:00 13534警告: Error sending end packe ... -
java工程不能使用Server发布到tomcat问题
2011-10-08 17:02 21126最近接手另一个项目trsBackEnd,将工程从git上clo ... -
Tomcat启动时错误IOException while loading persisted sessions: java.io.EOFException
2010-10-08 15:58 1390一直用tomcat一段时间都正常无事,TomCat6在 ... -
Web Application Stress Tool压力测试工具使用
2010-03-19 23:56 5551随着Web 2.0技术的迅速发展,许多公司都开发了一些 ... -
for循环优化
2010-03-19 18:51 2157到金蝶去面试了一下,结果在笔试就差不多挂了,因为自己都感觉做 ... -
java中易模糊概念总结(一)
2010-01-26 18:04 1295今天准备重新再研究一 ... -
得到tomcat目录的方法
2009-12-31 18:00 1291String tomcatPath = System.getP ... -
特殊字符转义与验证问题
2009-12-16 14:25 10251、 验证输入的是数字 Function checkmate ... -
保留两位小数,用JS实现与fmt标签实现
2009-12-16 14:23 117813、 小数点保留两位: 3.1 用JSTL标签中的fmt ... -
已知年月,计算这月的天数
2009-12-16 14:21 1267public static int getDaysByMont ... -
3、 已经一个日期,yyyy-MM-dd格式,从当前日期倒推num天,返回这一日期集合。
2009-12-16 14:19 25063、 已经一个日期,yyyy-MM-dd格式,从当前日期倒推n ... -
已经年,第x周,计算这周的开始日期与结束日期
2009-12-16 14:18 27022、 已知年,第x周,获取这一周的周日与周六日期(一周起始时间 ... -
知道年月日计算这一天是第x周
2009-12-16 14:16 1762/** * 最后修改于2010-1-1 ... -
JSTL的简单使用
2009-11-19 19:31 859Java-JSTL(JSP标准标签库)(转) 关键字: jst ...
相关推荐
已知一个点的坐标和两点之间距离求另外一点坐标
该代码是已知三点坐标计算出圆心坐标的VB算法代码小程序,并可求出各点到圆心的距离,
NULL 博文链接:https://zzy198772.iteye.com/blog/1022518
这里给出一个已知两点坐标和半径,求元新坐标的程序源码,供大家参考,代码涉及大量数学推导,如有疑问,来信请寄taiyangshen80293@sohu.com.
算法,c++ 已知两点和圆心角求圆心坐标 通过两点和圆心角,先计算半径 再计算圆心
文件为压缩包,内含.h.cpp文件,功能是已知起点终点半径求圆心坐标程序。
rsa解密(已知p qe 求 d)python3.py
已知不同坐标系的多个坐标点的坐标,求两个坐标系的转换矩阵,是matlab写的程序,三维坐标的。 做机器人视觉导航时用到的这个转换。
已知两点经纬度,求距离和方位.Qt中利用C和C++共同实现
C语言,数据结构课程,知道中序和后序遍历,画二叉树和写出前序遍历。
这里给出一个已知两点坐标和圆心角,求圆心坐标的程序源码,供大家参考,代码涉及大量数学推导,求解出唯一的圆心坐标,
已知后缀表达式用来表达一条算式,然后求算式结果。
设两个已知点(A、B点 )经纬度为(α1,β1),(α2,β2),其距离为D,地球半径为R, 行距为H,第三点的经纬度为(α3,β3...第三点:距离前述已知两点(A、B点)组成的直线段上A点的距离为H; C点存在左右两个点
用python编写,已知两点经纬度及高程坐标,求两点间距离的函数
基于opencv的已知左右图像坐标求空间中三维坐标,以及已知空间坐标求其在左右图像中的二维坐标。
已知三点坐标求外接圆的直径、圆心坐标破解 本人试用完全计算正确
已知两点坐标求方位角.doc
21.03_21_已知联合概率求边缘以及条件概率.pdf
个人在进行C语言复习期间编写的一个进行日期计算的程序(算法优化),主要功能有:选择菜单,两个日期求间隔,按天数往后计算日期,按天数往前计算日期,功能循环。主要用了函数,指针,结构体等知识
已知T值和自由度求P值