[SNMP4J] 2 Bugs found in function: makeDateAndTime

Taoufik BEN EZZAHHAF b_taoufik at yahoo.com
Fri Dec 23 15:57:35 CET 2005


Hi everybody,

In the function makeDateAndTime (package
org.snmp4j.agent.mo.snmp) below, tws problems have
been encoutred.

  public static OctetString
makeDateAndTime(GregorianCalendar dateAndTime) {
    OctetString os = new OctetString();
   
os.append((byte)(dateAndTime.get(Calendar.YEAR)/256));
   
os.append((byte)(dateAndTime.get(Calendar.YEAR)%256));
   
os.append((byte)(dateAndTime.get(Calendar.MONTH)));
   
os.append((byte)(dateAndTime.get(Calendar.DAY_OF_MONTH)));
   
os.append((byte)(dateAndTime.get(Calendar.HOUR_OF_DAY)));
   
os.append((byte)(dateAndTime.get(Calendar.MINUTE)));
   
os.append((byte)(dateAndTime.get(Calendar.SECOND)));
   
os.append((byte)(dateAndTime.get(Calendar.MILLISECOND)/100));
    if (dateAndTime.getTimeZone() != null) {
      TimeZone tz = dateAndTime.getTimeZone();
      os.append((tz.getRawOffset()>=0) ? "+":"-");
      os.append((byte)(tz.getRawOffset()/60000));
      os.append((byte)(tz.getRawOffset()/1000));
    }
    return os;
  }

First problem:
*************
In class Calendar the months are zero-based: January
is month 0. So to append the right month to the
OctetString returned, 1 has to be added to 
dateAndTime.get(Calendar.MONTH). Which results in
doing:
    
os.append((byte)(dateAndTime.get(Calendar.MONTH) +
1));


Second problem:
**************

In function above, to get time zone offset in hours
(respectively minutes),   you do: 

    if (dateAndTime.getTimeZone() != null) {
      TimeZone tz = dateAndTime.getTimeZone();
      os.append((tz.getRawOffset()>=0) ? "+":"-");
      os.append((byte)(tz.getRawOffset()/60000));
      os.append((byte)(tz.getRawOffset()/1000));
    }

this gives erroneous results. To avoid this the right
processing must be:

    if (dateAndTime.getTimeZone() != null) {
      TimeZone tz = dateAndTime.getTimeZone();
      int offset = tz.getRawOffset();
      os.append((offset>=0) ? "+":"-");
      os.append((byte)(Math.abs(offset)/3600000));
     
os.append((byte)((Math.abs(offset)%3600000)/60000));
    }

The correct function will then be:

  public static OctetString
makeDateAndTime(GregorianCalendar dateAndTime)  
  {
    OctetString os = new OctetString();
   
os.append((byte)(dateAndTime.get(Calendar.YEAR)/256));
   
os.append((byte)(dateAndTime.get(Calendar.YEAR)%256));
    os.append((byte)(dateAndTime.get(Calendar.MONTH) +
1));
   
os.append((byte)(dateAndTime.get(Calendar.DAY_OF_MONTH)));
   
os.append((byte)(dateAndTime.get(Calendar.HOUR_OF_DAY)));
   
os.append((byte)(dateAndTime.get(Calendar.MINUTE)));
   
os.append((byte)(dateAndTime.get(Calendar.SECOND)));
   
os.append((byte)(dateAndTime.get(Calendar.MILLISECOND)/100));
    if (dateAndTime.getTimeZone() != null) {
      TimeZone tz = dateAndTime.getTimeZone();
      int offset = tz.getRawOffset();
      os.append((offset>=0) ? "+":"-");
      os.append((byte)(Math.abs(offset)/3600000));
     
os.append((byte)((Math.abs(offset)%3600000)/60000));
    }  
    return os;
  }


Hope this will help you...

Taoufik






	

	
		
___________________________________________________________________________ 
Nouveau : téléphonez moins cher avec Yahoo! Messenger ! Découvez les tarifs exceptionnels pour appeler la France et l'international.
Téléchargez sur http://fr.messenger.yahoo.com



More information about the SNMP4J mailing list