先看效果图,再说遇到的需求。
需求:
根据左边自定义tab,切换图表展示样式,切换日期类型,展示时展示当日日期,当前周日期段,当前月日期段,当前年,可以通过左右两边箭头,切换一上天下一天,上一周下一周,上一月下一月,上一年下一年功能。当日期是当天,当周,当月,当年时,不可点击右侧箭头切换下一天,下一周,下一月,下一年。
具体实现:
第一步:获取当天日期,获取本周第一天和最后一天,获取本月第一天和最后一天,获取本年年份:
//获取当日日期
//获取当前时间的时间戳
private long systemTime = System.currentTimeMillis();
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
Date mDate = new Date(systemTime);
String textDate = mDateFormat.format(mDate);//年月日
//日期展示TextView
mTime_tv.setText(textDate);
//获取本周时间段,本周第一天和本周最后一天
Calendar mCalender = Calendar.getInstance();
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//通用的周一&周日时间戳变量
private long mWeekStartTime;
private long mWeekEndTime;
mCalender.set(Calendar.DAY_OF_WEEK, Calendar.MONDAY);
String weekStart = mDateFormat.format(mCalender.getTime());
long nowWeekStart = mDateFormat.parse(weekStart).getTime();
mWeekStartTime = nowWeekStart;
Calendar ca = Calendar.getInstance();
ca.setFirstDayOfWeek(Calendar.MONDAY);
ca.set(Calendar.DAY_OF_WEEK, ca.getFirstDayOfWeek() + 6); // Sunday
String weekEnd = mDateFormat.format(ca.getTime());
long nowWeekEnd = mDateFormat.parse(weekEnd).getTime();
mWeekEndTime = nowWeekEnd;
mTime_tv.setText(weekStart + "——" + weekEnd);
//获取本月月初第一天和本月月末最后一天日期时间段
String startMonthTime = nowMonthStartTime(monthMultiple);
String endMonthTime = nowMonthEndTime(monthMultiple);
mTime_tv.setText(startMonthTime + "——" + endMonthTime);
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//获取本月的第一天和最后一天
private String nowMonthStartTime(int monthMultiple) {
Date date = new Date(systemTime);
// 获取指定日期所在月的第一天
Calendar calendar = Calendar.getInstance();
// 设置指定日期
calendar.setTime(date);
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + monthMultiple, 1);
Date startDate = calendar.getTime();
String dateStart = mDateFormat.format(startDate);
return dateStart;
}
//获取本月最后一天
private String nowMonthEndTime(int monthMultiple) {
Date date = new Date(systemTime);
Calendar calendarEnd = Calendar.getInstance();
// 设置指定日期
calendarEnd.setTime(date);
calendarEnd.set(calendarEnd.get(Calendar.YEAR), calendarEnd.get(Calendar.MONTH) + monthMultiple, 1);
// 最后一天
calendarEnd.roll(Calendar.DATE, -1);
Date dateend = calendarEnd.getTime();
String dateEnd = mDateFormat.format(dateend);
return dateEnd;
}
//获取今年的年份
//下面的方法可以获取某年的第一天和某年的最后一天,通过SimpleDateFormat来进行决定。
/**
* 获取某年第一天日期
*
* @param year 年份
* @return Date
*/
private String getYearFirst(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
Date currYearFirst = calendar.getTime();
String startTime = mYearFormat.format(currYearFirst);
return startTime;
}
/**
* 获取某年最后一天日期
*
* @param year 年份
* @return Date
*/
private String getYearLast(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
calendar.roll(Calendar.DAY_OF_YEAR, -1);
Date currYearLast = calendar.getTime();
String endTime = mYearFormat.format(currYearLast);
return endTime;
}
//+1900是因为这个方法获取年份是1900开始计算的。
Date mDate = new Date(System.currentTimeMillis());
private int mYear = mDate.getYear() + 1900;;
SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy年");
//年
String yearFirst = getYearFirst(mYear);
String yearLast = getYearLast(mYear);
mTime_tv.setText(yearFirst);
第二步:
日期获取完之后,实现点击左右两边箭头,切换日期。
1):上一天:
Date mDate = new Date(System.currentTimeMillis())
private long oneDay = 24 * 60 * 60 * 1000;
//上一天
long lastOneDay = mDate.getTime() - oneDay;
mDate = new Date(lastOneDay);
SimpleDateFormat lastdateFormat = new SimpleDateFormat("yyyy年MM月dd日");
String lasttextDate = lastdateFormat.format(mDate);//年月日
mTime_tv.setText(lasttextDate);
2):下一天:
private Date mDate ;
private long oneDay = 24 * 60 * 60 * 1000;
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
long nextOneDay = mDate.getTime() + oneDay;
mDate = new Date(nextOneDay);
String nextTextDate = mDateFormat.format(mDate);//年月日
mTime_tv.setText(nextTextDate);
3):上一周:
//通用的周一&周日时间戳变量,在获取当前周的周一和周末时有用到,切换上下周也要用
private long mWeekStartTime;
private long mWeekEndTime;
private long oneWeek = 24 * 60 * 60 * 1000 * 7;
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
mWeekStartTime = mWeekStartTime - oneWeek;
mWeekEndTime = mWeekEndTime - oneWeek;
Date startTimeDate = new Date(mWeekStartTime);
Date endTimeDate = new Date(mWeekEndTime);
String startWeek = mDateFormat.format(startTimeDate);
String endWeek = mDateFormat.format(endTimeDate);
mTime_tv.setText(startWeek + "——" + endWeek);
4):下一周:
//通用的周一&周日时间戳变量,在获取当前周的周一和周末时有用到,切换上下周也要用
private long mWeekStartTime;
private long mWeekEndTime;
private long oneWeek = 24 * 60 * 60 * 1000 * 7;
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
mWeekStartTime = mWeekStartTime + oneWeek;
mWeekEndTime = mWeekEndTime + oneWeek;
Date startTimeDate = new Date(mWeekStartTime);
Date endTimeDate = new Date(mWeekEndTime);
String startWeek = mDateFormat.format(startTimeDate);
String endWeek = mDateFormat.format(endTimeDate);
mTime_tv.setText(startWeek + "——" + endWeek);
5):上一月:
private int monthMultiple = 0; //用来计数,上一月就减一,下一月就加1,当为0时不让下一月
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//点击事件中:
monthMultiple--;
String nextStartTime = nowMonthStartTime(monthMultiple);
String nextEndTime = nowMonthEndTime(monthMultiple);
mTime_tv.setText(nextStartTime + "——" + nextEndTime);
//获取本月的第一天和最后一天
private String nowMonthStartTime(int monthMultiple) {
Date date = new Date(systemTime);
// 获取指定日期所在月的第一天
Calendar calendar = Calendar.getInstance();
// 设置指定日期
calendar.setTime(date);
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + monthMultiple, 1);
Date startDate = calendar.getTime();
String dateStart = mDateFormat.format(startDate);
return dateStart;
}
//获取本月最后一天
private String nowMonthEndTime(int monthMultiple) {
Date date = new Date(systemTime);
Calendar calendarEnd = Calendar.getInstance();
// 设置指定日期
calendarEnd.setTime(date);
calendarEnd.set(calendarEnd.get(Calendar.YEAR), calendarEnd.get(Calendar.MONTH) + monthMultiple, 1);
// 最后一天
calendarEnd.roll(Calendar.DATE, -1);
Date dateend = calendarEnd.getTime();
String dateEnd = mDateFormat.format(dateend);
return dateEnd;
}
6):下一月:
private int monthMultiple = 0; //用来计数,上一月就减一,下一月就加1,当为0时不让下一月
private SimpleDateFormat mDateFormat = new SimpleDateFormat("yyyy年MM月dd日");
//点击事件中:
monthMultiple++;
String nextStartTime = nowMonthStartTime(monthMultiple);
String nextEndTime = nowMonthEndTime(monthMultiple);
mTime_tv.setText(nextStartTime + "——" + nextEndTime);
//获取本月的第一天和最后一天
private String nowMonthStartTime(int monthMultiple) {
Date date = new Date(systemTime);
// 获取指定日期所在月的第一天
Calendar calendar = Calendar.getInstance();
// 设置指定日期
calendar.setTime(date);
calendar.set(calendar.get(Calendar.YEAR), calendar.get(Calendar.MONTH) + monthMultiple, 1);
Date startDate = calendar.getTime();
String dateStart = mDateFormat.format(startDate);
return dateStart;
}
//获取本月最后一天
private String nowMonthEndTime(int monthMultiple) {
Date date = new Date(systemTime);
Calendar calendarEnd = Calendar.getInstance();
// 设置指定日期
calendarEnd.setTime(date);
calendarEnd.set(calendarEnd.get(Calendar.YEAR), calendarEnd.get(Calendar.MONTH) + monthMultiple, 1);
// 最后一天
calendarEnd.roll(Calendar.DATE, -1);
Date dateend = calendarEnd.getTime();
String dateEnd = mDateFormat.format(dateend);
return dateEnd;
}
7):上一年:
private Date mDate = new Date(System.currentTimeMillis());
private int mChangeYear = mDate.getYear() + 1900;
private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy年");
//点击事件
//上一年
mChangeYear--;
String yearFirst = getYearFirst(mChangeYear);
mTime_tv.setText(yearFirst);
/**
* 获取某年第一天日期
*
* @param year 年份
* @return Date
*/
private String getYearFirst(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
Date currYearFirst = calendar.getTime();
String startTime = mYearFormat.format(currYearFirst);
return startTime;
}
8):下一年:
private Date mDate = new Date(System.currentTimeMillis());
private int mChangeYear = mDate.getYear() + 1900;
private SimpleDateFormat mYearFormat = new SimpleDateFormat("yyyy年");
//点击事件
mChangeYear ++;
String yearFirst = getYearFirst(mChangeYear);
mTime_tv.setText(yearFirst);
/**
* 获取某年第一天日期
*
* @param year 年份
* @return Date
*/
private String getYearFirst(int year) {
Calendar calendar = Calendar.getInstance();
calendar.clear();
calendar.set(Calendar.YEAR, year);
Date currYearFirst = calendar.getTime();
String startTime = mYearFormat.format(currYearFirst);
return startTime;
}