Android 时间选择相关系统控件
来源:互联网 发布:网络机柜生产厂家 编辑:程序博客网 时间:2024/05/03 02:13
Android 时间选择相关系统控件
概述
日期时间选择,在App开发中十分常见,因此android系统对日期、时间等都做了最基本的封装,同样也提供了丰富的API供开发者进行实际开发。
Date
Java中Date类有如下两个:
java.sql.Date extends java.util.Date;
java.util.Date;
前者主要是构造SQL语句的时候调用,比如读写数据库的时候,大多情况下使用的后者,二者的用法基本相同。
Date构造
无参数
Date date = new Date()
带long型构造
long类型指的是自1970年1月1日00:00:00这一时刻开始所经历的毫秒数
Date now = new Date(System.currentTimeMillis());
上面两个构造方法比较常用,且尚未废弃,其他构造不建议使用。具体可参考源码。
Date使用
Date的比较常见的使用方式有:
- 格式化,满足界面展示的需求;
- 时间比较,由于Date实现了Comparable接口,比较只要调用compareTo()方法即可;
- 类型转换,通常是Date与String类型之间的转化,多数用在输出或界面展示上。
格式化
日期格式化主要使用DateFormat类,但该类是抽象类,所以大多情况使用的SimpleDateFormat类,先看简单实用实例,如下:
SimpleDateFormat format1 = new SimpleDateFormat("YYYY-MM-dd HH:mm:ss");SimpleDateFormat format2 = new SimpleDateFormat("HH:mm:ss");Date date = new Date();System.out.println(format1.format(date));System.out.println(format2.format(date));
将有如下输出:
2017-03-16 11:45:2311:45:23
SimpleDateFormat中构造函数格式字符的参考(表格来源Java官方文档)如下:
G
Era 标志符 Text AD
y
年 Year 1996
; 96
M
年中的月份 Month July
; Jul
; 07
w
年中的周数 Number 27
W
月份中的周数 Number 2
D
年中的天数 Number 189
d
月份中的天数 Number 10
F
月份中的星期 Number 2
E
星期中的天数 Text Tuesday
; Tue
a
Am/pm 标记 Text PM
H
一天中的小时数(0-23) Number 0
k
一天中的小时数(1-24) Number 24
K
am/pm 中的小时数(0-11) Number 0
h
am/pm 中的小时数(1-12) Number 12
m
小时中的分钟数 Number 30
s
分钟中的秒数 Number 55
S
毫秒数 Number 978
z
时区 General time zone Pacific Standard Time
; PST
; GMT-08:00
Z
时区 RFC 822 time zone -0800
根据以上解释,可以轻松构造输出格式了,如
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年mm月dd日 HH:mm:ss 是第D天 在第w周");Date date = new Date();System.out.println(sdf.format(date));
将有如下输出:
2017年43月16日 11:43:58 是第75天 在第11周
时间比较
比较时间先后
/*** @param date1 date1* @param date2 date2* @return true if date1 is after date2*/private static boolean greater(Date date1, Date date2) { return date1.compareTo(date2) > 0;}
返回当前时间前(或后)n天(n>0表示后n天,n<0表示前n天)
/*** @param n number of date* @return the date before (n<0) or after(n>0) current date*/private static Date duration(int n) { return new Date(new Date().getTime() + n * 24 * 60 * 60 * 1000);}
几分钟前(几小时前等)
/*** 返回发布时间距离当前的时间** @param createdTime the create time* @return the result string*/private static String timeAgo(Date createdTime) { SimpleDateFormat format = new SimpleDateFormat("MM-dd HH:mm", Locale.CHINA); if (createdTime != null) { long agoTimeInMin = (new Date(System.currentTimeMillis()).getTime() - createdTime.getTime()) / 1000 / 60; //如果在当前时间以前一分钟内 if (agoTimeInMin <= 1) { return "刚刚"; } else if (agoTimeInMin <= 60) { //如果传入的参数时间在当前时间以前10分钟之内 return agoTimeInMin + "分钟前"; } else if (agoTimeInMin <= 60 * 24) { return agoTimeInMin / 60 + "小时前"; } else if (agoTimeInMin <= 60 * 24 * 2) { return agoTimeInMin / (60 * 24) + "天前"; } else { return format.format(createdTime); } } else { return format.format(new Date(0)); }}
类型转换
主要是Date与String间的转化,代码如下:
/** * 将String类型的时间转换成Date类型,传入的时间格式必须要满足下面的格式,否则会报错 */public static Date str2Date(String dateStr) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); Date date = null; try { date = format.parse(dateStr); } catch (ParseException e) { e.printStackTrace(); } return date;}/** * 将Date型转换成指定格式的时间字符串 */public static String date2Str(Date date) { SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss", Locale.CHINA); return format.format(date);}
Calendar
Calendar本身是个抽象类,因此不能直接获取其对象实例,其提供的一系列静态获取实例的重载方法getInstance()得到的都是GregorianCalendar对象的实例,该类是Calendar的子类。Calendar提供了多的方法来处理日期时间,因此官方建议使用Calendar来替换Date(好多Date的方法都废弃了)
构造
提供了两个protected 形式构造方法,由于本身为抽象类,这两个方法通常提供给其子类GregorianCalendar调用,获取Calendar实例可以通过如下方法:
Calendar.getInstance()
该方法有多个重载实现。
使用
使用比较简单,像这类工具类,最好使用时能查看下源码。
import java.text.DateFormat; import java.text.ParsePosition; import java.text.SimpleDateFormat; import java.util.Calendar; import java.util.Date; import java.util.GregorianCalendar; public class CalendarUtil { private int weeks = 0;// 用来全局控制 上一周,本周,下一周的周数变化 private int MaxDate; // 一月最大天数 private int MaxYear; // 一年最大天数 public static void main(String[] args) { CalendarUtil tt = new CalendarUtil(); System.out.println("获取当天日期:" + tt.getNowTime("yyyy-MM-dd")); System.out.println("获取本周一日期:" + tt.getMondayOFWeek()); System.out.println("获取本周日的日期~:" + tt.getCurrentWeekday()); System.out.println("获取上周一日期:" + tt.getPreviousWeekday()); System.out.println("获取上周日日期:" + tt.getPreviousWeekSunday()); System.out.println("获取下周一日期:" + tt.getNextMonday()); System.out.println("获取下周日日期:" + tt.getNextSunday()); System.out.println("获得相应周的周六的日期:" + tt.getNowTime("yyyy-MM-dd")); System.out.println("获取本月第一天日期:" + tt.getFirstDayOfMonth()); System.out.println("获取本月最后一天日期:" + tt.getDefaultDay()); System.out.println("获取上月第一天日期:" + tt.getPreviousMonthFirst()); System.out.println("获取上月最后一天的日期:" + tt.getPreviousMonthEnd()); System.out.println("获取下月第一天日期:" + tt.getNextMonthFirst()); System.out.println("获取下月最后一天日期:" + tt.getNextMonthEnd()); System.out.println("获取本年的第一天日期:" + tt.getCurrentYearFirst()); System.out.println("获取本年最后一天日期:" + tt.getCurrentYearEnd()); System.out.println("获取去年的第一天日期:" + tt.getPreviousYearFirst()); System.out.println("获取去年的最后一天日期:" + tt.getPreviousYearEnd()); System.out.println("获取明年第一天日期:" + tt.getNextYearFirst()); System.out.println("获取明年最后一天日期:" + tt.getNextYearEnd()); System.out.println("获取本季度第一天:" + tt.getThisSeasonFirstTime(11)); System.out.println("获取本季度最后一天:" + tt.getThisSeasonFinallyTime(11)); System.out.println("获取两个日期之间间隔天数2008-12-1~2008-9.29:" + CalendarUtil.getTwoDay("2008-12-1", "2008-9-29")); System.out.println("获取当前月的第几周:" + tt.getWeekOfMonth()); System.out.println("获取当前年份:" + tt.getYear()); System.out.println("获取当前月份:" + tt.getMonth()); System.out.println("获取今天在本年的第几天:" + tt.getDayOfYear()); System.out.println("获得今天在本月的第几天(获得当前日):" + tt.getDayOfMonth()); System.out.println("获得今天在本周的第几天:" + tt.getDayOfWeek()); System.out.println("获得半年后的日期:" + tt.convertDateToString(tt.getTimeYearNext())); } public static int getYear() { return Calendar.getInstance().get(Calendar.YEAR); } public static int getMonth() { return Calendar.getInstance().get(Calendar.MONTH) + 1; } public static int getDayOfYear() { return Calendar.getInstance().get(Calendar.DAY_OF_YEAR); } public static int getDayOfMonth() { return Calendar.getInstance().get(Calendar.DAY_OF_MONTH); } public static int getDayOfWeek() { return Calendar.getInstance().get(Calendar.DAY_OF_WEEK); } public static int getWeekOfMonth() { return Calendar.getInstance().get(Calendar.DAY_OF_WEEK_IN_MONTH); } public static Date getTimeYearNext() { Calendar.getInstance().add(Calendar.DAY_OF_YEAR, 183); return Calendar.getInstance().getTime(); } public static String convertDateToString(Date dateTime) { SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd"); return df.format(dateTime); } public static String getTwoDay(String sj1, String sj2) { SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); long day = 0; try { java.util.Date date = myFormatter.parse(sj1); java.util.Date mydate = myFormatter.parse(sj2); day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); } catch (Exception e) { return ""; } return day + ""; } public static String getWeek(String sdate) { // 再转换为时间 Date date = CalendarUtil.strToDate(sdate); Calendar c = Calendar.getInstance(); c.setTime(date); // int hour=c.get(Calendar.DAY_OF_WEEK); // hour中存的就是星期几了,其范围 1~7 // 1=星期日 7=星期六,其他类推 return new SimpleDateFormat("EEEE").format(c.getTime()); } public static Date strToDate(String strDate) { SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); ParsePosition pos = new ParsePosition(0); Date strtodate = formatter.parse(strDate, pos); return strtodate; } public static long getDays(String date1, String date2) { if (date1 == null || date1.equals("")) return 0; if (date2 == null || date2.equals("")) return 0; // 转换为标准时间 SimpleDateFormat myFormatter = new SimpleDateFormat("yyyy-MM-dd"); java.util.Date date = null; java.util.Date mydate = null; try { date = myFormatter.parse(date1); mydate = myFormatter.parse(date2); } catch (Exception e) { } long day = (date.getTime() - mydate.getTime()) / (24 * 60 * 60 * 1000); return day; } public String getDefaultDay() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 lastDate.add(Calendar.MONTH, 1);// 加一个月,变为下月的1号 lastDate.add(Calendar.DATE, -1);// 减去一天,变为当月最后一天 str = sdf.format(lastDate.getTime()); return str; } public String getPreviousMonthFirst() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 lastDate.add(Calendar.MONTH, -1);// 减一个月,变为下月的1号 // lastDate.add(Calendar.DATE,-1);//减去一天,变为当月最后一天 str = sdf.format(lastDate.getTime()); return str; } public String getFirstDayOfMonth() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.set(Calendar.DATE, 1);// 设为当前月的1号 str = sdf.format(lastDate.getTime()); return str; } public String getCurrentWeekday() { weeks = 0; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 6); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } public String getNowTime(String dateformat) { Date now = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat(dateformat);// 可以方便地修改日期格式 String hehe = dateFormat.format(now); return hehe; } private int getMondayPlus() { Calendar cd = Calendar.getInstance(); // 获得今天是一周的第几天,星期日是第一天,星期二是第二天...... int dayOfWeek = cd.get(Calendar.DAY_OF_WEEK) - 1; // 因为按中国礼拜一作为第一天所以这里减1 if (dayOfWeek == 1) { return 0; } else { return 1 - dayOfWeek; } } public String getMondayOFWeek() { weeks = 0; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } public String getSaturday() { int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 * weeks + 6); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } public String getPreviousWeekSunday() { weeks = 0; weeks--; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + weeks); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } public String getPreviousWeekday() { weeks--; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 * weeks); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } public String getNextMonday() { weeks++; int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } public String getNextSunday() { int mondayPlus = this.getMondayPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, mondayPlus + 7 + 6); Date monday = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preMonday = df.format(monday); return preMonday; } private int getMonthPlus() { Calendar cd = Calendar.getInstance(); int monthOfNumber = cd.get(Calendar.DAY_OF_MONTH); cd.set(Calendar.DATE, 1);// 把日期设置为当月第一天 cd.roll(Calendar.DATE, -1);// 日期回滚一天,也就是最后一天 MaxDate = cd.get(Calendar.DATE); if (monthOfNumber == 1) { return -MaxDate; } else { return 1 - monthOfNumber; } } public String getPreviousMonthEnd() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, -1);// 减一个月 lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天 str = sdf.format(lastDate.getTime()); return str; } public String getNextMonthFirst() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, 1);// 减一个月 lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 str = sdf.format(lastDate.getTime()); return str; } public String getNextMonthEnd() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.MONTH, 1);// 加一个月 lastDate.set(Calendar.DATE, 1);// 把日期设置为当月第一天 lastDate.roll(Calendar.DATE, -1);// 日期回滚一天,也就是本月最后一天 str = sdf.format(lastDate.getTime()); return str; } public String getNextYearEnd() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.YEAR, 1);// 加一个年 lastDate.set(Calendar.DAY_OF_YEAR, 1); lastDate.roll(Calendar.DAY_OF_YEAR, -1); str = sdf.format(lastDate.getTime()); return str; } public String getNextYearFirst() { String str = ""; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Calendar lastDate = Calendar.getInstance(); lastDate.add(Calendar.YEAR, 1);// 加一个年 lastDate.set(Calendar.DAY_OF_YEAR, 1); str = sdf.format(lastDate.getTime()); return str; } private int getMaxYear() { Calendar cd = Calendar.getInstance(); cd.set(Calendar.DAY_OF_YEAR, 1);// 把日期设为当年第一天 cd.roll(Calendar.DAY_OF_YEAR, -1);// 把日期回滚一天。 int MaxYear = cd.get(Calendar.DAY_OF_YEAR); return MaxYear; } private int getYearPlus() { Calendar cd = Calendar.getInstance(); int yearOfNumber = cd.get(Calendar.DAY_OF_YEAR);// 获得当天是一年中的第几天 cd.set(Calendar.DAY_OF_YEAR, 1);// 把日期设为当年第一天 cd.roll(Calendar.DAY_OF_YEAR, -1);// 把日期回滚一天。 int MaxYear = cd.get(Calendar.DAY_OF_YEAR); if (yearOfNumber == 1) { return -MaxYear; } else { return 1 - yearOfNumber; } } public String getCurrentYearFirst() { int yearPlus = this.getYearPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, yearPlus); Date yearDay = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preYearDay = df.format(yearDay); return preYearDay; } // 获得本年最后一天的日期 * public String getCurrentYearEnd() { Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); return years + "-12-31"; } // 获得上年第一天的日期 * public String getPreviousYearFirst() { Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); int years_value = Integer.parseInt(years); years_value--; return years_value + "-1-1"; } // 获得上年最后一天的日期 public String getPreviousYearEnd() { weeks--; int yearPlus = this.getYearPlus(); GregorianCalendar currentDate = new GregorianCalendar(); currentDate.add(GregorianCalendar.DATE, yearPlus + MaxYear * weeks + (MaxYear - 1)); Date yearDay = currentDate.getTime(); DateFormat df = DateFormat.getDateInstance(); String preYearDay = df.format(yearDay); return preYearDay; } public String getThisSeasonFirstTime(int month) { int array[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }; int season = 1; if (month >= 1 && month <= 3) { season = 1; } if (month >= 4 && month <= 6) { season = 2; } if (month >= 7 && month <= 9) { season = 3; } if (month >= 10 && month <= 12) { season = 4; } int start_month = array[season - 1][0]; int end_month = array[season - 1][2]; Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); int years_value = Integer.parseInt(years); int start_days = 1;// years+"-"+String.valueOf(start_month)+"-1";//getLastDayOfMonth(years_value,start_month); int end_days = getLastDayOfMonth(years_value, end_month); String seasonDate = years_value + "-" + start_month + "-" + start_days; return seasonDate; } public String getThisSeasonFinallyTime(int month) { int array[][] = { { 1, 2, 3 }, { 4, 5, 6 }, { 7, 8, 9 }, { 10, 11, 12 } }; int season = 1; if (month >= 1 && month <= 3) { season = 1; } if (month >= 4 && month <= 6) { season = 2; } if (month >= 7 && month <= 9) { season = 3; } if (month >= 10 && month <= 12) { season = 4; } int start_month = array[season - 1][0]; int end_month = array[season - 1][2]; Date date = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy");// 可以方便地修改日期格式 String years = dateFormat.format(date); int years_value = Integer.parseInt(years); int start_days = 1;// years+"-"+String.valueOf(start_month)+"-1";//getLastDayOfMonth(years_value,start_month); int end_days = getLastDayOfMonth(years_value, end_month); String seasonDate = years_value + "-" + end_month + "-" + end_days; return seasonDate; } private int getLastDayOfMonth(int year, int month) { if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12) { return 31; } if (month == 4 || month == 6 || month == 9 || month == 11) { return 30; } if (month == 2) { if (isLeapYear(year)) { return 29; } else { return 28; } } return 0; } public boolean isLeapYear(int year) { return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0); } public boolean isLeapYear2(int year) { return new GregorianCalendar().isLeapYear(year); } }
注意,Calendar获取的实例已经做了本地化操作,使用起来比Date方便,建议使用Calendar代替Date。
DatePicker
TimePicker
DatePickerDialog
TimePickerDialog
AnalogClock
DigitalClock
第三方控件
- Android 时间选择相关系统控件
- android选择时间控件
- android时间相关控件
- Android 双时间选择控件
- Android自定义时间控件选择开始时间到结束时间
- 自定义Android日期时间选择控件DateTimePickerDialog
- Android 滚动的时间日期选择控件
- Android常用控件--TimePickerDialog(时间选择对话框)
- Android日期时间选择控件使用详解
- Android 自定义时间滑轮选择控件
- android选择时间弹出系统框
- Android自定义时间控件不可选择未来时间
- Android常用控件(按钮、选择框、日期时间控件)
- 日期时间选择控件
- js时间选择控件
- 时间选择控件
- 时间选择控件
- 时间日期选择控件
- Java中对Redis的缓存
- K-SUM
- 欢迎使用CSDN-markdown编辑器
- 如何将windows系统硬盘内的文件移动到linux系统硬盘内?
- Ipv6+高级网络配置
- Android 时间选择相关系统控件
- 星际之门(一)【最小生成树个数】
- java8 lambda表达式
- 深入分析java web技术内幕----读书笔记(三)
- SQL注入实验
- Python 运算符重载
- Windows 安装 Docker
- 正,反向代理
- Qt:QtQuick:使用Qt静态库无法找到qml