- 浏览: 473178 次
- 性别:
- 来自: 上海转北京
文章分类
最新评论
-
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 19772今天写一个接口,所有的都写完了后来测试。整个项目是用spri ... -
java.lang.UnsupportedClassVersionError及tomcat启动servlet-api.jar not loaded
2013-07-30 18:01 1264今天API对接这块遇到 ... -
Myeclipse快捷方式设置
2013-07-08 15:18 845Content (内容助手)的快捷键“Ctrl+Space” ... -
正则表达式判断中文或全角字符
2012-09-18 13:14 6571Flex中一文本框,其值的length取出的是字符个数,并不是 ... -
Eclipse中xml配置文件报错原因总结
2012-05-15 11:40 135971)使用Eclipse开发工具,从SVN或者GIt上down下 ... -
正则表达式判断字符串是数字,可以是负数,含有小数点
2012-04-09 14:49 8802正则表达式判断字符串是数字,可以为正数,可以为负数,不能含有字 ... -
java.net.SocketException: Broken pipe 错误原因
2012-03-07 12:00 13580警告: Error sending end packe ... -
java工程不能使用Server发布到tomcat问题
2011-10-08 17:02 21199最近接手另一个项目trsBackEnd,将工程从git上clo ... -
Tomcat启动时错误IOException while loading persisted sessions: java.io.EOFException
2010-10-08 15:58 1442一直用tomcat一段时间都正常无事,TomCat6在 ... -
Web Application Stress Tool压力测试工具使用
2010-03-19 23:56 5596随着Web 2.0技术的迅速发展,许多公司都开发了一些 ... -
for循环优化
2010-03-19 18:51 2200到金蝶去面试了一下,结果在笔试就差不多挂了,因为自己都感觉做 ... -
java中易模糊概念总结(一)
2010-01-26 18:04 1356今天准备重新再研究一 ... -
得到tomcat目录的方法
2009-12-31 18:00 1337String tomcatPath = System.getP ... -
特殊字符转义与验证问题
2009-12-16 14:25 10791、 验证输入的是数字 Function checkmate ... -
保留两位小数,用JS实现与fmt标签实现
2009-12-16 14:23 118583、 小数点保留两位: 3.1 用JSTL标签中的fmt ... -
已知年月,计算这月的天数
2009-12-16 14:21 1313public static int getDaysByMont ... -
3、 已经一个日期,yyyy-MM-dd格式,从当前日期倒推num天,返回这一日期集合。
2009-12-16 14:19 25843、 已经一个日期,yyyy-MM-dd格式,从当前日期倒推n ... -
已经年,第x周,计算这周的开始日期与结束日期
2009-12-16 14:18 27422、 已知年,第x周,获取这一周的周日与周六日期(一周起始时间 ... -
知道年月日计算这一天是第x周
2009-12-16 14:16 1816/** * 最后修改于2010-1-1 ... -
JSTL的简单使用
2009-11-19 19:31 948Java-JSTL(JSP标准标签库)(转) 关键字: jst ...
相关推荐
在SQL中,根据已知的年、月、第几周和周几来获取具体的日期是一项常见的日期处理任务,尤其在数据分析或报表生成时非常有用。本文将深入探讨如何使用SQL来实现这一功能,并以MS SQL Server为例进行示例说明。 首先...
已知一个点的坐标和两点之间距离求另外一点坐标
标题中的“已知起点终点半径求圆心坐标程序”是指一个编程任务,目标是编写一个算法或程序,根据已知的两个点(起点和终点)以及连接这两点的线段半径来计算圆心的坐标。在二维空间中,如果知道一条线段的两个端点和...
这里给出一个已知两点坐标和圆心角,求圆心坐标的程序源码,供大家参考,代码涉及大量数学推导,求解出唯一的圆心坐标,
算法,c++ 已知两点和圆心角求圆心坐标 通过两点和圆心角,先计算半径 再计算圆心
这里给出一个已知两点坐标和半径,求元新坐标的程序源码,供大家参考,代码涉及大量数学推导,如有疑问,来信请寄taiyangshen80293@sohu.com.
具体的代码实现可以参考提供的“已知两个坐标系下对应点坐标求转换矩阵”文件。 这个转换矩阵的应用非常广泛,例如在机器人路径规划、相机标定、3D重建等领域。一旦获得转换矩阵,就可以将一个坐标系中的任何点坐标...
rsa解密(已知p qe 求 d)python3.py
C语言,数据结构课程,知道中序和后序遍历,画二叉树和写出前序遍历。
已知后缀表达式用来表达一条算式,然后求算式结果。
用python编写,已知两点经纬度及高程坐标,求两点间距离的函数
本文将详细介绍如何在Qt环境中,结合C和C++,计算已知两点经纬度的距离和方位。 首先,我们需要了解地理坐标系统的基本概念。在地球表面,我们使用经纬度来定位位置。经度是东西方向的度量,以本初子午线(通过英国...
已知三点坐标求外接圆的直径、圆心坐标破解 本人试用完全计算正确
个人在进行C语言复习期间编写的一个进行日期计算的程序(算法优化),主要功能有:选择菜单,两个日期求间隔,按天数往后计算日期,按天数往前计算日期,功能循环。主要用了函数,指针,结构体等知识
首先,我们有两个已知点A(α1,β1)和B(α2,β2),它们之间的距离D可以通过球面距离公式计算: \[ D = R \cdot \arccos\left[\cos(\alpha_1)\cos(\alpha_2)\cos(\beta_1 - \beta_2) + \sin(\alpha_1)\sin(\...
标题中的“已知经纬度求距离的小软件”指的是一个能够根据地理位置的经纬度坐标计算两点之间距离的应用程序。在IT领域,这样的工具通常基于地理信息系统(GIS)的技术,结合数学公式来实现。以下是对这个知识点的...
已知邻接矩阵,求可达矩阵的MATLAB代码
在计算机视觉领域,双目立体视觉是一种通过分析两个相机(左眼和右眼)拍摄的同一场景的不同视角来获取场景深度信息的技术。OpenCV库提供了强大的功能,支持双目视觉中的各种任务,包括从已知的左右图像坐标计算出...
利 用 数理规划软件 LINGO 求解多点之间距离问 题 的 研 究 方 法, 计 算 出 该 方 案 距 离 最 短 的 配 送 路 径, 该研究结果也在一定程度上验证了该算法研究理论及研究方法的可行性。
早年写的面试题,已知圆上任意三点求圆心半径 c++实现,有兴趣可以一观! 不考虑特殊情况(代码中有用到除法 忽略分母不能为0情况)