Android 特定日期筛选器
Android日期筛选
最近接到了一个新的需求:
通过一个日期选择器筛选出自己想要的特定日期
先上效果图:
实现思路及过程
我这里是用RecyclerView实现的这个效果,将RecycleView分为两部分,头部只显示月份,日期则放在了第二部分,通过点击动态修改总数据的itemState 状态实现其效果 最重要的:(通过切换上个月下个月因此状态的改变不能只改变当前数据,需要一个总数据容器记录所有数据,当点击状态发生变化,修改总数据中的当前选中的状态)
先来看我的实体类:
public class DateBean {
//item类型
public static int item_type_day = 1;//日期item
public static int item_type_month = 2;//月份item
int itemType = 1;//默认是日期item
//item状态
public static int ITEM_STATE_BEGIN_DATE = 1;//开始日期
public static int ITEM_STATE_END_DATE = 2;//结束日期
public static int ITEM_STATE_SELECTED = 3;//选中状态
public static int ITEM_STATE_NORMAL = 4;//正常状态
public int itemState = ITEM_STATE_NORMAL;
Date date;//具体日期
String day;//一个月的某天
String monthStr;//YY-MM
int position;
int level;
public int getItemState() {
return itemState;
}
public void setItemState(int itemState) {
this.itemState = itemState;
}
public int getItemType() {
return itemType;
}
public void setItemType(int itemType) {
this.itemType = itemType;
}
public String getMonthStr() {
return monthStr;
}
public void setMonthStr(String monthStr) {
this.monthStr = monthStr;
}
public static int getItem_type_month() {
return item_type_month;
}
public static void setItem_type_month(int item_type_month) {
DateBean.item_type_month = item_type_month;
}
public static int getItem_type_day() {
return item_type_day;
}
public static void setItem_type_day(int item_type_day) {
DateBean.item_type_day = item_type_day;
}
public String getDay() {
return day;
}
public void setDay(String day) {
this.day = day;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getPosition() {
return position;
}
public void setPosition(int position) {
this.position = position;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
@Override
public String toString() {
return "DateBean{" +
"itemType=" + itemType +
", itemState=" + itemState +
", date=" + date +
", day='" + day + '\'' +
", monthStr='" + monthStr + '\'' +
'}';
}
}
详细的都有注释 这里就不再啰嗦了
Aadpter内的内容如下:
public class CalendarAdapter extends BaseAdapter<DateBean, RecyclerView.ViewHolder>{
private OnDateSelect dateSelect;
public CalendarAdapter(Context context){
super(context);
}
@Override
protected RecyclerView.ViewHolder onCreateChildViewHolder(ViewGroup parent, int viewType) {
if (viewType==DateBean.item_type_month){
return new MonthViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_month, parent, false));
}else {
return new DayViewHolder(LayoutInflater.from(parent.getContext()).inflate(R.layout.item_day, parent, false));
}
}
@Override
protected void onBindDataViewHolder(RecyclerView.ViewHolder holder, int position, DateBean dateBean) {
if (holder instanceof MonthViewHolder){
((MonthViewHolder) holder).mTvMonth.setText(dateBean.monthStr);
}else if(holder instanceof DayViewHolder){
((DayViewHolder) holder).mTvDay.setText(dateBean.getDay());
if (dateBean.getItemState() == DateBean.ITEM_STATE_BEGIN_DATE || dateBean.getItemState() == DateBean.ITEM_STATE_END_DATE) {
//开始日期或结束日期
((DayViewHolder) holder).mTvDay.setTextColor(Color.WHITE);
if(dateBean.getItemState() == DateBean.ITEM_STATE_BEGIN_DATE){
holder.itemView.setBackgroundResource(R.drawable.day_start);
}
if(dateBean.getItemState() == DateBean.ITEM_STATE_END_DATE){
holder.itemView.setBackgroundResource(R.drawable.day_end);
}
} else if (dateBean.getItemState() == DateBean.ITEM_STATE_SELECTED) {
//选中状态
holder.itemView.setBackgroundColor(Color.parseColor("#40ffa500"));
((DayViewHolder) holder).mTvDay.setTextColor(Color.WHITE);
} else {
//正常状态
holder.itemView.setBackgroundColor(Color.WHITE);
((DayViewHolder) holder).mTvDay.setTextColor(Color.BLACK);
}
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if (dateSelect!=null){
dateSelect.onDateSelectStatusChanged(dateBean,position);
}
}
});
}
}
static class MonthViewHolder extends RecyclerView.ViewHolder {
View view;
TextView mTvMonth;
public MonthViewHolder(@NonNull View itemView) {
super(itemView);
this.view = itemView;
mTvMonth = itemView.findViewById(R.id.tv_month);
}
}
static class DayViewHolder extends RecyclerView.ViewHolder {
View view;
TextView mTvDay;
public DayViewHolder(@NonNull View itemView) {
super(itemView);
this.view = itemView;
mTvDay = itemView.findViewById(R.id.tv_day);
}
}
@Override
public int getItemViewType(int position) {
if (getMds().get(position).itemType==DateBean.item_type_month){
return DateBean.item_type_month;
}else {
return DateBean.item_type_day;
}
}
public interface OnDateSelect{
void onDateSelectStatusChanged(DateBean dateBean,int position);
}
public void setOnDateSelect(OnDateSelect select){
dateSelect = select;
}
}
Adapter里面主要是对每个状态下显示什么样的效果进行了效果展示,点击事件后的主要逻辑通过接口回调到了具体使用的Activity中去了。
最最主要的Activity的代码:
public class CalendarActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private CalendarAdapter mCalendarAdapter;
private LruCache<String, List<DateBean>> mDateBeanLruCache = new LruCache<>(3);
private DateBean startDate,endDate;
private TextView nextMonth;
private TextView currentMonth;
private ImageView imageView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_calendar);
initView();
}
private void initView() {
mRecyclerView = findViewById(R.id.calendar_list);
mCalendarAdapter = new CalendarAdapter(this);
TextView previousMonth = findViewById(R.id.tvUp);
nextMonth = findViewById(R.id.tvDown);
currentMonth = findViewById(R.id.tvMonth);
previousMonth.setOnClickListener(view -> {
initData("2022-07");
});
nextMonth.setOnClickListener(view -> {
initData("2022-09");
});
currentMonth.setOnClickListener(view -> {
initData("2022-08");
});
GridLayoutManager gridLayoutManager = new GridLayoutManager(this, 7);
gridLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int i) {
if (DateBean.item_type_month == mCalendarAdapter.getMds().get(i).getItemType()) {
return 7;
} else {
return 1;
}
}
});
mRecyclerView.setLayoutManager(gridLayoutManager);
mRecyclerView.setAdapter(mCalendarAdapter);
mCalendarAdapter.setOnDateSelect((dateBean, position) -> {
if (dateBean.day.isEmpty()){
return;
}
List<DateBean> dateBeans = mDateBeanLruCache.get(dateBean.monthStr);
if (dateBeans==null || dateBeans.isEmpty()){
return;
}
//是否有开始时间
if (startDate==null){
if (endDate==null || Integer.parseInt(endDate.day)>Integer.parseInt(dateBean.day)){
startDate = dateBean;
startDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
}else if (Integer.parseInt(endDate.day)<Integer.parseInt(dateBean.day)){//结束时间小于当前选中时间
if (endDate.level>dateBean.level){//08>07
startDate = dateBean;
startDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
return;
}
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_END_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(endDate.getPosition(),mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()));
startDate = endDate;
startDate.position = endDate.position;
endDate = dateBean;
endDate.position = position;
showDate();
}
}else {
if (Integer.parseInt(startDate.day)>Integer.parseInt(dateBean.day)){//开始日期 大于 当前选中的日期
if (endDate!=null){
if (endDate.level>dateBean.level){
mDateBeanLruCache.get(startDate.monthStr).get(startDate.getPosition()).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(startDate.position,mDateBeanLruCache.get(startDate.monthStr).get(startDate.position));
startDate = dateBean;
startDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
return;
}
mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(endDate.position,mDateBeanLruCache.get(endDate.monthStr).get(endDate.position));
showDate();
}
if (startDate.level<dateBean.level){//08>07
endDate = dateBean;
endDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_END_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
return;
}
endDate = startDate;
endDate.position = startDate.position;
mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()).itemState = DateBean.ITEM_STATE_END_DATE;
mCalendarAdapter.notifyItemChanged(endDate.getPosition(),mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()));
startDate = dateBean;
startDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
}else if (Integer.parseInt(startDate.day)<Integer.parseInt(dateBean.day)){//开始日期小于 当前选中的日期
if (endDate!=null){
if (Integer.parseInt(endDate.day)==Integer.parseInt(dateBean.day) && dateBean.level==endDate.level){
endDate = null;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
return;
}
if (dateBean.level<endDate.level){
mDateBeanLruCache.get(startDate.monthStr).get(startDate.getPosition()).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(startDate.getPosition(),mDateBeanLruCache.get(startDate.monthStr).get(startDate.getPosition()));
startDate = dateBean;
startDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
return;
}else {
mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(endDate.position,mDateBeanLruCache.get(endDate.monthStr).get(endDate.position));
showDate();
}
}
if (startDate.level>dateBean.level){//08>07
endDate = startDate;
endDate.position = startDate.position;
startDate = dateBean;
startDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_BEGIN_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()).itemState = DateBean.ITEM_STATE_END_DATE;
mCalendarAdapter.notifyItemChanged(endDate.getPosition(),mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()));
showDate();
return;
}
endDate = dateBean;
endDate.position = position;
dateBean.itemState = DateBean.ITEM_STATE_END_DATE;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_END_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
}else if (Integer.parseInt(startDate.day)==Integer.parseInt(dateBean.day) && dateBean.level==startDate.level){//开始日期 等于 选中日期
startDate = null;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
}else if (Integer.parseInt(startDate.day)==Integer.parseInt(dateBean.day) && dateBean.level>startDate.level){//日期相同 开始日期大于选中日期 ()
mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()).itemState = DateBean.ITEM_STATE_NORMAL;
mCalendarAdapter.notifyItemChanged(endDate.position,mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition()));
endDate = dateBean;
endDate.position = position;
mDateBeanLruCache.get(dateBean.monthStr).get(position).itemState = DateBean.ITEM_STATE_END_DATE;
mCalendarAdapter.notifyItemChanged(position,mDateBeanLruCache.get(dateBean.monthStr).get(position));
showDate();
}
}
});
//DateUtils.getCurrDate(DateUtils.MONTG_DATE_FORMAT)
initData(DateUtils.getCurrDate(DateUtils.MONTG_DATE_FORMAT));
}
//计算 开始时间和结束时间之间的选中
private void showDate(){
if (startDate==null ||endDate==null) return;
//算出
List<DateBean> startDateBeanContainer = mDateBeanLruCache.get(startDate.monthStr);
DateBean startDateBean = mDateBeanLruCache.get(startDate.monthStr).get(startDate.getPosition());
int startLevel = startDateBean.getLevel();
List<DateBean> endDateBeanContainer = mDateBeanLruCache.get(endDate.monthStr);
DateBean endDateBean = mDateBeanLruCache.get(endDate.monthStr).get(endDate.getPosition());
int endLevel = endDateBean.getLevel();
if (startLevel==endLevel){//同一月份
//清楚之前的状态
resetAllStateSelected();
for (int i = startDate.getPosition()+1; i < endDate.getPosition(); i++) {
mDateBeanLruCache.get(startDate.monthStr).get(i).itemState=DateBean.ITEM_STATE_SELECTED;
mCalendarAdapter.notifyItemChanged(i,mDateBeanLruCache.get(startDate.monthStr).get(i));
}
}else {
//清楚之前的状态
resetAllStateSelected();
for (int i= startDate.getPosition()+1;i<startDateBeanContainer.size();i++){
mDateBeanLruCache.get(startDate.monthStr).get(i).itemState=DateBean.ITEM_STATE_SELECTED;
//mCalendarAdapter.notifyItemChanged(i,mDateBeanLruCache.get(startDate.monthStr).get(i));
}
for (int i=0;i<endDate.getPosition();i++){
mDateBeanLruCache.get(endDate.monthStr).get(i).itemState=DateBean.ITEM_STATE_SELECTED;
}
//间隔超过一个月
if (startLevel+1<endLevel){
String[] split = startDate.monthStr.split("-");
int year = Integer.parseInt(split[0]);
int week = Integer.parseInt(split[1]);
int nextWeek = 0;
int currentYear = 0;
if (week>=12){
nextWeek = 1;
currentYear = year+1;
}else {
currentYear = year;
nextWeek = week+1;
}
String key = currentYear + "-" + (nextWeek < 10 ? "0" + nextWeek : nextWeek);
for (int i = 0; i < mDateBeanLruCache.get(key).size(); i++) {
mDateBeanLruCache.get(key).get(i).itemState=DateBean.ITEM_STATE_SELECTED;
}
}
//间隔一个月 及多个月份
// for (int i = startLevel; i <= endLevel; i++) {
// for (int i=Integer.parseInt(startDateBean.getDay())+2;i<Integer.parseInt(endDateBean.getDay())+1;i++){
//
// }
// }
}
}
@SuppressLint("NotifyDataSetChanged")
private void resetAllStateSelected() {
Iterator<Map.Entry<String, List<DateBean>>> iterator = mDateBeanLruCache.snapshot().entrySet().iterator();
while (iterator.hasNext()) {
List<DateBean> value = iterator.next().getValue();
for (int i = 0; i < value.size(); i++) {
if (value.get(i).itemState==DateBean.ITEM_STATE_SELECTED){
value.get(i).itemState = DateBean.ITEM_STATE_NORMAL;
}
}
mCalendarAdapter.notifyDataSetChanged();
}
}
private void initData(String monthStr) {
if (mDateBeanLruCache.get(monthStr)!=null && !mDateBeanLruCache.get(monthStr).isEmpty()){
mCalendarAdapter.initMDatas(mDateBeanLruCache.get(monthStr));
return;
}
int level = Integer.parseInt(DateUtils.getLastDayOfMonth(DateUtils.stringtoDate(monthStr,DateUtils.MONTG_DATE_FORMAT),"MM"));
List < DateBean > dateBeans = new ArrayList<>();
//先设置月份的
DateBean monthBean = new DateBean();
monthBean.setItemType(DateBean.item_type_month);
monthBean.setMonthStr(monthStr);
monthBean.setLevel(level);
dateBeans.add(monthBean);
//设置当前月的天数 获取当前月的第一天和最后一天
int firstDayOfMonth = Integer.parseInt(DateUtils.getFirstDayOfMonth(DateUtils.stringtoDate(monthStr,DateUtils.MONTG_DATE_FORMAT),DateUtils.FORMAT_DATE));
int lastDayOfMonth = Integer.parseInt(DateUtils.getLastDayOfMonth(DateUtils.stringtoDate(monthStr,DateUtils.MONTG_DATE_FORMAT),DateUtils.FORMAT_DATE));
String week = DateUtils.getWeek(DateUtils.stringtoDate(monthStr+"-01",DateUtils.LONG_DATE_FORMAT));
switch (week){
case "星期一":
addDatePlaceholder(dateBeans,1,monthStr,level);
break;
case "星期二":
addDatePlaceholder(dateBeans,2,monthStr,level);
break;
case "星期三":
addDatePlaceholder(dateBeans,3,monthStr,level);
break;
case "星期四":
addDatePlaceholder(dateBeans,4,monthStr,level);
break;
case "星期五":
addDatePlaceholder(dateBeans,5,monthStr,level);
break;
case "星期六":
addDatePlaceholder(dateBeans,6,monthStr,level);
break;
}
for (int i=firstDayOfMonth;i<=lastDayOfMonth;i++){
DateBean dayBean = new DateBean();
dayBean.setItemType(DateBean.item_type_day);
dayBean.setMonthStr(monthStr);
dayBean.setDay(String.valueOf(i));
dayBean.setLevel(level);
dayBean.setItemState(DateBean.ITEM_STATE_NORMAL);
dateBeans.add(dayBean);
}
mDateBeanLruCache.put(monthStr,dateBeans);
mCalendarAdapter.initMDatas(dateBeans);
}
private void addDatePlaceholder(List<DateBean> dateBeans, int count, String monthStr,int level) {
for (int i = 0; i < count; i++) {
DateBean dateBean = new DateBean();
dateBean.setItemType(DateBean.item_type_day);
dateBean.setMonthStr(monthStr);
dateBean.setLevel(level);
dateBeans.add(dateBean);
}
}
}
这里通过LRUcache 默认只记录最近使用的3个月份的数据,如果有其他的需求可以直接使用HashMap记录总数据(这里只是一个实现方式)
这只是本人的初步完成的一个稿图,如果有其他的需求,可以在上面的实体类中进行修改,从而完成自己的需求。
扩展类
DateUtils.class
public class DateUtils {
// 格式:年-月-日 小时:分钟:秒
public static final String FORMAT_ONE = "yyyy-MM-dd HH:mm:ss";
// 格式:年-月-日 小时:分钟
public static final String FORMAT_TWO = "yyyy-MM-dd HH:mm";
// 格式:M月d
public static final String SHORT_DATE_MONTH_FORMAT = "MM/dd";
// 格式:年月日 小时分钟秒
public static final String FORMAT_THREE = "yyyyMMdd-HHmmss";
// 格式:年-月-日
public static final String LONG_DATE_FORMAT = "yyyy-MM-dd";
// 格式:yyyyMMdd
public static final String LONG_DATE_FORMAT_TWO = "yyyyMMdd";
//格式不 补零
public static final String LONG_NO_ZOO_FORMAT = "yyyy-M-d";
//格式 年
public static final String YEAR_FORMAT = "yyyy年";
// 格式:月-日
public static final String SHORT_DATE_FORMAT = "MM-dd";
public static final String FORMAT_DATE = "dd";
//格式:04月-21日
public static final String SHORT_DATE_FORMAT_TYPE = "MM月dd日";
// 格式:小时:分钟:秒
public static final String LONG_TIME_FORMAT = "HH:mm:ss";
// 格式 :小时:分钟
public static final String HOUR_MINUTE = "HH:mm";
// 格式:年-月
public static final String MONTG_DATE_FORMAT = "yyyy-MM";
// 年的加减
public static final int SUB_YEAR = Calendar.YEAR;
// 月加减
public static final int SUB_MONTH = Calendar.MONTH;
// 天的加减
public static final int SUB_DAY = Calendar.DATE;
// 小时的加减
public static final int SUB_HOUR = Calendar.HOUR;
// 分钟的加减
public static final int SUB_MINUTE = Calendar.MINUTE;
// 秒的加减
public static final int SUB_SECOND = Calendar.SECOND;
// 格式:月-日-时-分
public static final String SHORT_DATE_FORMAT_LONG_TIME = "MM-dd HH:mm";
public static final String LONG_SECONDS_FORMAT = "mm:ss";
private static String datePattern = "MM/dd/yyyy";
private static String timePattern = datePattern + " HH:MM a";
// 格式:年-月-日
public static final String MONTG_DATE_FORMAT_YEAR_DAY = "yyyy年MM月dd日";
// 格式:年-月
public static final String MONTG_DATE_FORMAT_YEAR = "yyyy年MM月";
// 格式:年-月-日 时-分
public static final String DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN = "yyyy年MM月dd日 HH:mm";
// 格式:年-月-日 时-分-秒
public static final String DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN_SECOND = "yyyy年MM月dd日 HH:mm:ss";
/**
* Return default datePattern (MM/dd/yyyy)
*
* @return a string representing the date pattern on the UI
*/
public static String getDatePattern() {
return datePattern;
}
static final String dayNames[] = {"星期日", "星期一", "星期二", "星期三", "星期四",
"星期五", "星期六"};
@SuppressWarnings("unused")
private static final SimpleDateFormat timeFormat = new SimpleDateFormat(
"yyyy-MM-dd HH:mm:ss");
public DateUtils() {
}
/**
* 周代码转换
*
* @param week
* @return
*/
public static String DateToWeek(String week) {
String day = null;
if ("1".equals(week)) {
day = "日";
} else if ("2".equals(week)) {
day = "一";
} else if ("3".equals(week)) {
day = "二";
} else if ("4".equals(week)) {
day = "三";
} else if ("5".equals(week)) {
day = "四";
} else if ("6".equals(week)) {
day = "五";
} else if ("7".equals(week)) {
day = "六";
}
return day;
}
/**
* 把符合日期格式的字符串转换为日期类型
*
* @param dateStr
* @return
*/
public static Date stringtoDate(String dateStr, String format) {
Date d = null;
SimpleDateFormat formater = new SimpleDateFormat(format);
try {
formater.setLenient(false);
d = formater.parse(dateStr);
} catch (Exception e) {
// log.error(e);
d = null;
}
return d;
}
/**
* 把符合日期格式的字符串转换为日期类型
*/
public static Date stringtoDate(String dateStr, String format,
ParsePosition pos) {
Date d = null;
SimpleDateFormat formater = new SimpleDateFormat(format);
try {
formater.setLenient(false);
d = formater.parse(dateStr, pos);
} catch (Exception e) {
d = null;
}
return d;
}
/**
* 把日期转换为字符串
*
* @param date
* @return
*/
public static String dateToString(Date date, String format) {
String result = "";
SimpleDateFormat formater = new SimpleDateFormat(format);
try {
result = formater.format(date);
} catch (Exception e) {
// log.error(e);
}
return result;
}
/**
* 获取当前时间的指定格式
*
* @param format
* @return
*/
public static String getCurrDate(String format) {
return dateToString(new Date(), format);
}
/**
* 获取当前时间 yyyy-mm-dd hh:mm:ss
*/
@SuppressLint("SimpleDateFormat")
public static String getCurrentTime() {
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date curDate = new Date(System.currentTimeMillis());// 获取当前时间
return formatter.format(curDate);
}
/**
* @param dateStr
* @param amount
* @return
*/
public static String dateSub(int dateKind, String dateStr, int amount) {
Date date = stringtoDate(dateStr, FORMAT_ONE);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(dateKind, amount);
return dateToString(calendar.getTime(), FORMAT_ONE);
}
/**
* 两个日期相减
*
* @param firstTime
* @param secTime
* @return 相减得到的秒数
*/
public static long timeSub(String firstTime, String secTime) {
long first = stringtoDate(firstTime, FORMAT_ONE).getTime();
long second = stringtoDate(secTime, FORMAT_ONE).getTime();
return (second - first) / 1000;
}
/**
* 转换日期格式
*
* @param serverTime
* @return
*/
public static String getConversionTime(String serverTime, String format) {
return dateToString(stringtoDate(serverTime, FORMAT_ONE), format);
}
/**
* 时间精确计算
*
* @param serverTime
*/
public static String getAccurateTime(String serverTime) {
String alert = "";
long dif = stringtoDate(getCurrDate(FORMAT_ONE), FORMAT_ONE).getTime() - stringtoDate(serverTime, FORMAT_ONE).getTime();
if (dif < 60 * 1000) {
alert = "刚刚";
return alert;
} else if (dif < 60 * 60 * 1000) {
alert = (int) dif / 60 / 1000 + "分钟前";
return alert;
} else if (dif < 60 * 1000 * 60 * 24) {
alert = (int) dif / 60 / 60 / 1000 + "小时前";
return alert;
} else if (dif > 60 * 60 * 1000 * 24 && dif < 60 * 60 * 1000 * 48) {
alert = "昨天" + getConversionTime(serverTime, HOUR_MINUTE);
return alert;
} else {
return dateToString(stringtoDate(serverTime, DateUtils.FORMAT_ONE), DateUtils.FORMAT_TWO);
}
}
/**
* 获得某月的天数
*
* @param year int
* @param month int
* @return int
*/
public static int getDaysOfMonth(String year, String month) {
int days = 0;
if (month.equals("1") || month.equals("3") || month.equals("5")
|| month.equals("7") || month.equals("8") || month.equals("10")
|| month.equals("12")) {
days = 31;
} else if (month.equals("4") || month.equals("6") || month.equals("9")
|| month.equals("11")) {
days = 30;
} else {
if ((Integer.parseInt(year) % 4 == 0 && Integer.parseInt(year) % 100 != 0)
|| Integer.parseInt(year) % 400 == 0) {
days = 29;
} else {
days = 28;
}
}
return days;
}
/**
* 获取某年某月的天数
*
* @param year int
* @param month int 月份[1-12]
* @return int
*/
public static int getDaysOfMonth(int year, int month) {
Calendar calendar = Calendar.getInstance();
calendar.set(year, month - 1, 1);
return calendar.getActualMaximum(Calendar.DAY_OF_MONTH);
}
/**
* 获得当前日期
*
* @return int
*/
public static int getToday() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.DATE);
}
/**
* 获得当前月份
*
* @return int
*/
public static int getToMonth() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.MONTH) + 1;
}
/**
* 获得当前年份
*
* @return int
*/
public static int getToYear() {
Calendar calendar = Calendar.getInstance();
return calendar.get(Calendar.YEAR);
}
/**
* 返回日期的天
*
* @param date Date
* @return int
*/
public static int getDay(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DATE);
}
/**
* 返回日期的年
*
* @param date Date
* @return int
*/
public static int getYear(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.YEAR);
}
/**
* 返回日期的周
*
* @param date
* @return
*/
public static String getWeek(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return dayNames[calendar.get(Calendar.DAY_OF_WEEK) - 1];
}
/**
* 返回日期当前属于周几
*
* @param date
* @return
*/
public static int getCurrentWeekIndex(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.DAY_OF_WEEK) - 1;
}
/**
* 返回日期所在周的周一
*
* @param date
* @return
*/
public static String getDateWeekMonday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int week = 0;
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
week = 6;
} else {
week = calendar.get(Calendar.DAY_OF_WEEK) - 2;
}
calendar.add(Calendar.DAY_OF_YEAR, -week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 返回日期所在周的周一
*
* @param date
* @return
*/
public static String getWeekMonday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int week = 0;
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
week = 6;
} else {
week = calendar.get(Calendar.DAY_OF_WEEK) - 2;
}
calendar.add(Calendar.DAY_OF_YEAR, -week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 得到本周周一
*
* @param date
*/
public static String getMondayOfThisWeek(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
if (day_of_week == 0)
day_of_week = 7;
c.add(Calendar.DATE, -day_of_week + 1);
return dateToString(c.getTime(), LONG_DATE_FORMAT);
}
/**
* 得到本周周日
*
* @param date
*/
public static String getSundayOfThisWeek(Date date) {
Calendar c = Calendar.getInstance();
c.setTime(date);
int day_of_week = c.get(Calendar.DAY_OF_WEEK) - 1;
if (day_of_week == 0)
day_of_week = 7;
c.add(Calendar.DATE, -day_of_week + 7);
return dateToString(c.getTime(), LONG_DATE_FORMAT);
}
/**
* 返回日期所在下周的周一
*
* @param date
* @return
*/
public static String getNextWeekMonday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.WEEK_OF_MONTH, 1);
int week = 0;
if (calendar.get(Calendar.DAY_OF_WEEK) == Calendar.SUNDAY) {
week = calendar.get(Calendar.DAY_OF_WEEK) - 1;
} else {
week = calendar.get(Calendar.DAY_OF_WEEK) - 2;
}
calendar.add(Calendar.DAY_OF_YEAR, -week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 返回日期所在上周的周一
*
* @param date
* @return
*/
public static String getLastWeekMonday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.WEEK_OF_MONTH, -1);
int week = calendar.get(Calendar.DAY_OF_WEEK) - 2;
calendar.add(Calendar.DAY_OF_YEAR, -week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 返回日期所在周的周日
*
* @param date
* @return
*/
public static String getWeekSunday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
int week = 7 - (calendar.get(Calendar.DAY_OF_WEEK) - 1);
calendar.add(Calendar.DAY_OF_YEAR, week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 返回日期所在下周的周日
*
* @param date
* @return
*/
public static String getNextWeekSunday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.WEEK_OF_MONTH, 1);
int week = 7 - (calendar.get(Calendar.DAY_OF_WEEK) - 1);
calendar.add(Calendar.DAY_OF_YEAR, week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 返回日期所在下一周周一的日期
*
* @param date
* @return
*/
public static String getLastWeekSunday(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.add(Calendar.WEEK_OF_MONTH, -1);
int week = 7 - (calendar.get(Calendar.DAY_OF_WEEK) - 1);
calendar.add(Calendar.DAY_OF_YEAR, week);
return dateToString(calendar.getTime(), LONG_DATE_FORMAT);
}
/**
* 根据开始日期和结束日期,获取两个日期之间周数
*
* @param iBegin
* @param iEnd
* @return
*/
public static int getWeek(Date iBegin, Date iEnd) {
// 获取第一周周一的日期
Date beginWeek = stringtoDate(getWeekMonday(iBegin), LONG_DATE_FORMAT);
// 获取最后一周下周周一的日期
Date endWeek = stringtoDate(getNextWeekMonday(iEnd), LONG_DATE_FORMAT);
long day = dayDiff(beginWeek, endWeek);
int weeks = 0;
if (day > 0) {
weeks = (int) (day / 7);
}
return weeks;
}
/**
* 根据开始日期,获取当前时间的周次
*
* @param iBegin
* @return
*/
public static int getCurrentWeek(Date iBegin) {
// 获取第一周周一的日期
Date beginWeek = stringtoDate(getWeekMonday(iBegin), LONG_DATE_FORMAT);
// 获取当前周 下周周一的日期
Date endWeek = stringtoDate(
getNextWeekMonday(stringtoDate(getCurrDate(LONG_DATE_FORMAT),
LONG_DATE_FORMAT)), LONG_DATE_FORMAT);
long day = dayDiff(beginWeek, endWeek);
int weeks = 0;
if (day > 0) {
weeks = (int) (day / 7);
}
return weeks;
}
/**
* 返回日期的月份,1-12
*
* @param date Date
* @return int
*/
public static int getMonth(Date date) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
return calendar.get(Calendar.MONTH) + 1;
}
/**
* 计算两个日期相差的天数,如果date2 > date1 返回正数,否则返回负数
*
* @param date1 Date
* @param date2 Date
* @return long
*/
public static long dayDiff(Date date1, Date date2) {
return (date2.getTime() - date1.getTime()) / 86400000;
}
/**
* 比较两个日期的年差
*
* @param before
* @param after
* @return
*/
public static int yearDiff(String before, String after) {
Date beforeDay = stringtoDate(before, LONG_DATE_FORMAT);
Date afterDay = stringtoDate(after, LONG_DATE_FORMAT);
return getYear(afterDay) - getYear(beforeDay);
}
/**
* 比较指定日期与当前日期的差
*
* @param after
* @return
*/
public static int yearDiffCurr(String after) {
Date beforeDay = new Date();
Date afterDay = stringtoDate(after, LONG_DATE_FORMAT);
return getYear(beforeDay) - getYear(afterDay);
}
/**
* 比较指定日期与当前日期的差
*
* @param before
* @return
* @author chenyz
*/
public static long dayDiffCurr(String before) {
Date currDate = DateUtils.stringtoDate(currDay(), LONG_DATE_FORMAT);
Date beforeDate = stringtoDate(before, LONG_DATE_FORMAT);
return (currDate.getTime() - beforeDate.getTime()) / 86400000;
}
/**
* 获取每月的第一周
*
* @param year
* @param month
* @return
* @author chenyz
*/
public static int getFirstWeekdayOfMonth(int year, int month) {
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.SATURDAY); // 星期天为第一天
c.set(year, month - 1, 1);
return c.get(Calendar.DAY_OF_WEEK);
}
/**
* 获取每月的最后一周
*
* @param year
* @param month
* @return
* @author chenyz
*/
public static int getLastWeekdayOfMonth(int year, int month) {
Calendar c = Calendar.getInstance();
c.setFirstDayOfWeek(Calendar.SATURDAY); // 星期天为第一天
c.set(year, month - 1, getDaysOfMonth(year, month));
return c.get(Calendar.DAY_OF_WEEK);
}
/**
* 获得当前日期字符串,格式"yyyy_MM_dd_HH_mm_ss"
*
* @return
*/
public static String getCurrent() {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH) + 1;
int day = cal.get(Calendar.DAY_OF_MONTH);
int hour = cal.get(Calendar.HOUR_OF_DAY);
int minute = cal.get(Calendar.MINUTE);
int second = cal.get(Calendar.SECOND);
StringBuffer sb = new StringBuffer();
sb.append(year).append("_").append(addzero(month, 2)).append("_")
.append(addzero(day, 2)).append("_").append(addzero(hour, 2))
.append("_").append(addzero(minute, 2)).append("_")
.append(addzero(second, 2));
return sb.toString();
}
/**
* 获得当前日期字符串,格式"yyyy-MM-dd HH:mm:ss"
*
* @return
*/
public static String getNow() {
Calendar today = Calendar.getInstance();
return dateToString(today.getTime(), FORMAT_ONE);
}
/**
* 获取当前时间
*
* @param strFormat --指定格式
* @return
*/
public static String getNow(String strFormat) {
Calendar today = Calendar.getInstance();
return dateToString(today.getTime(), strFormat);
}
/**
* 判断日期是否有效,包括闰年的情况
*
* @param date YYYY-mm-dd
* @return
*/
public static boolean isDate(String date) {
StringBuffer reg = new StringBuffer(
"^((\\d{2}(([02468][048])|([13579][26]))-?((((0?");
reg.append("[13578])|(1[02]))-?((0?[1-9])|([1-2][0-9])|(3[01])))");
reg.append("|(((0?[469])|(11))-?((0?[1-9])|([1-2][0-9])|(30)))|");
reg.append("(0?2-?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][12");
reg.append("35679])|([13579][01345789]))-?((((0?[13578])|(1[02]))");
reg.append("-?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))");
reg.append("-?((0?[1-9])|([1-2][0-9])|(30)))|(0?2-?((0?[");
reg.append("1-9])|(1[0-9])|(2[0-8]))))))");
Pattern p = Pattern.compile(reg.toString());
return p.matcher(date).matches();
}
/**
* 取得指定日期过 months 月后的日期 (当 months 为负数表示指定月之前);
*
* @param date 日期 为null时表示当天
* @param months 相加(相减)的月数
*/
public static Date nextMonth(Date date, int months) {
Calendar cal = Calendar.getInstance();
if (date != null) {
cal.setTime(date);
}
cal.add(Calendar.MONTH, months);
return cal.getTime();
}
/**
* 取得指定日期过 day 天后的日期 (当 day 为负数表示指日期之前);
*
* @param date 日期 为null时表示当天
*/
public static Date nextDay(Date date, int day) {
Calendar cal = Calendar.getInstance();
if (date != null) {
cal.setTime(date);
}
cal.add(Calendar.DAY_OF_YEAR, day);
return cal.getTime();
}
/**
* 取得距离今天 day 日的日期
*
* @param day
* @param format
* @return
* @author chenyz
*/
public static String nextDay(int day, String format) {
Calendar cal = Calendar.getInstance();
cal.setTime(new Date());
cal.add(Calendar.DAY_OF_YEAR, day);
return dateToString(cal.getTime(), format);
}
/**
* 取得指定日期过 day 周后的日期 (当 day 为负数表示指定月之前)
*
* @param date 日期 为null时表示当天
*/
public static Date nextWeek(Date date, int week) {
Calendar cal = Calendar.getInstance();
if (date != null) {
cal.setTime(date);
}
cal.add(Calendar.WEEK_OF_MONTH, week);
return cal.getTime();
}
/**
* 获取当前的日期(yyyy-MM-dd)
*/
public static String currDay() {
return DateUtils.dateToString(new Date(), DateUtils.LONG_DATE_FORMAT);
}
/**
* 获取昨天的日期
*
* @return
*/
public static String befoDay() {
return befoDay(DateUtils.LONG_DATE_FORMAT);
}
/**
* 根据时间类型获取昨天的日期
*
* @param format
* @return
* @author chenyz
*/
public static String befoDay(String format) {
return DateUtils.dateToString(DateUtils.nextDay(new Date(), -1), format);
}
/**
* 获取明天的日期
*/
public static String tomorrowDay() {
return DateUtils.dateToString(DateUtils.nextDay(new Date(), 1),
DateUtils.LONG_DATE_FORMAT);
}
/**
* 获取明天的日期(yyyy-mm-dd hh:mm:ss)
*/
public static String tomorrowDayTime() {
return nextDay(1, DateUtils.FORMAT_ONE);
}
/**
* 获取后天的日期(yyyy-mm-dd hh:mm:ss)
*/
public static String afterDayTime() {
return nextDay(2, DateUtils.FORMAT_ONE);
}
/**
* 取得当前时间距离1900/1/1的天数
*
* @return
*/
public static int getDayNum() {
int daynum = 0;
GregorianCalendar gd = new GregorianCalendar();
Date dt = gd.getTime();
GregorianCalendar gd1 = new GregorianCalendar(1900, 1, 1);
Date dt1 = gd1.getTime();
daynum = (int) ((dt.getTime() - dt1.getTime()) / (24 * 60 * 60 * 1000));
return daynum;
}
/**
* getDayNum的逆方法(用于处理Excel取出的日期格式数据等)
*
* @param day
* @return
*/
public static Date getDateByNum(int day) {
GregorianCalendar gd = new GregorianCalendar(1900, 1, 1);
Date date = gd.getTime();
date = nextDay(date, day);
return date;
}
/**
* 针对yyyy-MM-dd HH:mm:ss格式,显示yyyymmdd
*/
public static String getYmdDateCN(String datestr) {
if (datestr == null)
return "";
if (datestr.length() < 10)
return "";
StringBuffer buf = new StringBuffer();
buf.append(datestr.substring(0, 4)).append(datestr.substring(5, 7))
.append(datestr.substring(8, 10));
return buf.toString();
}
/**
* 获取本月第一天
*
* @param format
* @return
*/
public static String getFirstDayOfMonth(String format) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
return dateToString(cal.getTime(), format);
}
/**
* 获取某月第一天
*
* @param iDate
* @param format
* @return
*/
public static String getFirstDayOfMonth(Date iDate, String format) {
Calendar cal = Calendar.getInstance();
cal.setTime(iDate);
cal.set(Calendar.DATE, 1);
return dateToString(cal.getTime(), format);
}
/**
* 获取本月最后一天
*
* @param format
* @return
*/
public static String getLastDayOfMonth(String format) {
Calendar cal = Calendar.getInstance();
cal.set(Calendar.DATE, 1);
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DATE, -1);
return dateToString(cal.getTime(), format);
}
/**
* 获取某月最后一天
*
* @param format
* @return
*/
public static String getLastDayOfMonth(Date iDate, String format) {
Calendar cal = Calendar.getInstance();
cal.setTime(iDate);
cal.set(Calendar.DATE, 1);
cal.add(Calendar.MONTH, 1);
cal.add(Calendar.DATE, -1);
return dateToString(cal.getTime(), format);
}
/**
* 将元数据前补零,补后的总长度为指定的长度,以字符串的形式返回
*
* @param sourceDate
* @param formatLength
* @return 重组后的数据
*/
public static String addzero(int sourceDate, int formatLength) {
/*
* 0 指前面补充零 formatLength 字符总长度为 formatLength d 代表为正数。
*/
String newString = String.format("%0" + formatLength + "d", sourceDate);
return newString;
}
/**
* 判断是否在2个时间点内
*
* @param iStartDate 开始时间
* @param iEndDate 结束时间
* @param iSelectDate 选择的时间
* @return
*/
public static Boolean isTimeQuantum(String iStartDate, String iEndDate,
String iSelectDate) {
int startDiff = yearDiff(iStartDate, iSelectDate);
int endDiff = yearDiff(iSelectDate, iEndDate);
if (startDiff >= 0 && endDiff > 0) {
return true;
} else {
return false;
}
}
public static final Date str2Date(String aMask, String strDate)
throws ParseException {
SimpleDateFormat df = null;
Date date = null;
df = new SimpleDateFormat(aMask);
try {
date = df.parse(strDate);
} catch (ParseException pe) {
return null;
} catch (java.text.ParseException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
return (date);
}
public static final String date2Str(Date aDate) {
SimpleDateFormat df = null;
String returnValue = "";
if (aDate != null) {
df = new SimpleDateFormat(datePattern);
returnValue = df.format(aDate);
}
return (returnValue);
}
public static final String date2Str(String pattern, Date aDate) {
SimpleDateFormat df = null;
String returnValue = "";
if (aDate != null) {
df = new SimpleDateFormat(pattern);
returnValue = df.format(aDate);
}
return (returnValue);
}
// 日期格式转换成时间戳
public static long getTimeStamp(String pattern, String strDate) {
long returnTimeStamp = 0;
Date aDate = null;
try {
aDate = convertStringToDate(pattern, strDate);
} catch (ParseException pe) {
aDate = null;
}
if (aDate == null) {
returnTimeStamp = 0;
} else {
returnTimeStamp = aDate.getTime();
}
return returnTimeStamp;
}
/**
* This method converts a String to a date using the datePattern
*
* @param strDate the date to convert (in format MM/dd/yyyy)
* @return a date object
* @throws ParseException
*/
public static Date convertStringToDate(String strDate)
throws ParseException {
Date aDate = null;
try {
aDate = convertStringToDate(datePattern, strDate);
} catch (ParseException pe) {
// log.error("Could not convert '" + strDate
// + "' to a date, throwing exception");
pe.printStackTrace();
return null;
}
return aDate;
}
/**
* This method generates a string representation of a date/time in the
* format you specify on input
*
* @param aMask the date pattern the string is in
* @param strDate a string representation of a date
* @return a converted Date object
* @throws ParseException
* @see SimpleDateFormat
*/
public static final Date convertStringToDate(String aMask, String strDate)
throws ParseException {
SimpleDateFormat df = null;
Date date = null;
df = new SimpleDateFormat(aMask);
try {
date = df.parse(strDate);
} catch (ParseException pe) {
return null;
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return (date);
}
/**
* 时间戳格式转换
*/
public static String getNewChatTime(long timesamp) {
String result = "";
Calendar todayCalendar = Calendar.getInstance();
Calendar otherCalendar = Calendar.getInstance();
otherCalendar.setTimeInMillis(timesamp);
String timeFormat = "M月d日 HH:mm";
String yearTimeFormat = "yyyy年M月d日 HH:mm";
// String am_pm = "";
// int hour = otherCalendar.get(Calendar.HOUR_OF_DAY);
// if (hour >= 0 && hour < 6) {
// am_pm = "凌晨";
// } else if (hour >= 6 && hour < 12) {
// am_pm = "早上";
// } else if (hour == 12) {
// am_pm = "中午";
// } else if (hour > 12 && hour < 18) {
// am_pm = "下午";
// } else if (hour >= 18) {
// am_pm = "晚上";g
// }
// timeFormat = "M月d日 " + am_pm + "HH:mm";
// yearTimeFormat = "yyyy年M月d日 " + am_pm + "HH:mm";
timeFormat = "M月d日 " + "HH:mm";
yearTimeFormat = "yyyy年M月d日 " + "HH:mm";
boolean yearTemp = todayCalendar.get(Calendar.YEAR) == otherCalendar.get(Calendar.YEAR);
if (yearTemp) {
int todayMonth = todayCalendar.get(Calendar.MONTH);
int otherMonth = otherCalendar.get(Calendar.MONTH);
if (todayMonth == otherMonth) {//表示是同一个月
int temp = todayCalendar.get(Calendar.DATE) - otherCalendar.get(Calendar.DATE);
switch (temp) {
case 0:
result = getHourAndMin(timesamp);
break;
case 1:
result = "昨天 " + getHourAndMin(timesamp);
break;
case 2:
case 3:
case 4:
case 5:
case 6:
int dayOfMonth = otherCalendar.get(Calendar.WEEK_OF_MONTH);
int todayOfMonth = todayCalendar.get(Calendar.WEEK_OF_MONTH);
if (dayOfMonth == todayOfMonth) {//表示是同一周
int dayOfWeek = otherCalendar.get(Calendar.DAY_OF_WEEK);
if (dayOfWeek != 1) {//判断当前是不是星期日 如想显示为:周日 12:09 可去掉此判断
result = dayNames[otherCalendar.get(Calendar.DAY_OF_WEEK) - 1] + getHourAndMin(timesamp);
} else {
result = getTime(timesamp, timeFormat);
}
} else {
result = getTime(timesamp, timeFormat);
}
break;
default:
result = getTime(timesamp, timeFormat);
break;
}
} else {
result = getTime(timesamp, timeFormat);
}
} else {
result = getYearTime(timesamp, yearTimeFormat);
}
return result;
}
/**
* 当天的显示时间格式
*
* @param time
* @return
*/
public static String getHourAndMin(long time) {
SimpleDateFormat format = new SimpleDateFormat("HH:mm");
return format.format(new Date(time));
}
/**
* 不同一周的显示时间格式
*
* @param time
* @param timeFormat
* @return
*/
public static String getTime(long time, String timeFormat) {
SimpleDateFormat format = new SimpleDateFormat(timeFormat);
return format.format(new Date(time));
}
/**
* 不同年的显示时间格式
*
* @param time
* @param yearTimeFormat
* @return
*/
public static String getYearTime(long time, String yearTimeFormat) {
SimpleDateFormat format = new SimpleDateFormat(yearTimeFormat);
return format.format(new Date(time));
}
/**
* 秒换算为时分秒
*
* @param second
* @return
*/
public static String cal(int second) {
int h = 0;
int d = 0;
int s = 0;
int temp = second % 3600;
if (second > 3600) {
h = second / 3600;
if (temp != 0) {
if (temp > 60) {
d = temp / 60;
if (temp % 60 != 0) {
s = temp % 60;
}
} else {
s = temp;
}
}
} else {
d = second / 60;
if (second % 60 != 0) {
s = second % 60;
}
}
if (d == 0 && s < 10) return d + ":" + "0" + s;
if (d == 0 && s > 10) return d + ":" + s;
if (d < 10 && s < 10) return "0" + d + ":" + "0" + s;
if (d < 10 && s > 10) return "0" + d + ":" + s;
if (d > 10 && s > 10) return d + ":" + s;
if (d > 10 && s < 10) return d + ":" + "0" + s;
return d + ":" + s;
}
/**
* 计算两个日期相差了几个月
*
* @param startDate
* @param endDate
* @return
*/
public static int getMonthSub(String startDate, String endDate) {
int count = 0;
try {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM");
Calendar bef = Calendar.getInstance();
Calendar aft = Calendar.getInstance();
bef.setTime(sdf.parse(startDate));
aft.setTime(sdf.parse(endDate));
int result = aft.get(Calendar.MONTH) - bef.get(Calendar.MONTH);
int month = (aft.get(Calendar.YEAR) - bef.get(Calendar.YEAR)) * 12;
count = Math.abs(month + result);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
return count;
}
/**
* 两个日期相减
*
* @param firstTime
* @param secTime
* @return 相减得到的秒数
*/
public static long timeDaySub(String firstTime, String secTime) {
long first = stringtoDate(firstTime, LONG_DATE_FORMAT).getTime();
long second = stringtoDate(secTime, LONG_DATE_FORMAT).getTime();
return (second - first) / 1000;
}
//当前时间是否在某一时间段内
public static boolean isInPeriodOfTime(String beginTime, String endTime) {
boolean isInTime = false;
//获取当前系统时间
Date currentTime = new Date();//currentTime就是系统当前时间
Date strbeginDate = DateUtils.stringtoDate(beginTime, DateUtils.FORMAT_TWO);//起始时间
Date strendDate = DateUtils.stringtoDate(endTime, DateUtils.FORMAT_TWO);//结束时间
Calendar cal = Calendar.getInstance();
if (strendDate != null) {
cal.setTime(strendDate);
}
cal.add(Calendar.MINUTE, 20);
strendDate = cal.getTime();
if ((currentTime.getTime() - strbeginDate.getTime()) >= 0 && (strendDate.getTime() - currentTime.getTime()) >= 0) {//使用.getTime方法把时间转化成毫秒数,然后进行比较
isInTime = true;
} else {
isInTime = false;
}
return isInTime;
}
/**
* 种子时间是否在某一时间段内
*
* @param beginTime 区间开始时间
* @param endTime 区间结束时间
* @param seedDate 种子时间
* @return
*/
public static boolean isInPeriodOfIntervalTime(String beginTime, String endTime, String seedDate) {
boolean isInTime = false;
try {
//种子时间
Date currentTime = DateUtils.stringtoDate(seedDate, DateUtils.DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN_SECOND);
//起始时间
Date strbeginDate = DateUtils.stringtoDate(beginTime, DateUtils.DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN);
//结束时间
Date strendDate = DateUtils.stringtoDate(endTime, DateUtils.DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN);
Calendar cal = Calendar.getInstance();
if (strendDate != null) {
cal.setTime(strendDate);
}
cal.add(Calendar.MINUTE, 20);
strendDate = cal.getTime();
if ((currentTime.getTime() - strbeginDate.getTime()) >= 0 &&
(strendDate.getTime() - currentTime.getTime()) >= 0) {
//使用.getTime方法把时间转化成毫秒数,然后进行比较
isInTime = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return isInTime;
}
/**
* 种子时间是否在某一时间段内
*
* @param beginTime 区间开始时间
* @param endTime 区间结束时间
* @param seedDate 种子时间
* @return
*/
public static boolean isInPeriodOfIntervalTime2(String beginTime, String endTime, String seedDate) {
boolean isInTime = false;
try {
//种子时间
Date currentTime = DateUtils.stringtoDate(seedDate, DateUtils.DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN);
//起始时间
Date strbeginDate = DateUtils.stringtoDate(beginTime, DateUtils.DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN);
//结束时间
Date strendDate = DateUtils.stringtoDate(endTime, DateUtils.DATE_FORMAT_YEAR_MONTH_DAY_HOUR_MIN);
Calendar cal = Calendar.getInstance();
if (strendDate != null) {
cal.setTime(strendDate);
}
cal.add(Calendar.MINUTE, 20);
strendDate = cal.getTime();
if ((currentTime.getTime() - strbeginDate.getTime()) >= 0 &&
(strendDate.getTime() - currentTime.getTime()) >= 0) {
//使用.getTime方法把时间转化成毫秒数,然后进行比较
isInTime = true;
}
} catch (Exception e) {
e.printStackTrace();
}
return isInTime;
}
/**
* 当前时间属于本月第几周
*
* @param dateString
* @return
*/
public static int getWeekOfMonth(String dateString, String startDate) {
int weekOfMonth = 0;
try {
SimpleDateFormat sdf = new SimpleDateFormat(LONG_DATE_FORMAT);
Date date = sdf.parse(dateString);
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
weekOfMonth = calendar.get(Calendar.WEEK_OF_MONTH);
//获取当前时间为本周的第几天
String[] mdate = startDate.split("-");
if (mdate[2].equals("01")) {//本月第一天为周一
} else {
weekOfMonth = weekOfMonth - 1;
}
} catch (java.text.ParseException e) {
e.printStackTrace();
return weekOfMonth;
}
return weekOfMonth;
}
public static String dateToWeek(String datetime) {
SimpleDateFormat f = new SimpleDateFormat("yyyy-MM-dd");
String[] weekDays = {"星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"};
Calendar cal = Calendar.getInstance();
Date date = null;
try {
try {
date = f.parse(datetime);
} catch (java.text.ParseException e) {
e.printStackTrace();
}
cal.setTime(date);
} catch (Exception e) {
e.printStackTrace();
}
//一周的第几天
int w = cal.get(Calendar.DAY_OF_WEEK) - 1;
if (w < 0)
w = 0;
return weekDays[w];
}
}
R.layout.item_month
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:background="#ffffff"
android:layout_height="50dp">
<TextView
android:id="@+id/tv_month"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:padding="5dp"
android:text="8"
android:textSize="15dp"
android:textColor="#ff6600" />
</androidx.constraintlayout.widget.ConstraintLayout>
R.layout.item_day
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="40dp"
android:layout_marginTop="5dp"
android:layout_marginBottom="5dp"
android:background="#ffffff">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:orientation="vertical">
<TextView
android:id="@+id/tv_day"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_centerHorizontal="true"
android:gravity="center"
android:text="1"
android:textSize="15dp" />
</LinearLayout>
</RelativeLayout>
OK!到这里就结束了 有什么问题可以发布评论一起探讨下