`
yidongkaifa
  • 浏览: 4062616 次
文章分类
社区版块
存档分类
最新评论

开发中遇到的关于时间的处理:设置时间范围大于当前时间小于某一天

 
阅读更多

需求:在做类似于微博的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天,则把时间调整到第十五天的时间。最终问题最终得到解决





分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics