免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2141 | 回复: 3
打印 上一主题 下一主题

GregorianCalendar 的问题,想做个时间检查器,可是有问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2003-04-18 17:10 |只看该作者 |倒序浏览
这个时间检查器就是对事先设定的一个时间,诸如 每月的第几天,每周的第几天,
每天的第几时,每时的第几分

和现在的时间进行对比,如果相同,就返回true ,从而程序可以激发其他事件

现在的问题是,我的四个标识性GregorianCalendar ,在第一次校验后,设置后会跟随系统当前时间一起更新,我都没有复制的呀?好奇怪,难道我的程序中逻辑不对?还是GregorianCalendar 类的特殊动作行为?

请大家不吝赐教,多谢,多谢

源码如下
/*************************************
* Title:                TimeCher.java
* Description:         时间检查器
* Date:                April ,2003
* Copyright:        Copyright (c) Emate
* @version :   1.0

*************************************/


import java.util.Calendar;
import java.util.GregorianCalendar;
import java.text.SimpleDateFormat;

public class TimeChecker {       

        // 时间检查标识
        GregorianCalendar cal_mark_day=new  GregorianCalendar();
        GregorianCalendar cal_mark_week=new  GregorianCalendar();
        GregorianCalendar cal_mark_hour=new  GregorianCalendar();
        GregorianCalendar cal_mark_min=new  GregorianCalendar();
        SimpleDateFormat sdf=new SimpleDateFormat("yyyyMMddHHmmss";        //日期格式


        public  TimeChecker(){}
       
        public void setChecker(){
                /*
                cal_mark_day=new  GregorianCalendar();
                cal_mark_week=new  GregorianCalendar();
                cal_mark_hour=new  GregorianCalendar();
                cal_mark_min=new  GregorianCalendar();
                */
                cal_mark_day.set(1970,1,1);
                cal_mark_week.set(1970,1,1);
                cal_mark_hour.set(1970,1,1,0,0);
                cal_mark_min.set(1970,1,1,0,0);
                return;       
        }
        public void resetDay(){
                cal_mark_day.set(1970,1,1);       
        }
        public void resetWeek(){
                cal_mark_week.set(1970,1,1);       
        }
        public void resetHour(){
                cal_mark_hour.set(1970,1,1,0,0);       
        }
        public void resetMin(){
                cal_mark_min.set(1970,1,1,0,0);
        }

        //判断是否为同一天
        public boolean isSameDay(GregorianCalendar cal_a,GregorianCalendar cal_b){
                String str_a=sdf.format(cal_a.getTime());
                String str_b=sdf.format(cal_b.getTime());               
               
                return ((str_a.substring(0,).equals(str_b.substring(0,));
        }
        //判断是否为同一天,同一点
        public boolean isSameClock(GregorianCalendar cal_a,GregorianCalendar cal_b){
               
                String str_a=sdf.format(cal_a.getTime());
                String str_b=sdf.format(cal_b.getTime());               
                return ((str_a.substring(0,10)).equals(str_b.substring(0,10)));
        }
        //判断是否为同一天,同一点,同一分钟
        public boolean isSameMin(GregorianCalendar cal_a,GregorianCalendar cal_b){
               
                String str_a=sdf.format(cal_a.getTime());
                String str_b=sdf.format(cal_b.getTime());               
                return ((str_a.substring(0,12)).equals(str_b.substring(0,12)));
        }
        //判断现在时间是否符合备份条件
        //前四个int 变量是 实现设定需要定时处理的时间 月份序号,周数序号,点钟序号,分钟序号 ,后面是当前比较的日期型
        public  boolean ring(int sn_in_month,int sn_in_week,int sn_in_day,int sn_in_hour,GregorianCalendar cal){
               
                if ((sn_in_month==-1)&&(sn_in_week==-1)&&(sn_in_day==-1)&&(sn_in_hour==-1)) return false;

                boolean bl=false;
                boolean bl_day=false;
                boolean bl_week=false;
                boolean bl_hour=false;
                boolean bl_min=false;

                boolean change_day=false;
                boolean change_week=false;
                boolean change_hour=false;
                boolean change_min=false;

                //Date now_date=new Date();
                System.out.println("================================================================================ ";
                System.out.println("Now : "+sdf.format(cal.getTime()));
                int now_in_month = cal.get(java.util.Calendar.DAY_OF_MONTH);                //现在是当月第几天,每月
                int now_in_week = cal.get(java.util.Calendar.DAY_OF_WEEK);                        //现在是当周第几天,从星期一算起
                int now_in_day = cal.get(java.util.Calendar.HOUR_OF_DAY );                        //现在是几点
                int now_in_hour= cal.get(Calendar.MINUTE);                                                        //现在是几分

                //System.out.println("Now : "+sdf.format(cal.getTime()));
                //因为星期日为 1 ,转换数据库数据为本系统适用数据
                if (now_in_week==1){
                        now_in_week=7;
                } else {
                        now_in_week--;
                }
               
                //判断第几天,如果数据库字段为-1,表示不限定,则通过;
                //如果数据库限定了,则和当前时间的天的序号比较,如果相等,再与相应标识日期的天数序号比较,如果是相同一天,则略过,
                if (sn_in_month==-1) bl_day=true;
                else {
                        if (sn_in_month==now_in_month)
                                if  (!isSameDay(cal,cal_mark_day)) {
                                        bl_day=true;
                                        change_day=true;                                       
                                }                                       
                }               

                if (sn_in_week==-1) bl_week=true;
                else {
                        if (sn_in_week==now_in_week)  
                                if  (!isSameDay(cal,cal_mark_week)) {
                                        bl_week=true;
                                        change_week=true;                                       
                                }               
                }
                if (sn_in_day==-1) bl_hour=true;
                else {
                        if (sn_in_day==now_in_day)
                                if  (!isSameClock(cal,cal_mark_hour)) {
                                        bl_hour=true;
                                        change_hour=true;                                       
                                }                        
                }
                if (sn_in_hour==-1) bl_min=true;
                else {
                        if (sn_in_hour==now_in_hour)
                                if  (!isSameMin(cal,cal_mark_min)) {
                                        bl_min=true;
                                        change_min=true;                                       
                                }                                                               
                }
                bl = bl_day&&bl_week&&bl_hour&&bl_min;
                System.out.println(">;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;(sn_in_hour==now_in_hour) "+(sn_in_hour==now_in_hour));
                System.out.println(">;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;(isSameMin(cal,cal_mark_min))"+(isSameMin(cal,cal_mark_min)));
                System.out.println(">;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;>;(bl&&change_min)"+(bl&&change_min));
                System.out.println("cal_mark_min: "+sdf.format(cal_mark_min.getTime()));               

               

                if (bl&&change_day) cal_mark_day=cal;
                if (bl&&change_week) cal_mark_week=cal;
                if (bl&&change_hour) cal_mark_hour=cal;
                if (bl&&change_min) cal_mark_min=cal;

                return bl;
        }
        //显示当前标识时间的数值
        public  void printMark(){

                System.out.println(sdf.format(cal_mark_day.getTime()));
                System.out.println(sdf.format(cal_mark_week.getTime()));
                System.out.println(sdf.format(cal_mark_hour.getTime()));
                System.out.println(sdf.format(cal_mark_min.getTime()));
        }
}

论坛徽章:
0
2 [报告]
发表于 2003-04-19 00:20 |只看该作者

GregorianCalendar 的问题,想做个时间检查器,可是有问题

现在发现可能不是 GregorianCalendar的问题,我在另外的方法中声明TimeCheck的对象时
,第一次判断中标后(比如每小时的第几分钟符合,)其对应的标识GregorianCalendar对象,在调用ring之前就已经变为当前时间了好奇怪!!!!

诸如我在 test.java中这样声明
Date now_date=new Date();
GregorianCalendar cal_marker = new GregorianCalendar();
TimeCheck check_a=new TimeCheck();
check_a.setChecker();
while (true){
now_date=new Date();
check_a.printMark();                                 
cal_marker.setTime(now_date);
boolean test_bl=check_a.ring(int_a,int_b,int_c,int_d,cal_marker);
System.out.println(test_bl);

}
第一次print出true之后,其printMark方法检验,发现其对应中标符合的标识GregorianCalendar变量就会始终更新为当前时间。

论坛徽章:
0
3 [报告]
发表于 2003-04-19 09:41 |只看该作者

GregorianCalendar 的问题,想做个时间检查器,可是有问题

我CALL,好长啊,看的俺头都痛了啊1

论坛徽章:
0
4 [报告]
发表于 2003-04-19 09:56 |只看该作者

GregorianCalendar 的问题,想做个时间检查器,可是有问题

已解决,是自己的不对,概念错误,稍后贴改好的源码
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP