人性化合理的时间选择逻辑

最近做一个项目,有一个时间选择控件,里面的时间需要合理化设置。

比如,最多支持 今天,明天。

上班的合理时间为 0 - 11点

下班的合理时间为12 - 23 点

根据系统所处时间 AM 或者 PM ,判断 上班的话只好约到明天,因为处于PM没有办法再约上班的了。

另外顾客下单的时间应该比系统时间多出半个小时的缓冲时间。分钟只能选 00,10,20,30,40,50  这些段。

估计大家看到还是不明白,因为的确业务逻辑有点复杂的。可以参考 人人拼车 ,天天用车应用约车时的时间选择控件

逻辑代码如下,其实主要是自己做个记录:

/**
 * 计算
 * 假设 1. 系统时间精确
 *    2. 最小预约时间为标准时间+缓冲时间
 * @author lq
 *
 */
public class Duty {

	public static int INT_DUTY = 1 ;
	public static int BUFFER_TIME = 30 ;
	public static String STR_AM = "AM";
	public static String STR_PM = "PM";
	public static String STR_TODAY = "今天";
	public static String STR_TOMORROW = "明天";
	public static int INT_DUTTY_LIMIT_NOON = 12;
	public static int INT_DUTTY_LIMIT_DAWN = 24;

		public static void main(String[] args) {

		//测试

			String[] legalDay = dutyLegalDay(INT_DUTY);
			if(INT_DUTY==0){
				System.out.println("预约上班");
			}else{
				System.out.println("预约下班");
			}
			for (int i = 0; i < legalDay.length; i++) {
				System.out.println("legal day :   "+legalDay[i]);
				String[] dutyLegalHour = dutyLegalHour(INT_DUTY,legalDay[i]);
				for (int j = 0; j < dutyLegalHour.length; j++) {
					System.out.println("legal Hour :   "+dutyLegalHour[j]);
							String[] dutyLegalMinute = dutyLegalMinute(INT_DUTY, legalDay[i], dutyLegalHour[j]);
							for (int k = 0; k < dutyLegalMinute.length; k++) {
								System.out.println("legal Minute :   "+dutyLegalMinute[k]);
							}
				}
			}

		}

		/**
		 * 计算天
		 * @param interval
		 * @param curTime
		 * @param minTime
		 * @param duty   0 代表上班  1代表下班
		 */
		public static String[] dutyLegalDay(int duty){
			LinkedList<String> listDay = new LinkedList<String>();
			String[] arrayLegalDay = null ;
			int[] array = getMinHourMinute();

			if(duty==0){ //上班
				if(STR_AM.endsWith(JudgeAMPM()) && array[0] < INT_DUTTY_LIMIT_NOON) //  预约上班合理性 1. 现在时间是上午  2. 合理最小时间 应该为小时小于12 ,若是PM 则仅可以预约明天的
				{
					listDay.add(STR_TODAY+getWeek(getTodayDate()));
				}
			}else{//下班
				if(array[0] < INT_DUTTY_LIMIT_DAWN) //   合理最小时间 应该为小时小于23,时间区间是 12 - 23 ,若是PM 则仅可以预约明天的
				{
					listDay.add(STR_TODAY+getWeek(getTodayDate()));
				}
			}
			listDay.add(STR_TOMORROW+getWeek(getTomorrowDate()));
			arrayLegalDay = new String[listDay.size()] ;
			listDay.toArray(arrayLegalDay);

//			for (int i = 0; i < arrayLegalDay.length; i++) {
//				System.out.println("legal Day :   "+listDay.get(i));
//			}

			return arrayLegalDay ;
		}

