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-'),'01'); #当前month的最后一天: SELECT LAST_DAY(now()); #前一month的第一天: SELECT concat(date_format(LAST_DAY(now() - interval 1 month),'%Y-%m-'),'01'); #前一month的最后一天: SELECT LAST_DAY(now() - interval 1 month); #前两month的第一天: SELECT concat(date_format(LAST_DAY(now() - interval 2 month),'%Y-%m-'),'01'); #前两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-'),'01'); #当前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-'),'01'); #前一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-'),'01'); #前两quarter的最后一天: select LAST_DAY(MAKEDATE(EXTRACT(YEAR FROM CURDATE()),1) + interval QUARTER(CURDATE())*3-7 month);
java 和 mysql 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)...相关推荐
- mysql 获取本月/上月/下月第一天/最后一天
select curdate(); -- 获取当前日期 select last_day(curdate()); -- 获取当月最后一天. select DATE_ADD(curdate(),inter ...
- java 根据年月获取周数、天数
java 根据年月获取周数.天数 大家好,我是酷酷的韩~ 1.根据年月获取周数 /*** @Description: 根据年月获取周数* @Param: [year, month]* @return: ...
- Mysql 获取当月和上个月第一天和最后一天
Mysql 获取当月和上个月第一天和最后一天的解决方案 获取当前日期 select curdate(); 获取当月最后一天 select last_day(curdate()): 获取本月的第一天 s ...
- mysql获取近几年、近几个月、近几天的数据
mysql获取近几年.近几个月.近几周.近几天的数据 1.获取近几年的数据 SELECT * FROM 表名 WHERE 时间字段>DATE_SUB(CURDATE(), INTERVAL 年数 ...
- 获取当前日期是本年的第几周java与mysql获取值不一致
SELECT YEARWEEK(now()); 在数据库查询出的本年第几周和java中获取的不一样, 研究了下原来是java里有两个关键设置,一个是从周几开始计算周,另外一个是一周最小要过了几天才算一 ...
- java date加一天_Java日期时间API系列15-----Jdk8中API类,java日期计算2,年月日时分秒的加减等...
通过Java日期时间API系列8-----Jdk8中java.time包中的新的日期时间API类的LocalDate源码分析 ,可以看出java8设计非常好,实现接口Temporal, Tempora ...
- Mysql 获取当月和上个月第一天和最后一天的解决方案
#获取当前日期 select curdate(); #获取当月最后一天 select last_day(curdate()): #获取本月的第一天 select date_add(curdate(), ...
- Mysql 获取当月和上个月第一天和最后一天的SQL
#获取当前日期 select curdate(); #获取当月最后一天 select last_day(curdate()); #获取本月的第一天 select date_add(curdate(), ...
- mysql 以周为单位记录数据_mysql 按月/按周汇总统计函数 DATE_FORMAT() 函数
MySQL DATE_FORMAT() 函数 定义和用法 DATE_FORMAT() 函数用于以不同的格式显示日期/时间数据. 语法 DATE_FORMAT(date,format) date 参数是 ...
最新文章
- Colocation Guard公司再增1万平方英尺的数据中心空间
- 实验0 了解和熟悉操作系统
- 浮点数能进行取模运算吗?(不行,暂时只能是两个整数之间)
- 基于 Kotlin 一行代码实现 android 导航栏 BottomBar
- 每日程序C语言29-将数组逆序输出
- 18寒假最后一测+dijistra模板
- 随机迷宫c语言实验报告,[原创]递归随机迷宫生成算法详解
- Python isinstance函数 - Python零基础入门教程
- 用 Python 编写一个天气查询应用 pyqt5
- mysql事务隔离级别及传播机制
- linux常用文本操作命令
- linux db2升级,linux 下 db2 v97 升级到db2 v10.1 实战
- 【转】NUnit2.0详细使用方法
- bootstrap 响应式布局
- Solaris操作系统介绍
- 四个Channel的讲解
- 支付宝扫码跳转到跳转页面
- NI LabVIEW 2014SP1视觉开发必备软件和工具包
- Unity中初步使用Navmesh寻路系统
- 英语学习感悟,培养自信心,远离挫败感,人生更精彩