java 和 mysql 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)
public static String getStartEndDate(String aDay, int type) {
SimpleDateFormat df = new SimpleDateFormat("yyyy年M月d日");// ("yyyy-MM-dd H:m:s");
Calendar ca = Calendar.getInstance();
try {
ca.setTime(new SimpleDateFormat("yyyy-MM-dd").parse(aDay));
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Date date1 = null, date2 = null;
if (type == 0) {
int dayOfWeek = ca.get(Calendar.DAY_OF_WEEK);
// 中国习惯:周一是一周的开始
if (dayOfWeek == 1) {
dayOfWeek = 7;
} else {
dayOfWeek--;
}
System.out.println(("tag" + "dayofweek=" + dayOfWeek + "min= " + ca.getActualMinimum(Calendar.DAY_OF_WEEK) + " max=" + ca
.getActualMaximum(Calendar.DAY_OF_WEEK)));
Calendar cal = (Calendar) ca.clone();
cal.add(Calendar.DATE, 1 - dayOfWeek);
date1 = cal.getTime();
cal = (Calendar) ca.clone();
cal.add(Calendar.DATE, 7 - dayOfWeek);
date2 = cal.getTime();
} else if (type == 1) {
int maximum = ca.getActualMaximum(Calendar.DAY_OF_MONTH);
int minmum = ca.getActualMinimum(Calendar.DAY_OF_MONTH);
int day = ca.get(Calendar.DAY_OF_MONTH);
Calendar cal = (Calendar) ca.clone();
cal.add(Calendar.DATE, minmum - day);
date1 = cal.getTime();
cal = (Calendar) ca.clone();
cal.add(Calendar.DATE,maximum - day);
date2 = cal.getTime();
}
String str1 = df.format(date1);
String str2 = df.format(date2);
System.out.println("tag" + "date1=" + str1 + " date2=" + str2);
return str1 + "--" + str2;
}
这几天在研究字符串与指定类型的转换,阴差阳错地研究起 java 的日期应用了,记录下来,希望你有帮助。
- 根据指定格式的字符串,转换为 Date(可研究根据指定格式的字符串,转化为其他指定的类型,如 json 转换为 javaBean)
/** * <p>Parses a string representing a date by trying a variety of different parsers.
* * <p>The parse will try each parse pattern in turn. * A parse is only deemed successful if it parses the whole of the input string. * If no parse patterns match, a ParseException is thrown.
* * @param str the date to parse, not null * @param parsePatterns the date format patterns to use, see SimpleDateFormat, not null * @param lenient Specify whether or not date/time parsing is to be lenient. * @return the parsed date * @throws IllegalArgumentException if the date string or pattern array is null * @throws ParseException if none of the date patterns were suitable * @see java.util.Calender#isLenient() */ private static Date parseDateWithLeniency( String str, String[] parsePatterns, boolean lenient) throws ParseException { if (str == null || parsePatterns == null) { throw new IllegalArgumentException("Date and Patterns must not be null"); } SimpleDateFormat parser = new SimpleDateFormat(); parser.setLenient(lenient); ParsePosition pos = new ParsePosition(0); for (String parsePattern : parsePatterns) { String pattern = parsePattern; // LANG-530 - need to make sure 'ZZ' output doesn't get passed to SimpleDateFormat if (parsePattern.endsWith("ZZ")) { pattern = pattern.substring(0, pattern.length() - 1); } parser.applyPattern(pattern); pos.setIndex(0); String str2 = str; // LANG-530 - need to make sure 'ZZ' output doesn't hit SimpleDateFormat as it will ParseException if (parsePattern.endsWith("ZZ")) { str2 = str.replaceAll("([-+][0-9][0-9]):([0-9][0-9])$", "$1$2"); } Date date = parser.parse(str2, pos); if (date != null && pos.getIndex() == str2.length()) { return date; } } throw new ParseException("Unable to parse the date: " + str, -1); } 在 java 日期格式里,"ZZ" 代表的是 时区。在java 里,格式化需要借助类 Formate,同时,parse 的时候一般需要借助类 parsePosition,ParsePosition 是 Format 及其子类所使用的简单类,用来在解析过程中跟踪当前位置。各种 Format 类中的 parseObject 方法要求将 ParsePosition对象作为一个变量。 Calendar 有两种解释日历字段的模式,即 lenient 和 non-lenient。当 Calendar 处于 lenient 模式时,它可接受比它所生成的日历字段范围更大范围内的值。当 Calendar 重新计算日历字段值,以便由 get() 返回这些值时,所有日历字段都被标准化。例如,lenient 模式下的GregorianCalendar 将MONTH == JANUARY、DAY_OF_MONTH == 32 解释为 February 1。
当 Calendar 处于 non-lenient 模式时,如果其日历字段中存在任何不一致性,它都会抛出一个异常。例如,GregorianCalendar 总是在 1 与月份的长度之间生成 DAY_OF_MONTH 值。如果已经设置了任何超出范围的字段值,那么在计算时间或日历字段值时,处于 non-lenient 模式下的GregorianCalendar会抛出一个异常。(在 non-lenient状态下,可以用来检测用户输入的日期是否合法)
- 日期加减(Calendar 的 add && set && roll)
private static Date set(Date date, int calendarField, int amount) { if (date == null) { throw new IllegalArgumentException("The date must not be null"); } // getInstance() returns a new object, so this method is thread safe. Calendar c = Calendar.getInstance(); c.setLenient(false);// 这里使用严格模式,要求设置日期的值必须正确 c.setTime(date); c.set(calendarField, amount); return c.getTime(); } |
加减日期,可以这样编写代码:
private static Date add(Date date, int calendarField, int amount) { if (date == null) { throw new IllegalArgumentException("The date must not be null"); } Calendar c = Calendar.getInstance(); c.setTime(date); c.add(calendarField, amount); return c.getTime(); } |
private static Date roll(Date date, int calendarField, int amount) { if (date == null) { throw new IllegalArgumentException("The date must not be null"); } Calendar c = Calendar.getInstance(); c.setTime(date); c.roll(calendarField, amount); return c.getTime(); }
public static Date setMinutes(Date date, int amount) { return set(date, Calendar.MINUTE, amount); } |
- 借助Calendar 提供的 api ,我们可以获取一些特殊的日期值。如下面这些日期值:
如:get(int fiele) 获取给定日历字段的值;getFirstDayOfWeek() 获取一星期的第一天的值(1~7)(在不同的地区,每周的第一天会有所不一样,在中是默认一星期的第一天是周日 1)。通过这两个 函数,我们可以获取任意一天其所在周的第一天的日期值,如 20140902 周二,我们可以获取到周日的日期值为 20140831。具体方法如下:
public static Date getFirstDateOfWeek(Date date){ Calendar c = Calendar.getInstance(); c.setTime(date); // 获取本周第一天的值 int firstDayOfWeek = c.getFirstDayOfWeek(); // 当前日期是本周的第几天 int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); int day_diff = 1;//天数差的绝对值,20140901~20140903 天数差为3 if (firstDayOfWeek < dayOfWeek) { day_diff = Math.abs(dayOfWeek-firstDayOfWeek) + 1; } c.add(Calendar.DATE,1-day_diff); return c.getTime(); } |
public static Date getLastDateOfWeek(Date date){ Calendar c = Calendar.getInstance(); c.setTime(date); // 获取本周第一天的值 int firstDayOfWeek = c.getFirstDayOfWeek(); // 当前日期是本周的第几天 int dayOfWeek = c.get(Calendar.DAY_OF_WEEK); int day_diff = 1;//天数差的绝对值 if (firstDayOfWeek < dayOfWeek) { day_diff =Math.abs(dayOfWeek - firstDayOfWeek) + 1; } c.add(Calendar.DATE, 7-day_diff); return c.getTime(); }getActualMaximum(int field) 给定此 Calendar 的时间值,返回指定日历字段可能拥有的最大值。getActualMinimum(int field) 给定此 Calendar 的时间值,返回指定日历字段可能拥有的最小值。借助这两个函数,我们可以获取一天所在月的第一天/最后一天的日期。方法如下:public static Date getFirstDateOfMonth(Date date){ if (date == null) { throw new IllegalArgumentException("the date must not be null"); } Calendar c = Calendar.getInstance(); c.setTime(date); // get the min date in this month int min_day = c.getActualMinimum(Calendar.DATE); c.set(Calendar.DATE, min_day); return c.getTime(); } public static Date getLastDateOfMonth(Date date){ if (date == null) { throw new IllegalArgumentException("the date must not be null"); } Calendar c = Calendar.getInstance(); c.setTime(date); //get the max date in the month int max_day = c.getActualMaximum(Calendar.DATE); c.set(Calendar.DATE, max_day); return c.getTime(); }
public static Date getFirstDateOfWeek(Date date){ Calendar c = Calendar.getInstance(); c.setTime(date);// // 获取本周第一天的值// int firstDayOfWeek = c.getFirstDayOfWeek();// // 当前日期是本周的第几天// int dayOfWeek = c.get(Calendar.DAY_OF_WEEK);// // int day_diff = 1;//天数差的绝对值,20140901~20140903 天数差为3// // if (firstDayOfWeek < dayOfWeek) {// day_diff = Math.abs(dayOfWeek-firstDayOfWeek) + 1;// }// // c.add(Calendar.DATE,1-day_diff); int min_day = c.getActualMinimum(Calendar.DAY_OF_WEEK); c.set(Calendar.DAY_OF_WEEK,min_day); return c.getTime(); } |
private static final int[] seasonFirstMonth = new int[] { 0, 0, 0, 3, 3, 3, 6, 6, 6, 9, 9, 9 }; private static final int[] seasonLastMonth = new int[] { 2, 2, 2, 5, 5, 5, 8, 8, 8, 11, 11, 11 }; public static Date getFirstDateOfSeason(Date date){ if (date == null) { throw new IllegalArgumentException("the date must not be null"); } Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.MONTH, seasonFirstMonth[c.get(Calendar.MONTH)]); c.set(Calendar.DATE, c.getActualMinimum(Calendar.DATE)); return c.getTime(); } public static Date getLastDateOfSeason(Date date){ if (date == null) { throw new IllegalArgumentException("the date must not be null"); } Calendar c = Calendar.getInstance(); c.setTime(date); c.set(Calendar.MONTH, seasonLastMonth[c.get(Calendar.MONTH)]); c.set(Calendar.DATE, c.getActualMaximum(Calendar.DATE)); return c.getTime(); } |
public static long getDaysBetweenTwoDate(Date date1,Date date2){ if (date1 == null || date2 == null) { throw new IllegalArgumentException("date1 and date2 must not be null"); } Calendar c1 = Calendar.getInstance(); c1.setTime(date1); Calendar c2 = Calendar.getInstance(); c2.setTime(date2); long mills_one_day = 60 * 60 * 24 * 1000; return Math.abs(c1.getTimeInMillis() - c2.getTimeInMillis())/mills_one_day + 1; } 附:通过阅读 Java API,借助一些基础的推算逻辑,我们可以合成很多很有用工具类,让我们彼此一起努力。在这一次学习当中,本人更感兴趣的,如何通过指定的字符串格式构造指定的对象(如通过字符串构造日期),又如何通过指定格式输出制定对象(如根据 yyyyMMdd 格式输出 日期对象)。#当年第一天:
SELECT DATE_SUB(CURDATE(),INTERVAL dayofyear(now())-1 DAY); #当年最后一天:
SELECT concat(YEAR(now()),'-12-31'); #当前week的第一天:
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 1 DAY); #当前week的最后一天:
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) - 5 DAY); #前一week的第一天:
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 8 DAY); #前一week的最后一天:
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 1 DAY); #前两week的第一天:
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 15 DAY); #前两week的最后一天:
select date_sub(curdate(),INTERVAL WEEKDAY(curdate()) + 9 DAY); #当前month的第一天:
SELECT concat(date_format(LAST_DAY(now()),'%Y-%m-'),''); #当前month的最后一天:
SELECT LAST_DAY(now()); #前一month的第一天:
SELECT concat(date_format(LAST_DAY(now() - interval 1 month),'%Y-%m-'),''); #前一month的最后一天:
SELECT LAST_DAY(now() - interval 1 month); #前两month的第一天:
SELECT concat(date_format(LAST_DAY(now() - interval 2 month),'%Y-%m-'),''); #前两month的最后一天:
SELECT LAST_DAY(now() - interval 2 month); #当前quarter的第一天:
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-3 month),'%Y-%m-'),''); #当前quarter的最后一天:
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-1 month); #前一quarter的第一天:
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-6 month),'%Y-%m-'),''); #前一quarter的最后一天:
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-4 month); #前两quarter的第一天:
select concat(date_format(LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-9 month),'%Y-%m-'),''); #前两quarter的最后一天:
select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-7 month);
java 和 mysql 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)的更多相关文章
- 编程乐趣:C#获取日期所在周、月份第一和最后一天
原文:编程乐趣:C#获取日期所在周.月份第一和最后一天 写了个小功能,需要用到以周为时间段,于是写了个获取周第一和最后一天的方法,获取月份的第一和最后一天就比较简单了.代码如下: public cla ...
- Mysql 获取当月和上个月第一天和最后一天的SQL
Mysql 获取当月和上个月第一天和最后一天的SQL #获取当前日期select curdate(); #获取当月最后一天select last_day(curdate()); #获取本月的第一天se ...
- java将复数字符串虚部实部分离,并实现加减运算
java字符串构造复数 将字符串分解为复数的实部和虚部 定义一个复数类,数据成员有实部和虚部,根据传参不同构造方法重载,并定义复数的加减方法,以及toString方法.有难度的便是用字符串构造复数了, ...
- Mysql 获取当月和上个月第一天和最后一天的解决方案
#获取当前日期select curdate(); #获取当月最后一天select last_day(curdate()): #获取本月的第一天select date_add(curdate(),int ...
- MYSQL 获取当前星期方法
当前星期一: select subdate(curdate(),date_format(curdate(),'%w')-1) 当前星期日: select subdate(curdate(),date_ ...
- php获取当前周的第一天与最后一天
1 2 3 4 5 6 7 8 9 10 // 当前日期 $sdefaultDate = date("Y-m-d"); // $first =1 表示每周星期一为开始日期 ...
- mysql 获取系统时间的下一天 年-月-日 时:分:秒
DAY) as date
- java根据日期获取周几和获取某段时间内周几的日期
整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...
- java获取当前年、半年、季度、月、日、小时 开始结束时间等
import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 获取 当前年.半年 ...
随机推荐
- 两个Canvas小游戏
或许连小游戏都算不上,可以叫做mini游戏. 没有任何框架或者稍微有点深度的东西,所以有js基础的或者要追求炫酷效果的可以直接ctrl+w了. 先贴出两个游戏的试玩地址: 是男人就走30步 是男人就忍 ...
- [C#解惑] #1 在构造函数内调用虚方法
谜题 在C#中,用virtual关键字修饰的方法(属性.事件)称为虚方法(属性.事件),表示该方法可以由派生类重写(override).虚方法是.NET中的重要概念,可以说在某种程度上,虚方法使得多态 ...
- Servicestack IRequestLogger获取 IHttpRequest
我在 ServiceStack里实现了 Logging 中的请求与返回,同时我想在IRequestLogger.Log() 方法中获取 IHttpRequest . IRequestContext 并 ...
- [poj2484]A Funny Game(对称博弈)
题目:http://poj.org/problem?id=2484 题意:n个石子围成一个圈,两个人轮流取,每次可以取一个石子或者相邻的两个石子,问先手胜还是后手胜 分析: 典型的对称博弈 如果n&g ...
- LXC的介绍
LXC又名Linux container,是一种虚拟化的解决方案,这种是内核级的虚拟化.(主流的解决方案Xen ,KVM, LXC) 介绍 通过namespace进行资源的隔离,Gust1下的进程与G ...
- navigationView 的使用和布局文件的绑定
今天项目进行到了细化内容的部分啦- 需要美化侧滑菜单,并且填充数据.在博客上看了好久发现大家的都大同小异 而且很少有提到如何绑定内容各处求助终于在一片博客上发现了蛛丝马迹!!上大神的帖子:blog.c ...
- JS iframe元素和父页面元素互访
说明:以下内容来自互联网 [1]子页面取得父页面的dom对象 parent.window.$('#id').val(""); [2]父页面取得子页面的对象 $(wind ...
- HTML5基础知识(2)--标题标签的使用
1.HTML文档中包含各种级别的标题,各种级别的标题由<h1>到<h6>元素来定义,<h1>至<h6>标题标记中的字母h是英文headline的简称.其 ...
- MySQL多实例
http://www.kancloud.cn/digest/mysqlsummary/132842http://crazy123.blog.51cto.com/1029610/1611887/ htt ...
- [转]java.lang.OutOfMemoryError: PermGen space及其解决方法
原文地址:http://peak.iteye.com/blog/52606 这个问题是我的工程中加入了Birt报表在Linux环境下运行出现的问题,从网上搜索了一下看到这文章发现并不是由于Birt的原 ...