		/**
		 * 计算上班合法小时
		 *
		 */
		public static String[] dutyLegalHour(int duty,String day){
			LinkedList<String> listHour = new LinkedList<String>();

			String[] arrayLegalHour = null ;
			int[] array = getMinHourMinute();

			if(duty==0){ //上班
				//传递过来  今天 or 明天
				if(day.contains(STR_TODAY) && array[0] < INT_DUTTY_LIMIT_NOON){//时间区间是 0 -11
					//合法的
				}else{
					//明天的,或者超过12的,都归为明天,
					array[0] = 0 ;
				}

				for (int i = array[0]; i <= 11; i++) {
					listHour.add(i+"");
				}
			}else{ //下班
				//传递过来  今天 or 明天
				if(day.contains(STR_TODAY) && array[0] < INT_DUTTY_LIMIT_DAWN){//时间区间是 12 -23
					if(array[0] < INT_DUTTY_LIMIT_NOON){
						array[0] = INT_DUTTY_LIMIT_NOON ;
					}
				}else{
					//明天的,或者超过23的,都归为明天,
					array[0] = INT_DUTTY_LIMIT_NOON ;
				}

				for (int i = array[0]; i <= 23; i++) {
					listHour.add(i+"");
				}
			}

			arrayLegalHour = new String[listHour.size()] ;
			listHour.toArray(arrayLegalHour);
//			for (int i = 0; i < listHour.size(); i++) {
//				System.out.println("legal Hour :   "+listHour.get(i));
//			}

			return arrayLegalHour ;

		}

		/**
		 * 计算合法的分
		 * @param minute
		 * @return
		 */
	    public static String[] dutyLegalMinute(int duty ,String day,String hour){
	    	LinkedList<String> listMinute= new LinkedList<String>();
	    	String[] arrayLegalMinute =null;
	    	int[] array = getMinHourMinute();
			if(duty==0){
				if(day.contains(STR_TODAY)){
					if(Integer.parseInt(hour) > array[0]){
						array[1] = 0 ;
					}
				}else{
					array[1] = 0 ;
				}

				for (int i = array[1]; i <= 5; i++) {
					listMinute.add(i+"0");
				}
			}else{

				if(day.contains(STR_TODAY)){
					if(Integer.parseInt(hour) > array[0]){
						array[1] = 0 ;
					}
				}else{
						array[1] = 0 ;
				}

				for (int i = array[1]; i <= 5; i++) {
					listMinute.add(i+"0");
				}
			}
			arrayLegalMinute = new String[listMinute.size()] ;
			listMinute.toArray(arrayLegalMinute);

//			for (int i = 0; i < listMinute.size(); i++) {
//				System.out.println("legal Minute :   "+listMinute.get(i));
//			}

	    	return arrayLegalMinute;
	    }

		/**
		 * 通用方法,得到最小小时 和分钟
		 * 计算合理的天、时、分 都需要用
		 * 返回结果  array[0] 最小时
		 *       array[1] 最小十分位
		 */
		public static int[] getMinHourMinute(){
			int[] array = new int[2] ;
			Date minTime =  getLegalTime(BUFFER_TIME);
			//最大值为  yyyy-MM-dd 11:20   因为 11:20 + buffer_time  = 11: 50
			int minHour = minTime.getHours();
			int minMinute = minTime.getMinutes();
			String strMinute = "";
			if(minMinute<10){
				strMinute = "0"+minMinute;
			}else{
				strMinute = ""+minMinute;
			}
			int[] arraytemp = splitDoubleDigit(strMinute);

			//array[0] 十位   array[1]个位
			if(arraytemp[1]>0){////只要个位大于0 ,都要十位进位,例如 52 要进成 60 , 31进位成 40
				arraytemp[0] =  arraytemp[0] + 1;
				 if(arraytemp[0] == 6){//是6,则小时+1 , 分钟的个位,十位归为0
					 minHour = minHour + 1 ;
					 arraytemp[0] = 0 ;
					 arraytemp[1] = 0 ;
				 }
			}
			array[0] = minHour ;
			array[1] = arraytemp[0];

			return array ;
		}

		/**
		 * 获得合法时间
		 * @param minute
		 * @return
		 */
		public static Date getLegalTime(int minute){
			 Date date = new Date();
			 Calendar c = Calendar.getInstance();
			 c.setTime(date);
			 c.add(Calendar.MINUTE, minute);
			 Date time = c.getTime();
			 return time;
		 }

		/**
		 * 判断当前是上午还是下午
		 *
		 * @return
		 */
		public static String JudgeAMPM(){
			String ret = null ;

			GregorianCalendar calendar = new GregorianCalendar();
			int val = calendar.get(GregorianCalendar.AM_PM) ;
			if(0==val){
				ret = STR_AM ;
			}else{
				ret = STR_PM ;
			}
			return ret ;
		}

