需求:在做类似于微博的android客户端的时候,要求有个定时发微薄功能,时间设置要求:初始化时间大于当前时间两分钟,设置时间不能超过十五天。
解决过程:在网上找了一部分参考资料,发现都不能很好的解决问题,查看了时间的API也没有真正明白用法,据听说java中最让人费解的就是时间处理这块。后来在一个同事的帮助下,找到了思路。
首先:创建一个类继承OnDateChangedListenerOnTimeChangedListener
在代码中初始化时间和日期控件,这里用的是DatePicker和TimePicker
Calendar c = Calendar.getInstance();
sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00")); // 加上这行代码就哦了
oldTimeString = sdf.format(c.getTime());
//如果不初始化则不会对dataPicker进行监听
datePicker.init(datePicker.getYear(), datePicker.getMonth(), datePicker.getDayOfMonth(), this);
//设置时间大于当前时间两分钟
timePicker.setCurrentHour(c.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(c.get(Calendar.MINUTE) + 2);
onDateChanged(null, 0, 0, 0); //通知修改时间为初始化的时间
这样处理就可以实现初始化时间大于当前时间两分钟,而且实现的是24小时制的模式。
然后就是自己在页面里进行时间的设置,通过监听来实现时时的显示时间信息:
@Override
public void onDateChanged(DatePicker view, int year, int monthOfYear,
int dayOfMonth) {
System.out.println("你点击了月份");
Calendar calendar = Calendar.getInstance();
calendar.set(datePicker.getYear(), datePicker.getMonth(),
datePicker.getDayOfMonth(), timePicker.getCurrentHour(),
timePicker.getCurrentMinute());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdf.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
setTimeString = sdf.format(calendar.getTime());
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm");
sdf2.setTimeZone(TimeZone.getTimeZone("GMT+08:00"));
textView.setText( sdf2.format(calendar.getTime()) );
}
@Override
public void onTimeChanged(TimePicker view, int hourOfDay, int minute) {
onDateChanged(null, 0, 0, 0);
}
在点击确定的时候,对设置的时间进行最后的判断,主要是判断时间是否大于15天的问题。
DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Calendar c1 = Calendar.getInstance();
Calendar c2 = Calendar.getInstance();
try {
/**
* 提前两分钟
*/
setTimeDate = df.parse(setTimeString);
c1.setTime(setTimeDate);
c1.add(Calendar.MINUTE, 2);
setTimeDate = c1.getTime();
Date d2 = df.parse(oldTimeString);
/**
* 提前15天零两分钟
*/
c2.setTime(d2);
c2.add(Calendar.DAY_OF_MONTH, 15);
c2.add(Calendar.MINUTE, 2);
Date oldTimeDate = c2.getTime();
/**
* setTimeDate设置时间
* oldTimeDate当前时间 + 十五天零两分钟
* oldTimeDate - setTimeDate > 0 说明设置时间小于十五天
* = 0 说明设置时间等于15天
* < 0 说明设置时间大于15天
*/
diff = oldTimeDate.getTime() - setTimeDate.getTime() ;
} catch (Exception e) {
System.out.println("e=" + e);
}
这种加减时间的方式才是正确的,现实的时候不会出现时间错乱的问题。
通过对diff的比较大小就可以达到了时间不能超过十五天的目的。
/**
* diff属于毫秒的差值 如果小于零说明设置时间大于15天 自动把时间调整到第十五天
* 如果大于大于15 * 1000 * 24 * 60 * 60 + 2 * 60 * 1000 说明设置时间小于当前时间 则自动把时间设置到当前时间
* 这里又考虑到有两分钟的差值
*/
if (diff > 0) {
if (diff <= (15 * 1000 * 24 * 60 * 60 + 2 * 60 * 1000)) {
Intent intent = new Intent(SetTimes.this, SendMicoBlog.class);
Bundle bundle = new Bundle();
/*
* new一个Bundle对象,并将要传递的数据传入
*/
bundle.putInt("hour", timePicker.getCurrentHour());
bundle.putInt("minute", timePicker.getCurrentMinute());
bundle.putInt("year", datePicker.getYear());
bundle.putInt("month", datePicker.getMonth() + 1);
bundle.putInt("date", datePicker.getDayOfMonth());
bundle.putLong("diff", setTimeDate.getTime());
System.out.println(datePicker.getMonth() + "month");
intent.putExtras(bundle);
setResult(3, intent);
SetTimes.this.finish();
} else {
Calendar c3 = Calendar.getInstance();
datePicker.init(c3.get(Calendar.YEAR), c3.get(Calendar.MONTH), c3.get(Calendar.DAY_OF_MONTH), SetTimes.this);
timePicker.setCurrentHour(c3.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(c3.get(Calendar.MINUTE) + 2);
Toast.makeText(SetTimes.this, "设置时间应该大于零", Toast.LENGTH_SHORT).show();
}
} else {
datePicker.init(c2.get(Calendar.YEAR), c2.get(Calendar.MONTH), c2.get(Calendar.DAY_OF_MONTH), SetTimes.this);
timePicker.setCurrentHour(c2.get(Calendar.HOUR_OF_DAY));
timePicker.setCurrentMinute(c2.get(Calendar.MINUTE) - 3);
Toast.makeText(SetTimes.this, "设置时间应该小于等于15天", Toast.LENGTH_SHORT).show();
}
onDateChanged(null, 0, 0, 0);
在时间不满足的情况下,做了两个处理,第一:如果小于当前时间则把时间调整到当前时间加两分钟;第二:如果设置时间大于15天,则把时间调整到第十五天的时间。最终问题最终得到解决
分享到:
相关推荐
开始时间和结束时间的最大范围不能超过10天,开始时间不能大于结束时间并且两者都不能大于当前服务器的时间
中国房地产:房产税试点范围大于市场预期.pdf
C语言程序设计-求大于lim(lim小于100的整数)并且小于100的所有素数并放在aa数组中,该函数返回所求出素数的个数
两个数判断:小于、大于、等于程序(VB6.0源代码编写)function函数的应用
两个数判断:小于、大于、等于程序(VB6.0代码编写) 两个数判断:小于、大于、等于,function函数的应用 QQ223857666勾月
关于在输入框内输入大于号或小于号的解决方案关于在输入框内输入大于号或小于号的解决方案
里面有一个获取系统当前时间的方法,和一个获取两个时间间隔的方法
一个计算当前时间与停留时间的js,时间格式可以选择到:年月日时分秒星期, 计算时间间隔的js可以精确到毫秒
本文实例分析了javascript输入日期大于等于当前日期验证代码,分享给大家供大家参考,具体如下: [removed] $(function () { var d = new Date(); var strDate = getDateStr(d); $("#beginTime").val(strDate)...
一年级数学大于小于等于精讲PPT学习教案.pptx
报表常用的前一月、后一月、前一周、后一周。 以及(1)相应的时间处理函数 (2)判断查询日期是否大于今天 (3)判断查询日期是否大于今天 ...(8)根据某一时间节点获取指定时间差时间(年月日时分秒)
ibatis中使用安全的拼接语句,动态查询,大于、小于、等于.doc
一年级数学上册认识大于小于和等于PPT学习教案.pptx
经常在网上搜东西都搜不到,更有人上传点没用了,现在我解决了就把解决方法上传上吧.
Kettle例子——生成100个随机数,并统计小于等于50和大于50个数; Kettle例子——生成100个随机数,并统计小于等于50和大于50个数; 一起讨论一起学习,即使你的kettle版本低,也可以查看具体是怎么操作的;有gif操作...
datepicker 小于当前日期的时间为灰色不可选的操作代码
获取 是否大于当前时间 相关的交易日 (年处理)入参yyyy 查询距离当前系统时间的本周星期一、星期日的天数的日期 获取系统当前 n天后 开始时间 获取系统当前 n天后 结束时间 按照指定格式,格式化指定时间 获取当前...
新苏教小学数学一年级上册认识等于大于小于PPT学习教案.pptx
说明: 指定一个字符串值, 设置 TIME 数据类型的默认值, 该数据类型包含 HOUR, MINUTE 和 SECOND 这几个日期时间字段。 语法: TIME '09:26:50' (将值存储为 7 个字节)。 默认值: 从 NLS_TERRITORY 中获得 nls_time...
1,时间戳转换时间;... // 3)当前时间之前或者昨天 显示 : 今天 09:30 昨天 09:30 // 4)当前时间之前或者明天 显示 : 今天 09:30 明天 09:30 // 5) 今年显示 : 09月12日 // 6) 大于本年 显示 : 2013/09/09)