获取周的第一天,最后一天
System.out.println(getStartEndDate("2016-05-01", 1));
获取星期的第一天和最后一天
System.out.println(getStartEndDate("2016-05-01", 0));
 
    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)
    需要使用到的特殊类:import java.text.ParsePosition;
    /**
     * <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 == JANUARYDAY_OF_MONTH == 32 解释为 February 1。

当 Calendar 处于 non-lenient 模式时,如果其日历字段中存在任何不一致性,它都会抛出一个异常。例如,GregorianCalendar 总是在 1 与月份的长度之间生成 DAY_OF_MONTH 值。如果已经设置了任何超出范围的字段值,那么在计算时间或日历字段值时,处于 non-lenient 模式下的GregorianCalendar会抛出一个异常。(在 non-lenient状态下,可以用来检测用户输入的日期是否合法)

 
 
  • 日期加减(Calendar 的 add && set && roll)
set(int field,int amount) 方法,并不会立刻就计算出新的日期的值,而是在调用 getXxx() , add(),roll() 方法才会计算出新的日期的值,即多次调用set 方法,也不会产生多余的计算。
 
add(int filed, int amount) 方法,调用 add 方法,会立刻计算出新的日期的值。
 
roll(int fielde,int amount) 方法,调用 roll 方法,也会立刻计算出新的日期的值,与 add 不同的是,在进行计算完之后,不更改更高字段的值。
 
举例如下:假设一个日期(Calendar类型)是date 20140831
1)调用date.set(Calendar.Month,Calendar.September),在调用 set(Calendar.Data,1) ,c.getTime() 返回的时间是 20140901
2)调用date.add(Calendar.Month,1), c.getTime() 返回的日期是,20141001。(如果是设置了 c.setLeniency(true),返回的日期是 20141001,如果是设置了 c.setLeniency(false),返回的是 20140930)
3)调用date.roll(Calendar.Month,13),c.setLeniency(flase), c.getTime() 返回的日期是 20140930,请注意这里返回的不是 20141231
 
对于设置日期的值,可以这样编写代码:
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();
    }
roll 日期,可以这样编写代码:
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。具体方法如下:

    构造一个 20140902 的 Calendar,通过 getFirstDayOfWeek() ,获取本周第一天的值(返回1),通过  get(Calendar.day_of_week) 获取当前日期是本周的第几天,进而获取天数差,再将当前日期减去天数差,即可获取本周第一天的日期值。
    函数如下:
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();
    }
 
为了本地化,我们可以用 GregorianCalendar 构造 Calendar,
GregorianCalendar calendar = new GregorianCalendar(Local.getDefault());
 
类似地,我们可以得到本周最后一天的日期:
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();
    }
 
    聪明的我们,是否马上就会想到,能否通过 getActualMaximum 和 getActualMininum 来获取一周 day_of_week 的最大/小值呢??是的,通过这两个方法,我们可以减少一定的计算量,如下:
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();
    }
    借助 getActualMaxinum 和 getActualMininum 可以获得很多最大/小值,如可以获取月、日、时、分、秒的最后/最初一刻,自然就可以获取一年的起始/结束日期,一天的起始/结束时刻等等,发挥想象了,灵活应用 api,就可以很多我们所需要的函数,组织起来就可以是一个 工具类了。
 
    在这里再谈一下,如果获取季度的起始/结束日期,方法如下:
    对于给定的日期,如果我们可以获取到其所在季度的起始月份和结束月份,自然就可以获取到季度的起始日期和结束日期。函数如下:
    在这里我们初始化静态数组,用来存储每个月所在季度第一个和最后一个月份的值,注意在 java 里,月份的范围是[0,11]
private static final int[] seasonFirstMonth = new int[] { 000333,
        666999 };
 
    private static final int[] seasonLastMonth = new int[] { 222555,
        888111111 };
     
    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();
    }
 
    最后谈一下,如何去计算两个日期之间的天数差(规定如下,20140901~20140903,天数差为3),函数如下:
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 格式输出 日期对象)。
 
MYSQL中的获取:
#当年第一天:
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 获取周 星期 的第一天 最后一天 或者 月的 日期(字符串转日期,日期转字符串,日期加减)的更多相关文章

  1. 编程乐趣:C#获取日期所在周、月份第一和最后一天

    原文:编程乐趣:C#获取日期所在周.月份第一和最后一天 写了个小功能,需要用到以周为时间段,于是写了个获取周第一和最后一天的方法,获取月份的第一和最后一天就比较简单了.代码如下: public cla ...

  2. Mysql 获取当月和上个月第一天和最后一天的SQL

    Mysql 获取当月和上个月第一天和最后一天的SQL #获取当前日期select curdate(); #获取当月最后一天select last_day(curdate()); #获取本月的第一天se ...

  3. java将复数字符串虚部实部分离,并实现加减运算

    java字符串构造复数 将字符串分解为复数的实部和虚部 定义一个复数类,数据成员有实部和虚部,根据传参不同构造方法重载,并定义复数的加减方法,以及toString方法.有难度的便是用字符串构造复数了, ...

  4. Mysql 获取当月和上个月第一天和最后一天的解决方案

    #获取当前日期select curdate(); #获取当月最后一天select last_day(curdate()): #获取本月的第一天select date_add(curdate(),int ...

  5. MYSQL 获取当前星期方法

    当前星期一: select subdate(curdate(),date_format(curdate(),'%w')-1) 当前星期日: select subdate(curdate(),date_ ...

  6. php获取当前周的第一天与最后一天

    1 2 3 4 5 6 7 8 9 10 // 当前日期   $sdefaultDate = date("Y-m-d");   // $first =1 表示每周星期一为开始日期  ...

  7. mysql 获取系统时间的下一天 年-月-日 时:分:秒

    DAY) as date

  8. java根据日期获取周几和获取某段时间内周几的日期

    整理两个日期的方法. 根据日期获取当天是周几 /** * 根据日期获取当天是周几 * @param datetime 日期 * @return 周几 */ public static String d ...

  9. java获取当前年、半年、季度、月、日、小时 开始结束时间等

    import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; /** * 获取 当前年.半年 ...

随机推荐

  1. ASP.NET MVC 关闭 客户端 xss 检查

    为防止 XSS 攻击,asp.net 机制 会默认检测 请求报文 内是否有包含html标签,以提醒开发人员处理,报错如下:"从客户端中检测到有潜在危险的Request...值"当我 ...

  2. JavaScript中call,apply,bind方法的总结。

    why?call,apply,bind干什么的?为什么要学这个? 一般用来指定this的环境,在没有学之前,通常会有这些问题. var a = { user:"追梦子", fn:f ...

  3. 开源免费的HTML5游戏引擎——青瓷引擎(QICI Engine) 1.0正式版发布了!

    青瓷引擎的成长 青瓷引擎自2015年4月项目启动开始,7月首次亮相2015年ChinaJoy,便得到业界的极大关注,随后开启限量测试,收到数百个开发者团队的试用申请及反馈,期间经历了18个内测版本,完 ...

  4. 20151120 - 蓝牙鼠标与 WiFi 冲突的解决办法

    问题现象描述:Windows 下蓝牙鼠标移动时不连贯 电脑:Dell 2015 版 NEW XPS 15 鼠标:Microsoft Bluetooth Designer Mouse 操作系统:Wind ...

  5. factor graph model

    主实验 文慧:用户,商品,评分,review,ranking. 数据集:数据规模,论文源代码

  6. JavaScript学习笔记-简单的倒计时跳转页面

    <!DOCTYPE html> <html lang="en" xmlns="http://www.w3.org/1999/xhtml"> ...

  7. Volley用法

    RequestQueue requestQueue = Volley.newRequestQueue(this); JsonObjectRequest jsonObjectRequest = new ...

  8. Android数据格式解析对象JSON用法(转)

    地址:http://www.cnblogs.com/devinzhang/archive/2012/01/09/2317315.html 里面的重点: JSON解析案例     (1)解析Object ...

  9. iOS开发小技巧--自定义带有占位文字的TextView(两种方式)

    自定义控件注意或框架注意:自己暴露在外面的属性,一定要重写setter,保证外界与内部的交互性 一.方案一:通过drawRect:方法将文字画到textView中,监听文字改变用的是通知中心(代理也可 ...

  10. 线性回归&&code

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from certifi import __mai ...