		 /**
		  * 拆分两位数 例如  54  拆分为 5 , 4
		  * @param num
		  * @return
		  */
		 public static int[] splitDoubleDigit(String num){
				int[] resArray = new int[(num).length()];
				int number = Integer.parseInt(num);
				for(int i = resArray.length-1;i>=0;i--){
					resArray[i] = number%10;
					number /= 10;
				}
				/*for(int i:resArray){
					System.out.println(i);
				}*/
				return resArray;
		 }

			//根据日期取得星期几
			public static String getWeek(String date){
				    Date temp = getDateByStr2(date);
			        SimpleDateFormat sdf = new SimpleDateFormat("EEEE");
			        String week = sdf.format(temp);
			        return week;
			    } 

			/**
			 * yyyy-MM-dd 转换成date数据
			 * @param dd
			 * @return
			 */
			public static Date getDateByStr2(String dd)
			 {  

			  SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd");
			  Date date;
			  try {
			   date = sd.parse(dd);
			  } catch (ParseException e) {
			   date = null;
			   e.printStackTrace();
			  }
			  return date;
			 }

			 /**
			  * 获取今天日期
			  * @return
			  */
			 public static String getTodayDate(){
				 SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd");//设置日期格式
				 return df.format(new Date());
			 }

			 /**
			  * 获取明天日期
			  * 可以扩展
			  * @return
			  */
			 public static String getTomorrowDate(){
				 Date date=new Date();//取时间
				 Calendar calendar = new GregorianCalendar();
				 calendar.setTime(date);
				 calendar.add(calendar.DATE,1);//把日期往后增加一天.整数往后推,负数往前移动
				 date=calendar.getTime();
				 SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
				 String dateString = formatter.format(date);
				 return dateString;
			 }

}

现在系统时间为 2015-1-23 15:12 ,分别选择上班和下班。看展示结果。

上班:

预约上班
legal day :   明天星期六
legal Hour :   0
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   1
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   2
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   3
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   4
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   5
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   6
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   7
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   8
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   9
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   10
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   11
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50

预约下班:

预约下班
legal day :   今天星期五
legal Hour :   15
legal Minute :   50
legal Hour :   16
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   17
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   18
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   19
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   20
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   21
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   22
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   23
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal day :   明天星期六
legal Hour :   12
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   13
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   14
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   15
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   16
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   17
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   18
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   19
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   20
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   21
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   22
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
legal Hour :   23
legal Minute :   00
legal Minute :   10
legal Minute :   20
legal Minute :   30
legal Minute :   40
legal Minute :   50
时间: 2024-10-16 20:41:05

人性化合理的时间选择逻辑的相关文章

颠覆想象——vivo Xplay5人性化体验揭秘

3月1日,vivo在水立方发布了全新旗舰产品Xplay5,这款继Xplay3s诞生两年之后推出的全新旗舰产品,无论在配置还是在操控体验方面都带来了颠覆性的革命变化,尤其是其在最新Funtouch 2.5系统中引入的诸多人性化功能,更使得这款手机的体验变得前所未有.笔者有幸近日拿到vivo Xplay5真机,在经过数个礼拜的长时间体验之后,对其中的分屏多任务.程序双开.指纹解锁.轻触指纹拍照.智慧引擎等细节功能有了深刻印象,下面是笔者对这些细分功能进行全面体验之后的札记,以期能对欲购买Xplay5

诸葛分享:互联网产品用户运营的基本逻辑

诸葛分享:互联网产品用户运营的基本逻辑 在创业项目早期,没有钱没有名的产品,无法与有钱任性的大企业比,用钱砸钱,霸气外露,即使如此,产品早期也需要进行用户运营,一步步扎实打基础,其中的基本逻辑又是怎样的呢?一个互联网产品的用户运营,会因为其产品所处的发展阶段不同而呈现不同的特征,也需要有相应的,不同的用户运营策略. 1.早期项目运营在产品运营的早期,一般是公开测试版本以后的产品,其用户运营的核心目标是种子用户的发掘,以及种子用户的运营维系,并在最小用户规模的情况下最大限度发现和修正用户需求的变动

wpf timePicker 时间选择控件

wpf里有日期选择控件,但没有时间选择控件.其他地方也有类似的,但效果并不太好,而且复杂.所以就自己写了个.参考codeproject上的. 分两部分. 第一部分是.cs文件.也就是control控件的内部逻辑.定义相关属性,以及委托.代码如下: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows; using System.Windo

Android TV开发--实现延时关机功能(二)逻辑实现

模块功能描述(总述) 上一篇文章:Android TV开发--实现延时关机功能(一)功能描述 讲的是延时关机整体功能描述以及UI效果,这篇文章将着重讲解逻辑实现. 按照功能模块分为3部分:关机App.关机Service.Launcher 模块图如下: 关机App模块 主要功能:1.展示UI设置延时时长 2.取消延时关机 3.取消延时对话框倒计时功能 1.展示UI设置延时时长 此处即为延时关机功能入口: 1.布局及逻辑处理Activity如下,代码中含有注释: /** * 延时关机 */ publ

C# 自定义控件,日期时间选择输入插件

using System;using System.ComponentModel;using System.Drawing;using System.Reflection;using System.Windows.Forms;namespace pictureAnalyse{ /// <summary> /// 此类用于实现一个日期时间辅助输入插件,调用逻辑: /// new DateTimeChoser(textBox1); //即可为textBox1绑定一个日期时间输入控件 /// <

Django Template模板层 (下) ----------- 过滤器、人性化过滤器、模板继承、模板加载

---恢复内容开始--- 过滤器 除了模板标签可以帮助我们对数据或者进行逻辑处理.django 中还提供了一款工具叫做过滤器,过滤器也可以实现一些模板变量的运算,判断或是其他逻辑处理. add 语法: {{ var1|add:var2 }} add 过滤器可以实现 var1 与 var2 的相加,并且在遇到其他相同数据类型的,比如列表时,加号还可以重载为拼接功能 过滤器首先会将数据转换成Int类型,进行相加,如果转换失败,则会尝试使用 Python 中的数据类型 列表.元祖等这样的数据类型来进行

Django的Mov逻辑的管理特色

Django的MOV逻辑的管理特色 首先我们谈论到一个逻辑上的概念都从它的起点说起,在我看来mov的起点肯定就是Model了,那么Model有什莫特色呢 如果一个项目定义的Django那么Django就会帮我们Model对应到数据库的表上,还有其对应的字段类型也是一大特色: 其字段类型包含了 这几类: 数值型,字符型,日期型,关系型. 其中关系型是最重要也是最抽象的,下面是下面是常用的字段类型的介绍: -----------------------------------------------

机器学习—逻辑回归理论简介

下面是转载的内容,主要是介绍逻辑回归的理论知识,先总结一下自己看完的心得 简单来说线性回归就是直接将特征值和其对应的概率进行相乘得到一个结果,逻辑回归则是这样的结果上加上一个逻辑函数 这里选用的就是Sigmoid函数,在坐标尺度很大的情况下类似于阶跃函数 在确认特征对应的权重值也就是回归系数的时候 最常用的方法是最大似然法,EM参数估计,这个是在一阶导数能够有解的前提下 如果一阶导数无法求得解析值,那么一般选取梯度上升法,通过有限次的迭代过程,结合代价函数更新回归系数至收敛 //////////

Oracle 逻辑体系

Oracle 逻辑体系 主题 Oracle 逻辑体系 参考资料 Oracle 逻辑体系 表空间.模式.用户.段.区.块 Oracle中的数据逻辑上存储于表空间,物理上则存储于属于表空间tablespace的数据文件上(DBF文件).表空间的物理体现是一个或多个DBF文件.数据库由一个或多个被称为表空间的逻辑存储单元构成.表空间是数据库恢复的最小单元.表空间是个逻辑上的概念. 模式schema就是指一个用户下所有对象的集合:创建一个新用户,该用户下没有对象则schema不存在,如果创建一个对象,则